|
|
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.