Annotation of cci/d/event/arith_evt.s, revision 1.1

1.1     ! root        1: #
        !             2: #
        !             3: #      *arithmetic exception evnt test
        !             4: #      *divide by zero & integer overflow
        !             5: #      *divl2,divl3,ediv
        !             6: #      *are tested.
        !             7: #
        !             8: #      R3 = PC that failed
        !             9: #      R0 = error code
        !            10: #           1 - Expected fault did not happen
        !            11: #               R1 = current PSL
        !            12: #           2 - PSL_V bit is not set
        !            13: #               R1 = current PSL
        !            14: #           3 - Unexpected arithmetic fault
        !            15: #               R1 = error code,  R2 = actual PC on the stack
        !            16: #           4 - Wrong error code on the stack
        !            17: #               R1 = actual,  R2 = expected
        !            18: #           5 - Error in PC pushed on the stack
        !            19: #               R1 = actual,  R2 = expected
        !            20: #           6 - Error in PSL pushed on the stack
        !            21: #               R1 = actual,  R2 = expected
        !            22: #           7 - Too many parameters pushed on the stack
        !            23: #           8 - PSL_V on the stack is not reset
        !            24: #               R1 = PSL on the stack
        !            25: 
        !            26:        .globl  _arith_evt
        !            27: _arith_evt:
        !            28:        .word   0x1fff
        !            29:        mtpr    $31,$IPL                /* Set IPL to HIGH              */
        !            30:        movab   (sp),_savvec0           /* Save current SP              */
        !            31:        mtpr    _savvec0,$ISP           /* Set ISP = current SP         */
        !            32:        movl    _scb+ARITHVEC,_savvec2  /* Save arith. fault vector     */
        !            33:        movab   arthflt,_scb+ARITHVEC   /* Set new vector               */
        !            34:        movl    $-1,-(sp)               /* Push marker on stack         */
        !            35:        movab   _pcb0,r1
        !            36:        mtpr    r1,$PCBB                /* Set PCBB                     */
        !            37:        movab   (sp),_pcb0              /* Set KSP in PCB0              */
        !            38:        movab   (sp),_pcb0+4            /* Set USP in PCB0              */
        !            39: 
        !            40:        movpsl  r1                      /* If not KERNEL mode, then     */
        !            41:        bitl    $0x01000000,r1          /* force KERNEL mode            */
        !            42:        beql    1f
        !            43:        movl    _scb+PINSTVEC,_savvec3
        !            44:        movab   forckmd,_scb+PINSTVEC
        !            45:        halt                            /* HALT in USER mode to force   */
        !            46:                                        /* KERNEL mode                  */
        !            47:        .align  2
        !            48: forckmd:
        !            49:        addl2   $8,sp                   /*get rid of trash on the stack */
        !            50:        movl    _savvec3,_scb+PINSTVEC  /*restore vector                */
        !            51: #
        !            52: #      We are now running in KERNEL mode; IPL = 0x1f
        !            53: #      try to force PSW_V bit set without causing fault
        !            54: #      by dividing MAX. negative no by -1
        !            55: 1:
        !            56:        bicpsw  $0x3f                   /* Disable overflow event (PSW) */
        !            57:        movab   epc2,r3                 /* R5 = expected PC             */
        !            58:        movl    $-1,r4                  /* R4 = -1; Donot expect fault  */
        !            59:        movl    $0x80000000,r8
        !            60:        clrl    r9
        !            61: epc2:
        !            62:        divl2   $-1,r8          /* Should not get overflow exception    */
        !            63:        movpsl  r1
        !            64:        bitl    $2,r1                   /* Check if PSW_V bit is on     */
        !            65:        bneq    1f
        !            66:        movl    $2,r0                   /* Error : PSW_V not set        */
        !            67:        jmp     *badrtn
        !            68: #
        !            69: #      We are now running in KERNEL mode; IPL = 0x1f
        !            70: #      forcing arithmetic fault by dividing by 0
        !            71: #
        !            72: 1:
        !            73:        movl    $0x300,r0               /* R0 = error code              */
        !            74:        bicpsw  $0x3f                   /* Reset PSW                    */
        !            75:        bispsw  $0x20                   /* Enable Overflow fault (in PSW) */
        !            76:        movab   epc3,r5                 /* R5 = expected PC             */
        !            77:        movl    r5,r3                   /* R3 = PC that failed          */
        !            78:        movab   pc4,r6                  /* R6 = return addr from evt handler */
        !            79:        movl    $2,r4                   /* R4 = expected error code on SP */
        !            80:        movl    $0x80000000,r8          /* divide by zero exception     */
        !            81:        clrl    r9
        !            82:        movpsl  r7                      /* R7 = expected PSL            */
        !            83: 
        !            84: epc3:  divl2   $0,r8                   /* Should cause fault ..        */
        !            85:        movpsl  r1
        !            86:        movl    $1,r0                   /* Error : No fault happen      */
        !            87:        jmp     *badrtn
        !            88: #
        !            89: #      forcing arithmetic fault (int. overflow) by dividing 
        !            90: #      MAX negative no. by -1
        !            91: #
        !            92: pc4:
        !            93:        movab   epc4,r5                 /* R5 = expected PC; next inst. */
        !            94:        movab   epc40,r3                /* R3 = PC that failed          */
        !            95:        movab   pc5,r6                  /* R6 = return addr from evt handler */
        !            96:        movl    $1,r4                   /* R4 = expected code on stack  */
        !            97:        movl    $0x80000000,r8
        !            98:        clrl    r9
        !            99: epc40:
        !           100:        divl2   $-1,r8          /* Should  get overflow exception       */
        !           101: epc4:
        !           102:        movpsl  r1                      /* R7 = expected PSL            */
        !           103:        movl    $1,r0                   /* Error : No fault happen      */
        !           104:        jmp     *badrtn
        !           105: #
        !           106: #      forcing arithmetic fault (int. overflow) by dividing 
        !           107: #      MAX negative no. by 0 (using DIVL3)
        !           108: #
        !           109: pc5:
        !           110:        movl    $0x500,r0               /* R0 = error code              */
        !           111:        movab   epc5,r5                 /* R5 = expected PC             */
        !           112:        movl    r5,r3
        !           113:        movab   pc6,r6                  /* R6 = return addr from evt handler */
        !           114:        movl    $2,r4                   /* R4 = expected error code on stack */
        !           115:        movl    $0x80000000,r8
        !           116:        clrl    r9
        !           117:        movpsl  r7                      /* R7 = expected PSL            */
        !           118: epc5:  divl3   $0,r8,r9                /* Should cause fault ..        */
        !           119:        movpsl  r1
        !           120:        movl    $1,r0                   /* Error : No fault happen      */
        !           121:        jmp     *badrtn
        !           122: #
        !           123: #      forcing arithmetic fault (int. overflow) by dividing 
        !           124: #      MAX negative no. by -1 (using DIVL3)
        !           125: #
        !           126: pc6:
        !           127:        movl    $0x600,r0               /* R0 = error code              */
        !           128:        bicpsw  $0x3f                   /* Clear PSW                    */
        !           129:        bispsw  $0x20                   /* Enable overflow exception    */
        !           130:        movab   epc6,r5                 /* R5 = expected PC             */
        !           131:        movab   epc60,r3
        !           132:        movab   pc11,r6                 /* R7 = return addr from evt handler */
        !           133:        movl    $1,r4                   /* R4 = expected error code on stack */
        !           134:        movl    $0x80000000,r8
        !           135:        clrl    r9
        !           136:        movpsl  r7                      /* R7 = expected PSL            */
        !           137: epc60:
        !           138:        divl3   $-1,r8,r9               /* Should  get overflow exception */
        !           139: epc6:
        !           140:        movpsl  r1
        !           141:        movl    $1,r0                   /* Error : No fault happen      */
        !           142:        jmp     *badrtn
        !           143: #
        !           144: #      forcing arithmetic fault (int. overflow) by dividing 
        !           145: #      MAX negative no. by 0 (using EDIV)
        !           146: #
        !           147: pc11:
        !           148:        movl    $0xb00,r0               /* R0 = error code              */
        !           149:        movab   epc11,r5                /* R5 = expected PC             */
        !           150:        movl    r5,r3
        !           151:        movab   pc12,r6                 /* R6 = return addr from evt handler*/
        !           152:        movl    $2,r4                   /* R4 = expected code on stack  */
        !           153:        movl    $0x80000000,r8
        !           154:        clrl    r10
        !           155:        clrl    r9
        !           156:        movpsl  r7                      /* R7 = expected PSL            */
        !           157: epc11: ediv    $0,r8,r9,r10            /* Should cause fault ..        */
        !           158:        movpsl  r1
        !           159:        movl    $1,r0                   /* Error : No fault happen      */
        !           160:        jmp     *badrtn
        !           161: #
        !           162: #      forcing arithmetic fault (int. overflow) by dividing 
        !           163: #      MAX negative no. by -1 (using EDIV)
        !           164: #
        !           165: pc12:
        !           166:        movl    $0xc00,r0               /* R0 = error code              */
        !           167:        bispsw  $0x20                   /* Enable overflow exception    */
        !           168:        movab   epc12,r5                /* R5 = expected PC             */
        !           169:        movab   epc120,r3
        !           170:        movab   eee,r6                  /* R6 = return addr from evt handler*/
        !           171:        movl    $1,r4                   /* R4 = expected code on stack  */
        !           172:        movl    $0x80000000,r8
        !           173:        clrl    r9
        !           174:        clrl    r10
        !           175:        movpsl  r7                      /* R7 = expected PSL            */
        !           176: epc120:
        !           177:        ediv    $-1,r8,r9,r10           /* Should  get overflow exception */
        !           178: epc12:
        !           179:        movpsl  r1
        !           180:        movl    $1,r0                   /* Error : No fault happen      */
        !           181:        jmp     *badrtn
        !           182: #
        !           183: #      **********************************
        !           184: #      Event handler for arithmetic fault
        !           185: #      **********************************      
        !           186:        .align  2
        !           187: arthflt:
        !           188:        cmpl    $-1,r4          /* Is fault expected ?                  */
        !           189:        bneq    1f              /* if YES then skip to 1f               */
        !           190:        movl    $3,r0           /* Error : exception not expected       */
        !           191:        movl    (sp)+,r1        /* R1 = fault type */
        !           192:        movl    (sp),r2         /* R2 = PC on the stack */
        !           193:        jmp     *badrtn
        !           194: 1:     
        !           195:        movl    (sp)+,r1        /* Get actual error code from stack     */
        !           196:        movl    r4,r2           /* R2 = expected error code             */
        !           197:        cmpl    r1,r2
        !           198:        beql    1f
        !           199:        movl    $4,r0           /* Error : wrong error code on stack    */
        !           200:        jmp     *badrtn
        !           201: 1:
        !           202:        movl    (sp)+,r1        /* R1 = actual PC pop from stack        */
        !           203:        movl    r5,r2           /* R5 = expected PC                     */
        !           204:        cmpl    r1,r2
        !           205:        beql    1f
        !           206:        movl    $5,r0           /* Error : wrong PC on stack            */
        !           207:        jmp     *badrtn         /* R1 = actual; R2 = expected           */
        !           208: #
        !           209: 1:
        !           210:        movl    (sp)+,r1        /* R1 = actual PSL pop from stack       */
        !           211:        andl2   $0xfffffff0,r1  /* Mask out PSW flags                   */
        !           212:        andl3   $0xfffffff0,r7,r2       /* R2 = actual PSL              */
        !           213:        cmpl    r2,r1
        !           214:        beql    1f
        !           215:        movl    $6,r0           /* Error : wrong PSL on stack           */
        !           216:        jmp     *badrtn
        !           217: #
        !           218: 1:
        !           219:        cmpl    $-1,(sp)        /* SP should point at the marker        */
        !           220:        beql    1f
        !           221:        movl    $7,r0           /* Error : too many lgwords pushed on SP */
        !           222:        jmp     *badrtn
        !           223: #
        !           224: 1:
        !           225:        bitl    $2,r1           /* Check if PSL_V on stack is reset     */
        !           226:        beql    1f
        !           227:        movl    $8,r0           /* Error : PSL_V on SP is not OFF       */
        !           228:        jmp     *badrtn
        !           229: #
        !           230: 1:
        !           231:        movl    r1,-(sp)        /* Set up PSL, PC to return from fault  */
        !           232:        movl    r6,-(sp)
        !           233:        rei
        !           234:        halt                    /* Should never come here               */
        !           235: #
        !           236: #      ***************************
        !           237: #      All done; return to monitor
        !           238: #
        !           239: eee:
        !           240:        mtpr    $31,$IPL
        !           241:        movl    _savvec0,sp             /* Restore stack, vector        */
        !           242:        movl    _savvec2,_scb+ARITHVEC
        !           243:        ret
        !           244: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.