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

1.1     ! root        1: 
        !             2:  #
        !             3:  #     Break point instruction event test
        !             4:  #
        !             5:  #     R0 = error code
        !             6:  #          1 - Break point instruction did not generate exception
        !             7:  #              R1 : address of break point instruction 
        !             8:  #          2 - Error in PC pushed on the stack
        !             9:  #              R1 : actual PC; R2 = expected PC 
        !            10:  #          3 - PSL is not pushed on the stack
        !            11:  #          4 - Too many parameters pushed on the stack
        !            12: 
        !            13:        .globl  _bpt_evt
        !            14: _bpt_evt:
        !            15:        .word   0x1fff
        !            16:        mtpr    $31,$IPL
        !            17:        movab   (sp),_savvec0           /* Save sp                      */
        !            18:        mtpr    _savvec0,$ISP
        !            19:        movl    _scb+BPTVEC,_savvec2    /* Save vector of Break point   */
        !            20:        movab   vecvec7,_scb+BPTVEC     /* Set new vector               */
        !            21:        movl    $-1,-(sp)               /* Set marker on SP to be checked */
        !            22:                                        /*  after taken exception       */
        !            23:        movab   _pcb0,r1                /* Partially set PCB0           */
        !            24:        mtpr    r1,$PCBB
        !            25:        movab   (sp),_pcb0              /*ksp in pcb0                   */
        !            26:        movab   (sp),_pcb0+4            /*usp in pcb0                   */
        !            27: 
        !            28:        movpsl  r1                      /*if not kernel mode, then force*/
        !            29:        bitl    $0x01000000,r1          /*kernel mode                   */
        !            30:        beql    1f
        !            31:        movl    _scb+PINSTVEC,_savvec3
        !            32:        movab   forckmd,_scb+PINSTVEC
        !            33:        halt                            /*halt in USER mode to force    */
        !            34:                                        /*K mode in psl                 */
        !            35:        .align  2
        !            36: forckmd:
        !            37:        addl2   $8,sp                   /*get rid of trash on the stack */
        !            38:        movl    _savvec3,_scb+PINSTVEC  /*restore vector                */
        !            39: 
        !            40: 1:     movab   eee,r6          /* R6 = return address from event handler*/
        !            41:        movab   epc1,r5         /* R5 = expected PC after taken break   */
        !            42: epc1:  bpt                     /* break point exception                */
        !            43:        movl    $1,r0
        !            44:        movl    r5,r1
        !            45:        jmp     *badrtn         /* Error- BPT did not generate exception*/
        !            46: 
        !            47:        .align  2               /* Break point exception handler        */
        !            48: vecvec7:
        !            49:        movl    (sp)+,r1        /*pop pc                                */
        !            50:        movl    r5,r2           /*r5 = expected pc                      */
        !            51:        cmpl    r1,r2
        !            52:        beql    1f
        !            53:        movl    $2,r0           /*pc saved on stack not equal to exp    */
        !            54:        jmp     *badrtn
        !            55: 
        !            56: 1:
        !            57:        movl    (sp)+,r1        /*pop psl                               */
        !            58:        cmpl    $-1,r1          /*if -1, then it is not psl             */
        !            59:        bneq    1f
        !            60:        movl    $3,r0
        !            61:        jmp     *badrtn         /* error - psl not saved on the stack   */
        !            62: 1:
        !            63:        cmpl    $-1,(sp)        /*sp now should be pointing at the marker*/
        !            64:        beql    1f
        !            65:        movl    $4,r0
        !            66:        jmp     *badrtn         /*too many longwords pushed on the stack */
        !            67: 1:
        !            68:        movl    r1,-(sp)
        !            69:        movl    r6,-(sp)        /*r6 must have been loaded previously   */
        !            70:        rei
        !            71:        halt                    /*should never come here                */
        !            72: 
        !            73: /*     Restore original state of SP, PSL & vectors     */
        !            74: eee:
        !            75:        mtpr    $31,$IPL
        !            76:        movl    _savvec0,sp
        !            77:        movl    _savvec2,_scb+BPTVEC
        !            78:        ret
        !            79: 

unix.superglobalmegacorp.com

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