Annotation of cci/d/event/vtrans_evt.s, revision 1.1.1.1

1.1       root        1: 
                      2: #
                      3: #      Demand paging fault with read modify instruction 
                      4: #
                      5: #      R10 = PC of instruction used to force fault
                      6: #      R0  = error code
                      7: #           1 - Expected translation fault did not happen
                      8: #               R2 = Virtual address that should cause fault
                      9: #           2 - Destination operand is modified after even fault is genearted
                     10: #               R1 = actual,  R2 = expected
                     11: #           3 - Too many parameters pushed on the stack
                     12: #               R1 = actual SP,  R2 = expected SP
                     13: #           4 - Fault virtual address pushed on the stack is not correct
                     14: #               R1 = actual,  R2 = expected
                     15: #           5 - PC pushed on the stack is not correct
                     16: #               R1 = actual,  R2 = expected
                     17: #           6 - PSL pushed on the stack is not correct
                     18: #               R1 = actual,  R2 = expected
                     19: #
                     20:        .globl  _trans_evt              
                     21: _trans_evt:
                     22:        .word   0x1fff                  
                     23: 
                     24:        mtpr    $1,$TBIA                /* Purge Translation buffer */
                     25:        clrl    lpcnt
                     26:        movl    $TRANS,r0               /* R0 = vector no of transl. fault */
                     27:        movl    _scb[r0],_savvec0       /* Save original trans. fault handler */
                     28:        movab   _Trans,_scb[r0]         /* Set new trans. fault handler */      
                     29:        mtpr    $512,$DCR               /* Disable translation buffer */ 
                     30: 
                     31:        incl    lpcnt                   /* Trying ANDL2 */
                     32:        movl    $0x55555555,_iob3       /* Set mask for andl2 */
                     33:        movab   _iob3,r7
                     34:        andl3   r7,$0x3fffffff,r2       /* R2 = address of mask */
                     35:        shar    $PGSHIFT,r2,r2          /* PTE no of the mask (_iob3) */
                     36:        andl2   $0x7fffffff,_Sysmap[r2] /* Invalidate this PTE */
                     37:        movl    $0xaaaaaaaa,r8
                     38: 
                     39:        movab   _Ret0,Retadr            /* Set return adr for fault handler */
                     40:        movab   (sp),exp_isp            /* Set expected SP */
                     41:        movl    r8,exp_dop              /*     expected destination operand */
                     42:        movl    r7,exp_fva              /*     expected fault virtual adr */
                     43:        movab   _Etpc,exp_upc           /*     expected PC at fault */
                     44:        movab   _Etpc,r10
                     45:        movpsl  exp_upsl                /*     expected PSL at fault */
                     46: 
                     47: _Etpc: andl2   (r7),r8                 /* Should cause translation fault */
                     48:        movl    $1,r0
                     49:        movl    r7,r2
                     50:        jmp     *badrtn
                     51: _Ret0:
                     52:        incl    lpcnt                   /* Trying ORL2 */
                     53:        movab   _iob3,r7
                     54:        movl    $0xcccccccc,r8
                     55: 
                     56:        movab   _Ret1,Retadr            /* Set return adr for fault handler */
                     57:        movab   (sp),exp_isp            /* Set expected SP */
                     58:        movl    r8,exp_dop              /*     expected destination operand */
                     59:        movl    r7,exp_fva              /*     expected fault virtual adr */
                     60:        movab   _Etpc1,exp_upc          /*     expected PC at fault */
                     61:        movab   _Etpc1,r10
                     62:        movpsl  exp_upsl                /*     expected PSL at fault */
                     63: 
                     64: _Etpc1:        orl2    (r7),r8                 /* Should cause translation fault */
                     65:        movl    $1,r0
                     66:        movl    r7,r2
                     67:        jmp     *badrtn
                     68: _Ret1:
                     69:        movl    $TRANS,r0               /* R0 = vector no of transl. fault */
                     70:        movl    _savvec0,_scb[r0]       /* Restore original handler */
                     71:        movab   _iob3,r7
                     72:        andl3   r7,$0x3fffffff,r2       /* R2 = address of mask */
                     73:        shar    $PGSHIFT,r2,r2          /* PTE no of the mask (_iob3) */
                     74:        orl2    $0x80000000,_Sysmap[r2] /* Validate this PTE */
                     75:        mtpr    $1,$TBIA                /* Purge translation buffer */ 
                     76:        mtpr    $256,$DCR               /* Disable translation buffer */ 
                     77:        ret
                     78: 
                     79: #
                     80: #      Translation fault Handler 
                     81: #
                     82:        .align  2
                     83: _Trans:
                     84: 
                     85:        movl    exp_dop,r2      /* Expected op2 after fault */
                     86:        movl    r8,r1           /* Actual op2 after fault */
                     87:        cmpl    r2,r1           /* Check if destination operand is modified */
                     88:        jeql    1f
                     89:        movl    $2,r0
                     90:        jmp     *badrtn
                     91: 
                     92: 1:     movab   (sp),r1         /* R1 = current ISP */
                     93:        subl3   $0x10,exp_isp,r2        /* R2 = Expected ISP after exception */ 
                     94:        cmpl    r1,r2
                     95:        beql    1f
                     96:        movl    $3,r0                   
                     97:        jmp     *badrtn         /* Error : too many parameters pushed on ISP */
                     98: 1:
                     99:        movl    (sp)+,r1        /* 1st parameter of Trans. fault : don't care */
                    100: 
                    101:        movl    exp_fva,r2      /* R2 = expected addr that cause fault */
                    102:        movl    (sp)+,r1        /* R1 = actual address */
                    103:        cmpl    r1,r2
                    104:        beql    1f
                    105:        movl    $4,r0                   
                    106:        jmp     *badrtn
                    107: 1:
                    108:        movl    exp_upc,r2      /* R2 = expected PC at fault */
                    109:        movl    (sp),r1         /* R1 = actual PC pushed */
                    110:        cmpl    r1,r2
                    111:        beql    1f
                    112:        movl    $5,r0                   
                    113:        jmp     *badrtn
                    114: 1:
                    115:        movl    Retadr,(sp)     /* Modify PC on SP to return */
                    116: 
                    117:        andl3   $0xfffffff0,exp_upsl,r2 /* R2 = expected PSL */
                    118:        andl3   $0xfffffff0,4(sp),r1    /* R1 = actual PSL pushed */
                    119:        cmpl    r1,r2           /* Check PSL pushed on the ISP */
                    120:        beql    1f
                    121:        movl    $6,r0                   
                    122:        jmp     *badrtn
                    123: 1:
                    124:        rei                     /* REI back ! */
                    125: #
                    126: #      *********
                    127: #      Data area
                    128: #      *********
                    129: #
                    130:        .align  2
                    131: exp_upc:
                    132:        .long   0               /* Expected PC at fault  */
                    133: exp_upsl:
                    134:        .long   0               /* Expected PSL at fault */
                    135: exp_isp:
                    136:        .long   0
                    137: exp_fva:
                    138:        .long   0               /* Expected virtual addr that cause fault */
                    139: Retadr:
                    140:        .long   0               /* Addr used by handler to return */
                    141: lpcnt:
                    142:        .long   0
                    143: exp_dop:
                    144:        .long   0               /* Expected destination operand */

unix.superglobalmegacorp.com

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