|
|
1.1 root 1:
2: #include "definitions"
3:
4: extern long r_no, pt_base, ctlblk;
5: long dummy;
6:
7: /* To get value of base registers */
8: mfpr(sr)
9: long sr;
10: {
11: asm("mfpr 4(fp),_dummy");
12: return(dummy);
13: }
14:
15: /* This routine modify the valid,protection bits (bit 27-31) of PTE
16: in any Page table. Input parameter :
17: reg_no : contain a number specify one of the following :
18: SBR,SLR,P0BR,P0LR,P1BR,P1LR,P2BR,P2LR
19: old_pte : pointer to location to save original PTE
20: (This could be used to read any PTE when pvbits_msk = 0)
21: which1 : PTE no; 0,1,2...X
22: pvbits_msk : bit 27-31 of PTE
23: */
24: fixpv_pte(reg_no,which1,old_pte,pvbits_msk)
25: long reg_no, *old_pte, which1, pvbits_msk;
26: {
27: long *st_base;
28:
29: r_no = reg_no;
30:
31: /* asm("mfpr _r_no,_pt_base"); */ /* Get base address */
32: pt_base = mfpr(r_no);
33:
34: st_base = (long *)pt_base;
35: st_base += which1;
36: *old_pte = *st_base; /* Save original PTE */
37: /* Mask access and valid bits off */
38: *st_base = (*st_base) & (~(PTE_PROT | PTE_V));
39: *st_base = (*st_base)|(pvbits_msk); /* Set V,protection bits */
40: asm("mtpr $0,$TBIA"); /* Invalidate translation buffers */
41: }
42:
43: /* This routine modify the modify,used,uncachable bits (22-24) of PTE
44: in any Page table. Input parameter :
45: reg_no : contain a number specify one of the following :
46: SBR,SLR,P0BR,P0LR,P1BR,P1LR,P2BR,P2LR
47: old_pte : pointer to location to save original PTE
48: (This could be used to read any PTE when pvbits_msk = 0)
49: which1 : PTE no; 0,1,2...X
50: pvbits_msk : bits 22-24 of PTE; if mask < 0 then just read back PTE.
51: */
52: fixmuc_pte(reg_no,which1,old_pte,pvbits_msk)
53: long reg_no, *old_pte, which1, pvbits_msk;
54: {
55: long *st_base;
56:
57: r_no = reg_no;
58:
59: /* asm("mfpr _r_no,_pt_base"); */ /* Get base address */
60: pt_base = mfpr(r_no);
61:
62: st_base = (long *)pt_base;
63: st_base += which1;
64: *old_pte = *st_base; /* Save original PTE */
65: if (pvbits_msk < 0) return;
66: *st_base=(*st_base)&(~(PTE_UC|PTE_M|PTE_U)); /* Mask NC,M,U bit off */
67: *st_base = (*st_base)|(pvbits_msk);
68: asm("mtpr $0,$TBIA"); /* Invalidate translation buffers */
69: }
70:
71: /* This routine modify the page frame number (bit 0-21) of PTE
72: in any Page table. Input parameter :
73: reg_no : contain a number specify one of the following :
74: SBR,SLR,P0BR,P0LR,P1BR,P1LR,P2BR,P2LR
75: old_pte : pointer to location to save original PTE
76: (This could be used to read any PTE when pvbits_msk = 0)
77: which1 : PTE no; 0,1,2...X
78: pfn : New page frame no. (bit 0 thru 19 of pfn )
79: */
80: fixpfn_pte(reg_no,which1,old_pte,pfn)
81: long reg_no, *old_pte, which1, pfn;
82: {
83: long *st_base;
84:
85: r_no = reg_no;
86:
87: /* asm("mfpr _r_no,_pt_base"); */ /* Get base address */
88: pt_base = mfpr(r_no);
89:
90: st_base = (long *)pt_base;
91: st_base += which1;
92: *old_pte = *st_base; /* Save original PTE */
93: *st_base = (*st_base)&(~PTE_PFN); /* Mask PFN off */
94: *st_base = (*st_base)|(pfn & PTE_PFN); /* Set new PFN */
95: *st_base = (*st_base)&0xff7fffff; /* Set PTE_M bit off */
96: asm("mtpr $0,$TBIA"); /* Invalidate translation buffers */
97: asm("mtpr $0,$PADC"); /* Purge all data cache */
98: }
99:
100: /* This routine saved a vector in SCB and set it to a new one
101: input parameters :
102: which1 : Vector no; 0,1,2,..X
103: saved_vec : pointer to a location to saved original vector
104: new_vec : address of new handler
105: stack : 'K' or 'k' : service on Kernel stack
106: otherwise : service on Interrupt stack
107: */
108:
109:
110: set_handler(which1,saved_vec,new_vec)
111: long which1, *saved_vec, new_vec;
112: { long *st_base;
113:
114: asm("movab _scb,_ctlblk");
115: st_base = (long *)ctlblk; /* address of SCB is at page 2 */
116: st_base += which1;
117: *saved_vec = *st_base; /* Save original vector */
118: *st_base = new_vec;
119: }
120:
121:
122: /* This routine write the who page of memory with "value"
123: Inpur parameters :
124: space : Has 1 of these values (0,1,2,3) correspond to
125: P0, P1, P2, System space respectively.
126: page_no : Virtual page no. to be written
127: value : Value to be written
128: v_type : | 0 : value is used to write in all locations.
129: | 1 : value is the start value and is incremented
130: | for next locations.
131: */
132:
133: write_pg(space,page_no,value,v_type)
134: long space, page_no, value, v_type;
135: {
136: long *lptr;
137: int ix;
138:
139: lptr = (long *)(((space & 0x3)<<30)|((page_no & 0xfffff)<<PGSHIFT));
140: for (ix=0;ix<NBPG;ix += 4)
141: {
142: *lptr++ = value;
143: if (v_type) value += 4;
144: }
145: }
146:
147: /* This routine read the who page of memory .
148: Inpur parameters :
149: space : Has 1 of these values (0,1,2,3) correspond to
150: P0, P1, P2, System space respectively.
151: page_no : Virtual page no. to be read.
152: start_dst : pointer to array of longwords.
153: */
154:
155: read_pg(space,page_no,start_dst)
156: long space, page_no, *start_dst;
157: {
158: long *lptr;
159: int ix;
160:
161: lptr = (long *)(((space & 0x3)<<30)|((page_no & 0xfffff)<<PGSHIFT));
162: for (ix=0;ix<NBPG;ix += 4)
163: *start_dst++ = *lptr++ ;
164: }
165:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.