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

1.1     ! root        1: 
        !             2: 
        !             3:  #
        !             4:  #     *alignment exception event test
        !             5:  #     *word,longword, & quadword alignment are checked
        !             6:  #
        !             7:  #     R5 = PC that failed
        !             8:  #     R0 = error code
        !             9:  #          1 : Expected alignment fault didnot happen
        !            10:  #          2 : Error in PC pushed on the stack
        !            11:  #              R1 = actual,  R2 = expected
        !            12:  #          3 : Error in PSL pushed on the stack
        !            13:  #              R1 = actual,  R2 = expected
        !            14:  #          4 : Too many parameters pushed on the stack
        !            15:  #
        !            16: 
        !            17: 
        !            18:        .globl  _align_evt
        !            19: _align_evt:
        !            20:        .word   0x1ff
        !            21:        mtpr    $31,$IPL                /* Set IPL to HIGH              */
        !            22:        movab   (sp),_savvec0           /* Save current SP              */
        !            23:        mtpr    _savvec0,$ISP           /* Set ISP                      */
        !            24:        movl    _scb+ALIGNVEC,_savvec2  /* Save alignment fault vector  */
        !            25:        movab   vecvec,_scb+ALIGNVEC    /* Set new vector               */
        !            26:        movl    $-1,-(sp)               /* Push marker on stack         */
        !            27:        movab   _pcb0,r1                /* Partially set PCB0           */
        !            28:        mtpr    r1,$PCBB                /* Set PCBB to PCB0             */
        !            29:        movab   (sp),_pcb0              /* PCB_KSP = current SP         */
        !            30:        movab   (sp),_pcb0+4            /* PCB_USP = current SP         */
        !            31: 
        !            32:        movpsl  r1                      /* If not kernel mode, then force */
        !            33:        bitl    $0x01000000,r1          /* Kernel mode                  */
        !            34:        beql    1f
        !            35:        movl    _scb+PINSTVEC,_savvec3
        !            36:        movab   forckmd,_scb+PINSTVEC
        !            37:        halt                            /* Halt in user mode to force fault */
        !            38:        .align  2
        !            39: forckmd:
        !            40:        movab   (sp)+,tmp0      /*get rid of trash on the stack */
        !            41:        movab   (sp)+,tmp0
        !            42:        movl    _savvec3,_scb+PINSTVEC  /*restore vector                */
        !            43: #
        !            44: #      We now in KERNEL MODE; IPL = 0x1f
        !            45: #      Try to store a word in an ODD address
        !            46: 1:
        !            47:        movab   epc1,r5                 /* R5 = expected PC on stack    */
        !            48:        movab   spc2,r6                 /* R6 = return from exception addr */
        !            49:        movpsl  r7                      /* R7 = Expected PSL to to checked */
        !            50: epc1:  movw    $256,dtable+1           /* Should cause fault           */
        !            51:        movl    $1,r0           /* Error : NO fault happen              */
        !            52:        jmp     *badrtn
        !            53: #
        !            54: #      We now in KERNEL MODE; IPL = 0x1f
        !            55: #      Try to store a word in an ODD address
        !            56: spc2:
        !            57:        movab   epc2,r5                 /* R5 = expected PC on stack    */
        !            58:        movab   spc3,r6                 /* R6 = return from exception addr */
        !            59:        movpsl  r7                      /* R7 = Expected PSL to to checked */
        !            60: epc2:  movw    $256,dtable+3           /* Should cause fault           */
        !            61:        movl    $1,r0           /* Error : NO fault happen              */
        !            62:        jmp     *badrtn
        !            63: #
        !            64: #      We now in KERNEL MODE; IPL = 0x1f
        !            65: #      Try to store a longword in an ODD address
        !            66: spc3:
        !            67:        movab   epc3,r5                 /* R5 = expected PC on stack    */
        !            68:        movab   spc4,r6                 /* R6 = return from exception addr */
        !            69:        movpsl  r7                      /* R7 = Expected PSL to to checked */
        !            70: epc3:  movl    $666666,dtable+1        /* Should cause fault           */
        !            71:        movl    $1,r0
        !            72:        jmp     *badrtn
        !            73: #
        !            74: #      We now in KERNEL MODE; IPL = 0x1f
        !            75: #      Try to store a longword in an ODD address
        !            76: spc4:
        !            77:        movab   epc4,r5                 /* R5 = expected PC on stack    */
        !            78:        movab   spc5,r6                 /* R6 = return from exception addr */
        !            79:        movpsl  r7                      /* R7 = Expected PSL to to checked */
        !            80: epc4:  movl    $666666,dtable+2        /* Should cause fault           */
        !            81:        movl    $1,r0           /* Error : NO fault happen              */
        !            82:        jmp     *badrtn
        !            83: #
        !            84: #      We now in KERNEL MODE; IPL = 0x1f
        !            85: #      Try to store a longword in an ODD address
        !            86: spc5:
        !            87:        movab   epc5,r5                 /* R5 = expected PC on stack    */
        !            88:        movab   spc6,r6                 /* R6 = return from exception addr */
        !            89:        movpsl  r1                      /* R7 = Expected PSL to to checked */
        !            90: epc5:  movl    $666666,dtable+3        /* Should cause fault           */
        !            91:        movl    $1,r0           /* Error : NO fault happen              */
        !            92:        jmp     *badrtn
        !            93: #
        !            94: #      We now in KERNEL MODE; IPL = 0x1f
        !            95: #      Try to shift a quadword into an ODD address
        !            96: spc6:
        !            97:        movab   epc6,r5                 /* R5 = expected PC on stack    */
        !            98:        movab   spc7,r6                 /* R6 = return from exception addr */
        !            99:        movpsl  r7                      /* R7 = Expected PSL to to checked */
        !           100: epc6:  shrq    $6,dtable+1,r0          /* Should cause fault           */
        !           101:        movl    $1,r0           /* Error : NO fault happen              */
        !           102:        jmp     *badrtn
        !           103: #
        !           104: #      We now in KERNEL MODE; IPL = 0x1f
        !           105: #      Try to shift a quadword into an ODD address
        !           106: spc7:
        !           107:        movab   epc7,r5                 /* R5 = expected PC on stack    */
        !           108:        movab   spc8,r6                 /* R6 = return from exception addr */
        !           109:        movpsl  r7                      /* R7 = Expected PSL to to checked */
        !           110: epc7:  shrq    $6,dtable+2,r0          /* Should cause fault           */
        !           111:        movl    $1,r0           /* Error : NO fault happen              */
        !           112:        jmp     *badrtn
        !           113: #
        !           114: #      We now in KERNEL MODE; IPL = 0x1f
        !           115: #      Try to shift a quadword into an ODD address
        !           116: spc8:
        !           117:        movab   epc8,r5                 /* R5 = expected PC on stack    */
        !           118:        movab   eee,r6                  /* R6 = return from exception addr */
        !           119:        movpsl  r7                      /* R7 = Expected PSL to to checked */
        !           120: epc8:  shrq    $6,dtable+3,r0          /* Should cause fault   */
        !           121:        movl    $1,r0           /* Error : NO fault happen              */
        !           122:        jmp     *badrtn
        !           123: #
        !           124: #
        !           125: #      Event handler for Data alignment fault
        !           126: #
        !           127:        .align  2
        !           128: vecvec:
        !           129:        movl    (sp)+,r1        /* R1 = actual PC pop from stack        */
        !           130:        movl    r5,r2           /* R5 = expected PC                     */
        !           131:        cmpl    r1,r2
        !           132:        beql    1f
        !           133:        movl    $2,r0           /* Error : Wrong PC on stack            */
        !           134:        jmp     *badrtn         /* R1 = actual; R2 = expected           */
        !           135: 
        !           136: 1:     movl    (sp)+,r1        /* R1 = actual PSL pop from stack       */
        !           137:        movl    r7,r2           /* R2 = expected PSL                    */
        !           138:        cmpl    r2,r1
        !           139:        beql    1f
        !           140:        movl    $3,r0           /* Error : wrong PSL on stack           */
        !           141:        jmp     *badrtn         /* R1 = actual; R2 = expected           */
        !           142: 
        !           143: 1:     cmpl    $-1,(sp)        /* Check if SP now point to marker      */
        !           144:        beql    1f
        !           145:        movl    $4,r0           /* Error : too many things push on SP  */
        !           146:        jmp     *badrtn
        !           147: 
        !           148: 1:     movl    r1,-(sp)        /* Set PSL & PC on the stack for return */
        !           149:        movl    r6,-(sp)        /* r6 contain return address            */
        !           150:        rei
        !           151:        jmp     *badrtn         /* Should never come here               */
        !           152: #
        !           153: #      All done; get ready to return to monitor
        !           154: #
        !           155: eee:
        !           156:        mtpr    $31,$IPL
        !           157:        movl    _savvec0,sp     /* Restore original vector              */
        !           158:        movl    _savvec2,_scb+ALIGNVEC
        !           159:        ret
        !           160: #
        !           161: #
        !           162:        .align  2
        !           163: tmp0:  .long   0
        !           164: dtable:        .byte   0x12
        !           165:        .byte   0x34
        !           166:        .byte   0x56
        !           167:        .byte   0x78
        !           168:        .byte   0x9a
        !           169:        .byte   0xbc
        !           170:        .byte   0xde
        !           171:        .byte   0xf0
        !           172:        .byte   0x12
        !           173:        .byte   0x34
        !           174:        .byte   0x56
        !           175:        .byte   0x78
        !           176:        .byte   0x9a
        !           177:        .byte   0xbc
        !           178:        .byte   0xde
        !           179:        .byte   0xf0
        !           180: 

unix.superglobalmegacorp.com

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