| 1 | #\f |
| 2 | # Copyright (c) 1979 Regents of the University of California |
| 3 | # |
| 4 | # char sccsid[] = "@(#)34err.s 4.1 10/10/80"; |
| 5 | # |
| 6 | .set EARGV ,1 |
| 7 | .set EASRT ,2 |
| 8 | .set EASSIGN ,3 |
| 9 | .set EBADFNUM ,4 |
| 10 | .set EBADINUM ,5 |
| 11 | .set EBADOP ,6 |
| 12 | .set EBUILTIN ,7 |
| 13 | .set ECASE ,8 |
| 14 | .set ECHR ,9 |
| 15 | .set ECLOSE,10 |
| 16 | .set ECREATE,11 |
| 17 | .set EFIXADD,13 |
| 18 | .set EFIXDIV,14 |
| 19 | .set EFIXMUL,15 |
| 20 | .set EFIXNEG,16 |
| 21 | .set EFIXSUB,17 |
| 22 | .set EFLTADD,18 |
| 23 | .set EFLTDIV,19 |
| 24 | .set EFLTMUL,20 |
| 25 | .set EFLTSUB,21 |
| 26 | .set EFMTSIZE,22 |
| 27 | .set EGOTO,23 |
| 28 | .set EHALT,24 |
| 29 | .set EINTR,25 |
| 30 | .set ELLIMIT,26 |
| 31 | .set ELN,27 |
| 32 | .set EMODDIV,28 |
| 33 | .set ENAMESIZE,29 |
| 34 | .set ENAMRNG,30 |
| 35 | .set ENILPTR,31 |
| 36 | .set ENUMNTFD,32 |
| 37 | .set EOPEN,33 |
| 38 | .set EOUTOFMEM,34 |
| 39 | .set EPACK,35 |
| 40 | .set EPASTEOF,36 |
| 41 | .set ERANGE,37 |
| 42 | .set EREADIT,38 |
| 43 | .set EREFINAF,39 |
| 44 | .set EREMOVE,40 |
| 45 | .set ESEEK,41 |
| 46 | .set ESQRT,42 |
| 47 | .set ESTKNEMP,43 |
| 48 | .set ESTKOVFLO,44 |
| 49 | .set ESTLIM,45 |
| 50 | .set ESUBSCR,46 |
| 51 | .set ESYSTEM,47 |
| 52 | .set ETRASHHEAP,48 |
| 53 | .set EUNPACK,49 |
| 54 | .set EWRITE,50 |
| 55 | .set EWRITEIT,51 |
| 56 | .set ECTLWR,12 |
| 57 | .set ECTUPR,52 |
| 58 | .set ECTSNG,53 |
| 59 | .set ENARGS,54 |
| 60 | # |
| 61 | # Fielding interrupts and processing errors |
| 62 | # |
| 63 | # Process interpreter detected errors |
| 64 | # |
| 65 | error: |
| 66 | movzwl _perrno,-(sp) |
| 67 | calls $1,_error |
| 68 | jmp (r8) |
| 69 | |
| 70 | _endinterpret: |
| 71 | .byte 'e,'n,'d, 0 |
| 72 | |
| 73 | # |
| 74 | # Keyboard interrupts |
| 75 | # |
| 76 | .align 1 |
| 77 | .globl _intr |
| 78 | _intr: |
| 79 | .word 0 |
| 80 | pushal _intr #reset interrupt signal |
| 81 | pushl $SIGINT |
| 82 | calls $2,_signal |
| 83 | pushl $EINTR |
| 84 | calls $1,_error |
| 85 | ret |
| 86 | # |
| 87 | # Segmentation Violations => No more memory available for the stack |
| 88 | # |
| 89 | .align 1 |
| 90 | .globl _memsize |
| 91 | _memsize: |
| 92 | .word 0 |
| 93 | pushl $ESTKOVFLO |
| 94 | calls $1,_error |
| 95 | ret |
| 96 | # |
| 97 | # Die gracefully on unexpected signals |
| 98 | # |
| 99 | .align 1 |
| 100 | .globl _syserr |
| 101 | _syserr: |
| 102 | .word 0 |
| 103 | pushl $ESYSTEM |
| 104 | calls $1,_error |
| 105 | ret |
| 106 | # |
| 107 | # Process computational errors |
| 108 | # |
| 109 | .align 1 |
| 110 | .globl _except |
| 111 | _except: |
| 112 | .word 0 |
| 113 | pushal _except #reset signal |
| 114 | pushl $SIGFPE |
| 115 | calls $2,_signal |
| 116 | movl 16(ap),r0 #r0 has PC at point following error |
| 117 | moval errtbl-4,r1 #r1 points to error offset table |
| 118 | l3404: |
| 119 | addl2 $4,r1 #determine cause of error |
| 120 | cmpl r0,(r1)+ |
| 121 | blssu l3405 #not in table => system error |
| 122 | cmpl r0,(r1)+ |
| 123 | bgtru l3404 |
| 124 | movzwl (r1),-(sp) #select error message |
| 125 | brb l3406 |
| 126 | l3405: |
| 127 | pushl $ESYSTEM |
| 128 | l3406: |
| 129 | calls $1,_error |
| 130 | ret |
| 131 | # |
| 132 | # Table of offsets and their associated errors |
| 133 | # |
| 134 | .align 1 |
| 135 | errtbl: |
| 136 | .long _AS2, _OFF, EASSIGN |
| 137 | .long _ADD2, _ADD28, EFIXADD |
| 138 | .long _ADD28, _SUB2, EFLTADD |
| 139 | .long _SUB2, _SUB28, EFIXSUB |
| 140 | .long _SUB28, _MUL2, EFLTSUB |
| 141 | .long _MUL2, _MUL28, EFIXMUL |
| 142 | .long _MUL28, _DIV2, EFLTMUL |
| 143 | .long _DIV2, _MOD2, EFIXDIV |
| 144 | .long _MOD2, _ABS2, EMODDIV |
| 145 | .long _ABS2, _ABS8, EFIXNEG |
| 146 | .long _DVD2, _IND1, EFLTDIV |
| 147 | .long _STOI, _UNDEF, EBUILTIN |
| 148 | .long 0xffffffff |
| 149 | # |
| 150 | # recover values of dp and lino from the stack |
| 151 | # |
| 152 | .globl _fetchdp |
| 153 | |
| 154 | _fetchdp: |
| 155 | .word R2|R3|R4|R5|R6|R7|R8|R9|R10|R11 |
| 156 | pushl fp #sift through the stack to get the |
| 157 | movl sp,oldsp # values of dp and lino |
| 158 | l3401: |
| 159 | bicw3 $0xf000,MASK(fp),mask #register save mask |
| 160 | moval REGS(fp),sp #point to saved registers |
| 161 | popr mask #pop them |
| 162 | cmpl PC(fp),$_interpret #check for interpreter frame |
| 163 | blss l3402 #not found |
| 164 | cmpl PC(fp),$_endinterpret #check for end of interpreter |
| 165 | blss l3403 #found |
| 166 | l3402: |
| 167 | movl FP(fp),fp #get next frames registers |
| 168 | jbr l3401 |
| 169 | l3403: |
| 170 | movl oldsp,sp #restore current frame |
| 171 | movl (sp)+,fp |
| 172 | movl r9,*4(ap) #return dp |
| 173 | movl r11,*8(ap) #return lino |
| 174 | ret |
| 175 | .data |
| 176 | oldsp: .space 4 #old value of sp |
| 177 | mask: .space 2 #register pop mask |
| 178 | .text |