|
|
1.1 root 1: .text
2:
3: #
4: # badaddr(addr, len)
5: # see if access addr with a len type instruction causes a machine check
6: # len is length of access (1=byte, 2=short, 4=long)
7: #
8: .globl _badaddr
9: _badaddr:
10: .word 0
11: movl $1,r0
12: mfpr $IPL,r1
13: mtpr $0x16,$IPL # low enough for very urgent interrupts
14: movl 4(ap),r3
15: movl 8(ap),r4
16: movl _nofault,r2
17: movab 2f,_nofault
18: bbc $0,r4,1f; tstb (r3)
19: 1: bbc $1,r4,1f; tstw (r3)
20: 1: bbc $2,r4,1f; tstl (r3)
21: 1:
22: movl $10,r3
23: 0: sobgtr r3,0b # pause to allow error interrupt
24: clrl r0 # made it w/o machine checks
25: 2: movl r2,_nofault
26: mtpr r1,$IPL
27: ret
28:
29: #
30: # Check address.
31: # Given virtual address, byte count, and rw flag
32: # returns 0 on no access.
33: #
34: _useracc: .globl _useracc
35: .word 0x0
36: movl 4(ap),r0 # get va
37: movl 8(ap),r1 # count
38: tstl 12(ap) # test for read access ?
39: bneq userar # yes
40: cmpl $NBPG,r1 # can we do it in one probe ?
41: bgeq uaw2 # yes
42: uaw1:
43: probew $3,$NBPG,(r0)
44: beql uaerr # no access
45: addl2 $NBPG,r0
46: acbl $NBPG+1,$-NBPG,r1,uaw1
47: uaw2:
48: probew $3,r1,(r0)
49: beql uaerr
50: movl $1,r0
51: ret
52:
53: userar:
54: cmpl $NBPG,r1
55: bgeq uar2
56: uar1:
57: prober $3,$NBPG,(r0)
58: beql uaerr
59: addl2 $NBPG,r0
60: acbl $NBPG+1,$-NBPG,r1,uar1
61: uar2:
62: prober $3,r1,(r0)
63: beql uaerr
64: movl $1,r0
65: ret
66: uaerr:
67: clrl r0
68: ret
69:
70: #
71: # kernacc - check for kernel access privileges
72: #
73: # We can't use the probe instruction directly because
74: # it ors together current and previous mode.
75: #
76: .globl _kernacc
77: _kernacc:
78: .word 0x0
79: movl 4(ap),r0 # virtual address
80: bbcc $31,r0,kacc1
81: bbs $30,r0,kacerr
82: mfpr $SBR,r2 # address and length of page table (system)
83: bbss $31,r2,0f; 0:
84: mfpr $SLR,r3
85: brb kacc2
86: kacc1:
87: bbsc $30,r0,kacc3
88: mfpr $P0BR,r2 # user P0
89: mfpr $P0LR,r3
90: brb kacc2
91: kacc3:
92: mfpr $P1BR,r2 # user P1 (stack)
93: mfpr $P1LR,r3
94: kacc2:
95: addl3 8(ap),r0,r1 # ending virtual address
96: addl2 $NBPG-1,r1
97: ashl $-PGSHIFT,r0,r0
98: ashl $-PGSHIFT,r1,r1
99: bbs $31,4(ap),kacc6
100: bbc $30,4(ap),kacc6
101: cmpl r0,r3 # user stack
102: blss kacerr # address too low
103: brb kacc4
104: kacc6:
105: cmpl r1,r3 # compare last page to P0LR or SLR
106: bgtr kacerr # address too high
107: kacc4:
108: movl (r2)[r0],r3
109: bbc $31,4(ap),kacc4a
110: bbc $31,r3,kacerr # valid bit is off
111: kacc4a:
112: cmpzv $27,$4,r3,$1 # check protection code
113: bleq kacerr # no access allowed
114: tstb 12(ap)
115: bneq kacc5 # only check read access
116: cmpzv $27,$2,r3,$3 # check low 2 bits of prot code
117: beql kacerr # no write access
118: kacc5:
119: aoblss r1,r0,kacc4 # next page
120: movl $1,r0 # no errors
121: ret
122: kacerr:
123: clrl r0 # error
124: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.