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

1.1       root        1: #
                      2: #      Privileged instructions tests
                      3: 
                      4: #      LDPCTX : load process context
                      5: #      SVPCTX : save process context
                      6: #      REI    : return from interrupt 
                      7: #
                      8: #      R0 = error codes
                      9: #           1 : LDPCTX fail to load general registers
                     10: #           2 : LDPCTX fail to load Memory Management Regsiters
                     11: #               r3 = reg. no of register in error
                     12: #               r1 = actual value
                     13: #               r2 = expected value
                     14: #           3 : SP not loaded correctly by LDPCTX
                     15: #           4 : LDPCTX did not put PC correctly on stack
                     16: #           5 : LDPCTX did not put PSL correctly on stack
                     17: #           6 : PSL_IS is not reset when LDPCTX from ISP to KSP
                     18: #           7 : Interrupt stack is not saved when LDPCTX from ISP to KSP
                     19: #           8 : PSL_IS is not set when SVPCTX executed
                     20: #           9 : Stack is not switched to ISP after SVPCTX executed
                     21: #          10 : SP is not saved in PCB_KSP correctly by SVPCTX 
                     22: #          11 : SVPCTX did not saved general registers correctly.
                     23: #               R3 = PCB entry no in error
                     24: #               R1 = actual value
                     25: #               R2 = expected value
                     26: #          12 : SVPCTX did not saved PC correctly.
                     27: #               R1 = actual value
                     28: #               R2 = expected value
                     29: #          13 : SVPCTX did not saved PSL correctly.
                     30: #               R1 = actual value
                     31: #               R2 = expected value
                     32: #          14 : REI fell thru to next instruction... 
                     33: #               R3 = address of REI instruction
                     34: #          15 : PSL not loaded correctly by REI
                     35: #               R1 = actual,  R2 = expected
                     36: #               R3 = address of REI instruction
                     37: #          16 : SP not loaded correctly by REI 
                     38: #               R1 = actual,  R2 = expected
                     39: #               R3 = address of REI instruction
                     40: #          17 : SP was not saved into ISP when REI with PSL_IS = 1
                     41: #               R1 = actual,  R2 = expected
                     42: #               R3 = address of REI instruction
                     43: #          18 : REI took pending interrupt IPL#14 in HISR while PSL_IPL was 1b 
                     44: #               R3 = address of REI instruction
                     45: #          19 : REI took pending interrupt IPL#7 in SISR while PSL_IPL was 1b
                     46: #               R3 = address of REI instruction
                     47: #          20 : REI did not take pending interrupt IPL#0x14 in HISR while 
                     48: #               PSL_IPL was 0x13 
                     49: #               R3 = address of REI instruction
                     50: #          21 : REI did not clear bit in HISR corresponding to IPL#14 after
                     51: #               taking the pending interrupt
                     52: #               R1 = actual,  R2 = expected
                     53: #               R3 = address of REI instruction
                     54: #          22 : REI did not set current PSL correctly after taking the pending
                     55: #               interrupt IPL#14 in HISR
                     56: #               R1 = actual,  R2 = expected
                     57: #               R3 = address of REI instruction
                     58: #          23 : SP error after taking pending interrupt in HISR at IPL#0x14
                     59: #               R1 = actual,  R2 = expected
                     60: #               R3 = address of REI instruction
                     61: #          24 : REI did not leave correct PC on the stack after taking pending
                     62: #               interrupt in HISR #0x14
                     63: #               R1 = actual,  R2 = expected
                     64: #               R3 = address of REI instruction
                     65: #          25 : REI did not leave correct PSL on the stack after taking pending
                     66: #               interrupt in HISR #0x14
                     67: #               R1 = actual,  R2 = expected
                     68: #               R3 = address of REI instruction
                     69: #          26 : REI did not take pending interrupt IPL#7 in SISR while 
                     70: #               REI to IPL #6 
                     71: #               R3 = address of REI instruction
                     72: #          27 : REI did not clear bit in SISR corresponding to IPL#7 after
                     73: #               taking the pending interrupt
                     74: #               R1 = actual,  R2 = expected
                     75: #               R3 = address of REI instruction
                     76: #          28 : REI did not set current PSL correctly after taking the pending
                     77: #               interrupt IPL#7 in SISR
                     78: #               R1 = actual,  R2 = expected
                     79: #               R3 = address of REI instruction
                     80: #          29 : PSL does not have correct mode after REI from Kernel to User
                     81: #               R1 = actual,  R2 = expected
                     82: #               R3 = address of REI instruction
                     83: #          30 : SP is not loaded from PCB_USP after REI from Kernel to User
                     84: #               R1 = actual,  R2 = expected
                     85: #               R3 = address of REI instruction
                     86: #          31 : Previous SP is not saved  into ISP after REI from Kernel 
                     87: #               to User with previous PSL_IS = 1
                     88: #               R1 = actual,  R2 = expected
                     89: #               R3 = address of REI instruction
                     90: #          32 : PSL does not have correct mode after REI from User to User
                     91: #               R1 = actual,  R2 = expected
                     92: #               R3 = address of REI instruction
                     93: #          33 : SP is not loaded from PCB_USP after REI from User to User
                     94: #               R1 = actual,  R2 = expected
                     95: #               R3 = address of REI instruction
                     96: #          34 : REI did not take pending software int. #2 while REI to IPL 0
                     97: #               R3 = address of REI instruction
                     98: #          35 : PCB_USP is not supposed to change by SVPCTX but it is.
                     99: #          36 : LDPCTX did not load the single precision floating point 
                    100: #               accumulator correctly.
                    101: #               R1 = actual,  R2 = expected
                    102: #          37 : LDPCTX did not load the double precision floating point 
                    103: #               accumulator correctly.
                    104: #               R1 / R2 = actual,  R3 / R4 = expected
                    105: #          38 : SVPCTX did not save the single precision floating point 
                    106: #               accumulator correctly.
                    107: #               R1 = actual,  R2 = expected
                    108: #          39 : SVPCTX did not save the double precision floating point 
                    109: #               accumulator correctly.
                    110: #               R1 / R2 = actual,  R3 / R4 = expected
                    111: #
                    112:        .globl  _prvinstr
                    113: _prvinstr:
                    114:        .word   0x1fff  
                    115:        mtpr    $HIGH,$IPL              /* IPL = HIGH   */
                    116:        bicpsw  $0x3f                   /* Clear all flag  */
                    117:        movab   (sp),_savvec0           /* Save current SP */
                    118:        movpsl  _savvec1                /* Save current PSL */  
                    119:        movl    fp,_savvec2             /* Save current FP */
                    120: 
                    121:        mtpr    $0,$ISP                 /* Init ISP to 0  */
                    122:        movab   _pcb0,r1                /* Init PCB0    */
                    123:        mtpr    r1,$PCBB                /* Set PCBB to pcb0 */
                    124: 
                    125:        movl    _savvec0,PCB_KSP(r1)    /* PCB_KSP = current SP */
                    126:        movl    $-1,PCB_USP(r1)         /* PCB_USP = -1 */
                    127:        movl    $0,PCB_R0(r1)
                    128:        movl    $0x11111111,PCB_R1(r1)
                    129:        movl    $0x22222222,PCB_R2(r1)
                    130:        movl    $0x33333333,PCB_R3(r1)
                    131:        movl    $0x44444444,PCB_R4(r1)
                    132:        movl    $0x55555555,PCB_R5(r1)
                    133:        movl    $0x66666666,PCB_R6(r1)
                    134:        movl    $0x77777777,PCB_R7(r1)
                    135:        movl    $0x88888888,PCB_R8(r1)
                    136:        movl    $0x99999999,PCB_R9(r1)
                    137:        movl    $0xaaaaaaaa,PCB_R10(r1)
                    138:        movl    $0xbbbbbbbb,PCB_R11(r1)
                    139:        movl    $0xcccccccc,PCB_R12(r1)
                    140:        movl    $0xdddddddd,PCB_R13(r1)
                    141:        movl    $0x1a1a1a1a,PCB_ACCM(r1)        /* set MS of fpp's acc. */
                    142:        movl    $0x2b2b2b2b,PCB_ACCL(r1)        /* set LS of fpp's acc. */
                    143: 
                    144:        movab   nxts,r5
                    145:        andl2   $0x3fffffff,r5
                    146:        movl    r5,PCB_PC(r1)                   /* Set PCB_PC */
                    147:        movl    $0x00100000,PCB_PSL(r1)   /* PCB_IPL = 0x10; K mode; SGL Acc */
                    148:        movl    $0x12121212,PCB_P0BR(r1)
                    149:        movl    $0x01212121,PCB_P0LR(r1)
                    150:        movl    $0x23232323,PCB_P1BR(r1)
                    151:        movl    $0x02323232,PCB_P1LR(r1)
                    152:        movl    $0x34343434,PCB_P2BR(r1)
                    153:        movl    $0x03434343,PCB_P2LR(r1)
                    154:        movab   s2msg1,_Errmsg
                    155:        ldpctx                          /* Do load process context */
                    156: rtnld:
                    157:        cmpl    r0,$0                   /* Verify general registers */
                    158:        beql    1f
                    159: 2:     movl    $1,r0           /*error code = 1*/      
                    160:        jmp    *badrtn          /*error- ldpctx did not load gen reg    */
                    161: 
                    162: 1:     movl    $1,r0           /*error code = 1 for ldpctx & gen regs  */      
                    163:        cmpl    r1,$0x11111111
                    164:        beql    1f
                    165: 2:     jmp    *badrtn          /*error - ldpctx did not load gen reg   */
                    166:                                /*properly; PCBB = phys addr of _pcb0   */
                    167: 1:     cmpl    r2,$0x22222222
                    168:        beql    1f
                    169: 2:     jmp    *badrtn          /*error - ldpctx did not load gen reg   */
                    170:                                /*properly; PCBB = phys addr of _pcb0   */
                    171: 1:     cmpl    r3,$0x33333333
                    172:        beql    1f
                    173: 2:     jmp    *badrtn          /*error - ldpctx did not load gen reg   */
                    174:                                /*properly; PCBB = phys addr of _pcb0   */
                    175: 1:     cmpl    r4,$0x44444444
                    176:        beql    1f
                    177: 2:     jmp    *badrtn          /*error - ldpctx did not load gen reg   */
                    178:                                /*properly; PCBB = phys addr of _pcb0   */
                    179: 1:     cmpl    r5,$0x55555555
                    180:        beql    1f
                    181: 2:     jmp    *badrtn          /*error - ldpctx did not load gen reg   */
                    182:                                /*properly; PCBB = phys addr of _pcb0   */
                    183: 1:     cmpl    r6,$0x66666666
                    184:        beql    1f
                    185: 2:     jmp    *badrtn          /*error - ldpctx did not load gen reg   */
                    186:                                /*properly; PCBB = phys addr of _pcb0   */
                    187: 1:     cmpl    r7,$0x77777777
                    188:        beql    1f
                    189: 2:     jmp    *badrtn          /*error - ldpctx did not load gen reg   */
                    190:                                /*properly; PCBB = phys addr of _pcb0   */
                    191: 1:     cmpl    r8,$0x88888888
                    192:        beql    1f
                    193: 2:     jmp    *badrtn          /*error - ldpctx did not load gen reg   */
                    194:                                /*properly; PCBB = phys addr of _pcb0   */
                    195: 1:     cmpl    r9,$0x99999999
                    196:        beql    1f
                    197: 2:     jmp    *badrtn          /*error - ldpctx did not load gen reg   */
                    198:                                /*properly; PCBB = phys addr of _pcb0   */
                    199: 1:     cmpl    r10,$0xaaaaaaaa
                    200:        beql    1f
                    201: 2:     jmp    *badrtn          /*error - ldpctx did not load gen reg   */
                    202:                                /*properly; PCBB = phys addr of _pcb0   */
                    203: 1:     cmpl    r11,$0xbbbbbbbb
                    204:        beql    1f
                    205: 2:     jmp    *badrtn          /*error - ldpctx did not load gen reg   */
                    206:                                /*properly; PCBB = phys addr of _pcb0   */
                    207: 1:     cmpl    r12,$0xcccccccc
                    208:        beql    1f
                    209: 2:     jmp    *badrtn          /*error - ldpctx did not load gen reg   */
                    210:                                /*properly; PCBB = phys addr of _pcb0   */
                    211: 1:     cmpl    r13,$0xdddddddd
                    212:        beql    1f
                    213: 2:     jmp    *badrtn          /*error - ldpctx did not load gen reg   */
                    214:                                /*properly; PCBB = phys addr of _pcb0   */
                    215: 
                    216: #/*    Check the single precision accumulator                          */
                    217: 1:
                    218:        stf     r1              /* store the accumulator                */
                    219:        movl    $0x1a1a1a1a,r2  /* set the expected value               */
                    220:        cmpl    r1,r2
                    221:        beql    1f
                    222:        movl    $36,r0          /* ERROR!!   r0 = 36 = error code       */
                    223:        jmp    *badrtn          /*error - ldpctx did not load the Acc   */
                    224: 
                    225: #/*    Check Memory Management Registers */
                    226: 
                    227: 1:
                    228:        movl    $2,r0           /*r0 = 2 = errorcode                    */
                    229:        mfpr    $P0BR,r1
                    230:        movl    _pcb0+PCB_P0BR,r2
                    231:        cmpl    r1,r2
                    232:        beql    1f
                    233:        movl    $P0BR,r3        /*r3 = reg no in error                  */
                    234:        jmp    *badrtn          /*ldpctx did not load memory mgmt       */
                    235:                                /*register properly;                    */
                    236:                                /*r1 = observed; r2 = expected          */
                    237: 1:     mfpr    $P1BR,r1
                    238:        movl    _pcb0+PCB_P1BR,r2
                    239:        cmpl    r1,r2
                    240:        beql    1f
                    241:        movl    $P1BR,r3        /*r3 = reg no in error                  */
                    242:        jmp    *badrtn          /*ldpctx did not load memory mgmt       */
                    243:                                /*register properly;                    */
                    244:                                /*r1 = observed; r2 = expected          */
                    245: 1:     mfpr    $P2BR,r1
                    246:        movl    _pcb0+PCB_P2BR,r2
                    247:        cmpl    r1,r2
                    248:        beql    1f
                    249:        movl    $P2BR,r3        /*r3 = reg no in error                  */
                    250:        jmp    *badrtn          /*ldpctx did not load memory mgmt       */
                    251:                                /*register properly;                    */
                    252:                                /*r1 = observed; r2 = expected          */
                    253: 1:     mfpr    $P0LR,r1
                    254:        movl    _pcb0+PCB_P0LR,r2
                    255:        cmpl    r1,r2
                    256:        beql    1f
                    257:        movl    $P0LR,r3        /*r3 = reg no in error                  */
                    258:        jmp    *badrtn          /*ldpctx did not load memory mgmt       */
                    259:                                /*register properly;                    */
                    260:                                /*r1 = observed; r2 = expected          */
                    261: 1:     mfpr    $P1LR,r1
                    262:        movl    _pcb0+PCB_P1LR,r2
                    263:        cmpl    r1,r2
                    264:        beql    1f
                    265:        movl    $P1LR,r3        /*r3 = reg no in error                  */
                    266:        jmp    *badrtn          /*ldpctx did not load memory mgmt       */
                    267:                                /*register properly;                    */
                    268:                                /*r1 = observed; r2 = expected          */
                    269: 1:     mfpr    $P2LR,r1
                    270:        movl    _pcb0+PCB_P2LR,r2
                    271:        cmpl    r1,r2
                    272:        beql    1f
                    273:        movl    $P2LR,r3        /*r3 = reg no in error                  */
                    274:        jmp    *badrtn          /*ldpctx did not load memory mgmt       */
                    275:                                /*register properly;                    */
                    276:                                /*r1 = observed; r2 = expected          */
                    277: #
                    278: #      Check if SP loaded by LDPCTX correctly 
                    279: #
                    280: 1:
                    281:        movab   (sp),r1         /* R1 = current SP */
                    282:        movl    _pcb0+PCB_KSP,r2        /* R2 = expected SP from PCB0 */
                    283:        subl2   $8,r2           /* Decrement 2 lwords for PC,PSL */
                    284:        cmpl    r2,r1
                    285:        beql    1f
                    286: 2:     movl    $3,r0           /*error code = r0 = 3                   */
                    287:        jmp    *badrtn          /*sp not correct after ldpctx           */
                    288:                                /*r0 = 3 = error code                   */
                    289:                                /*r1 = observed; r2 = expected          */
                    290: 1:
                    291: #
                    292: #      Check PC, PSL put on stack by LDPCTX
                    293: #      
                    294:        movl    r1,r4           /* R4 = SP */
                    295:        movl    (r4),r1         /* R1 = PC from stack  */
                    296:        movl    _pcb0+PCB_PC,r2 /* R2 = expected PC from PCB0 */
                    297:        cmpl    r1,r2
                    298:        beql    1f
                    299:        movl    $4,r0           /*error code = 4                        */
                    300:        jmp    *badrtn          /*pc on the stack not loaded            */
                    301:                                /*properly by ldpctx; r1 = obs; r2 =exp */
                    302: 1:     addl2   $4,r4
                    303:        movl    (r4),r1         /* R1 = PSL from stack */
                    304:        movl    _pcb0+PCB_PSL,r2        /* R2 = expected PSL from PCB0 */
                    305:        cmpl    r1,r2
                    306:        beql    1f
                    307:        movl    $5,r0           /*error code = 5                        */
                    308:        jmp    *badrtn          /*psl on the stack not loaded           */
                    309:                                /*properly by ldpctx; r1 = obs; r2 =exp */
                    310: 1:
                    311: #
                    312: #      Check PSL_IS reset correctly  when change SP from ISP to KSP
                    313: #      by LDPCTX 
                    314: #
                    315:        movpsl  r1
                    316:        andl2   $0x04000000,r1
                    317:        beql    1f
                    318:        movl    $6,r0           /*error code = r0 = 6                   */
                    319:        movl    $0,r2
                    320:        jmp    *badrtn          /*psl int stack should be turned off    */
                    321:                                /*by ldpctx; r1 = obs; r2 = exp         */
                    322: #
                    323: #      Check if int. stack get saved in ISP by LDPCTX 
                    324: 1:
                    325:        movl    _savvec1,r1
                    326:        andl2   $0x04000000,r1  /*if psl_is flag was on before ldpctx   */
                    327:        beql    9f
                    328:        mfpr    $ISP,r1         /*then ckeck that int stack ptr was     */
                    329:        movl    _savvec0,r2     /*saved by ldpctx                       */
                    330:        cmpl    r1,r2
                    331:        beql    9f
                    332: 2:     movl    $7,r0           /*error code = r0 = 7                   */
                    333:        jmp    *badrtn          /*ldpctx did not save ISP               */
                    334:                                /*r1  = obs; r2 = exp                   */
                    335: 
                    336: #/*    Check out save process context          */
                    337: #/*    at this point, psl & pc are still on    */
                    338: #/*    the stack. So svpctx can use it         */
                    339: 
                    340: 9:
                    341: nxts:  mtpr    _savvec0,$ISP   /* Init ISP = original SP */
                    342:        movab   _pcb1,r6
                    343:        movl    r6,r7           /* r7 = address  of Pcb1 */
                    344:        mtpr    r7,$PCBB        /* Set PCBB = physical address PCB1 */
                    345:        movl    $PCB_SIZE,r8    /* No of entries in PCB */
                    346: 1:     movl    $0xabcdef01,(r6)        /* Init all entries (26) in PCB1 */
                    347:                                /* with pattern 0xabcdef01      */
                    348:        addl2   $4,r6
                    349:        decl    r8
                    350:        bneq    1b
                    351: 
                    352:        movab   (sp),r11
                    353:        movl    (r11),_savvec7  /* Expected PC on the stack */
                    354:        movl    4(r11),_savvec8 /* Expected PSL on stack */
                    355: 
                    356:        movl    $0x3c3c3c3c,r0
                    357:        ldf     r0              /* load the (single precision) accumulator */
                    358: 
                    359:        movl    $0,r0           /* Initialize general registers */
                    360:        movl    $1,r1
                    361:        movl    $2,r2
                    362:        movl    $3,r3
                    363:        movl    $4,r4
                    364:        movl    $5,r5
                    365:        movl    $6,r6
                    366:        movl    $7,r7
                    367:        movl    $8,r8
                    368:        movl    $9,r9
                    369:        movl    $10,r10
                    370:        movl    $11,r11
                    371:        movl    $12,r12
                    372:        movl    $13,r13
                    373:        mtpr    $HIGH,$IPL      /* Set IPL = HIGH */
                    374:        movab   s2msg2,_Errmsg
                    375:        svpctx
                    376: 
                    377:        movpsl  r1              /* check if PSL_IS is set after SVPCTX */
                    378:        andl2   $0x04000000,r1
                    379:        bneq    1f
                    380: 2:     movl    $0x04000000,r2
                    381:        movl    $8,r0
                    382:        jmp    *badrtn          /* psl_is not set by svpctx; r0 = 8     */
                    383:                                /* r1 = obs; r2 = exp                   */
                    384: 
                    385: 1:     movab   (sp),r1        /* Check if SP is switched to ISP after SVPCTX */
                    386:        mfpr    $ISP,r2
                    387:        cmpl    r1,r2
                    388:        beql    1f
                    389: 2:     movl    $9,r0
                    390:        jmp    *badrtn          /*sp not equal to ISP in svpctx; r0 = 9 */
                    391:                                /*r1 = obs; r2 = exp                    */
                    392: 
                    393: 1:     movab   _pcb0,r7
                    394:        movab   _pcb1,r8
                    395:        cmpl    (r7),(r8)       /* Check if SVPCTX save SP in PCB1_KSP */
                    396:        beql    1f
                    397: 2:     movl    (r8),r1
                    398:        movl    (r7),r2
                    399:        movl    $10,r0
                    400:        jmp    *badrtn          /*ksp saved by svpctx not correct;      */
                    401:                                /*r0 = 10; r1 = obs; r2 = exp           */
                    402: 
                    403: #/*    Make sure PCB_USP unchanged by SVPCTX   */
                    404: 
                    405: 1:     movl    PCB_USP(r8),r1
                    406:        movl    $0xabcdef01,r2
                    407:        cmpl    r1,r2
                    408:        beql    1f
                    409:        movl    $35,r0       /* error code : 35; USP get changed in SVPCTX */
                    410:        jmp    *badrtn  
                    411: 
                    412: #/*    Verify that the floating point accumulator was saved correctly */
                    413: 1:
                    414:        movl    PCB_ACCM(r8),r1 /* get the value saved */
                    415:        movl    $0x3c3c3c3c,r2  /* get the expected value */
                    416:        cmpl    r1,r2
                    417:        beql    1f              /* branch if they match  */
                    418:        movl    $38,r0          /* Error code : 38; ACC was saved wrong */
                    419:        jmp    *badrtn  
                    420: 
                    421: #/*    Check if R0-R13 in PCB1 changed by SVPCTX */
                    422: 1:
                    423:        movl    $2,r3           /* Start from PCB_R0    */      
                    424:        addl2   $8,r8           /* R8 = address of pcb1_r0 */
                    425: 2:
                    426:        subl3   $2,r3,r2        /* R2 has expected value */
                    427:        cmpl    r2,(r8)
                    428:        bneq    2f
                    429:        incl    r3      
                    430:        addl2   $4,r8           /* Next address in PCB */
                    431:        cmpl    r3,$15
                    432:        bleq    2b
                    433: 
                    434:        brb     1f
                    435: 2:     movl    (r8),r1
                    436:        movl    $11,r0
                    437:        jmp    *badrtn          /*r0 = 11; r1 = obs; r2 = exp;          */
                    438:                                /*r3 = pcb entry # in fault             */
                    439: 1:
                    440:        cmpl    _savvec7,(r8)   /* Check if svpctx save PC correctly */
                    441:        beql    1f
                    442:        movl    (r8),r1         /* Actual data */
                    443:        movl    _savvec7,r2     /* Expected data */
                    444:        movl    $12,r0          /* error code */
                    445:        jmp    *badrtn
                    446: 1:
                    447:        addl2   $4,r8           /* Check PSL saved in pcb1 */
                    448:        cmpl    _savvec8,(r8)   /* Check if svpctx save PSL correctly */
                    449:        beql    1f
                    450:        movl    (r8),r1         /* Actual data */
                    451:        movl    _savvec8,r2     /* Expected data */
                    452:        movl    $13,r0          /* error code */
                    453:        jmp    *badrtn
                    454: 
                    455: #
                    456: # Now check LDPCTX with a double precision floating point accumulator
                    457: #
                    458: 1:
                    459:        mtpr    $HIGH,$IPL              /* IPL = HIGH   */
                    460:        bicpsw  $0x3f                   /* Clear all flag  */
                    461:        mtpr    $0,$ISP                 /* Init ISP to 0  */
                    462:        movab   _pcb0,r1                /* Init PCB0    */
                    463:        mtpr    r1,$PCBB                /* Set PCBB to pcb0 */
                    464:        movl    _savvec0,PCB_KSP(r1)    /* PCB_KSP = current SP */
                    465:        movl    $-1,PCB_USP(r1)         /* PCB_USP = -1 */
                    466:        movl    $0x5e5e5e5e,PCB_ACCM(r1) /* set MS of fpp's acc. */
                    467:        movl    $0x6f6f6f6f,PCB_ACCL(r1) /* set LS of fpp's acc. */
                    468:        movl    $0x00100080,PCB_PSL(r1) /* PCB_IPL = 0x10; K mode; DBL Acc */
                    469:        clrl    r0
                    470:        clrl    r1
                    471:        ldd     r0                      /* load the DBL Acc w/ 0 */
                    472:        ldpctx                          /* load the process context */
                    473:         
                    474:        std     r2                      /* save the accumulator */
                    475:        movl    $0x5e5e5e5e,r4
                    476:        movl    $0x6f6f6f6f,r5
                    477:        cmpl    r2,r4                   /* check the MS of the accumulator */
                    478:        bneq    2f                      /* branch if actual != expected */
                    479:        cmpl    r3,r5                   /* check the LS of the accumulator */
                    480:        beql    1f                      /* branch if good compare */
                    481: 2:
                    482:        movab   s2msg1,_Errmsg          /* LDPCTX  failed      */
                    483:        movl    $37,r0                  /* Error code 37 -bad dbl Acc saved */
                    484:        movl    r2,r1                   /* move the data into  */
                    485:        movl    r3,r2                   /*    registers 1 - 4  */
                    486:        movl    r4,r3                   /*       for the       */
                    487:        movl    r5,r4                   /*          error halt */
                    488:        jmp    *badrtn                  /* report the error    */
                    489: 
                    490: #
                    491: # Now check SVPCTX with a double precision floating point accumulator
                    492: #
                    493: 1:
                    494:        mtpr    _savvec0,$ISP           /* Init ISP = original SP */
                    495:        movab   _pcb1,r6
                    496:        movl    r6,r7                   /* r7 = address  of Pcb1 */
                    497:        mtpr    r7,$PCBB                /* Set PCBB = physical address PCB1 */
                    498:        movl    $PCB_SIZE,r8            /* No of entries in PCB */
                    499: 1:     movl    $0xabcdef01,(r6)        /* Init all entries (26) in PCB1 */
                    500:                                        /* with pattern 0xabcdef01      */
                    501:        addl2   $4,r6
                    502:        decl    r8
                    503:        bneq    1b
                    504: 
                    505:        movl    $0xabcdabcd,r0          /* set the data to load into      */
                    506:        movl    $0x12341234,r1          /*    the fpp's accumulator       */
                    507:        ldd     r0                      /* load the DBL fpp Accumulator   */
                    508:        orl2    $0x80,4(sp)             /* set the DBL bit in stack's PSL */
                    509:        movl    4(sp),_savvec4          /* save the stack's PSL           */
                    510:        
                    511:        mtpr    $HIGH,$IPL              /* Set IPL = HIGH */
                    512:        movab   s2msg2,_Errmsg
                    513:        svpctx                          /* save the context */
                    514: 
                    515: #/*  Check the saved double precision floating point accumulator */
                    516:        ldf     $0                      /* (REI code expects a sgl Acc) */
                    517:        movab   _pcb1,r6                /* get the PCB address          */
                    518:        movl    PCB_ACCM(r6),r1         /* get the saved accumulator    */
                    519:        movl    PCB_ACCL(r6),r2         /*    data values               */
                    520:        movl    $0xabcdabcd,r3          /* get the expected accumulator */
                    521:        movl    $0x12341234,r4          /*    data values               */
                    522: 
                    523:        cmpl    r1,r3                   /* check the MS data saved      */
                    524:        bneq    2f                      /* branch if compare error      */
                    525:        cmpl    r2,r4                   /* check the LS data saved      */
                    526:        beql    1f                      /* branch if no compare errors  */
                    527: 2:
                    528:        movab   s2msg2,_Errmsg          /* SVPCTX  failed      */
                    529:        movl    $39,r0                  /* Error 39 -bad dbl acc saved  */
                    530:        jmp    *badrtn                  /* report the error    */
                    531: 
                    532: #/*  Check the saved PSL to verify that the fpp DBL accumulator bit is set */
                    533: 1:
                    534:        movl    PCB_PSL(r6),r1          /* get the saved PSL value */
                    535:        movl    _savvec4,r2             /* get the expected PSL value */
                    536:        cmpl    r1,r2                   /* compare the PSL values  */
                    537:        beql    1f                      /* branch if no error */
                    538:        movl    $13,r0                  /* Error code 13 -bad PSL */
                    539:        jmp    *badrtn                  /* report the error    */
                    540: 
                    541: #
                    542: #      REI instruction test    
                    543: #      PSL should have PSL_IS = 1,PSL_MODE = 0,PSL_IPL = 31
                    544: #
                    545: 1:
                    546:        movab   s2msg3,_Errmsg
                    547:        movpsl  r1
                    548:        andl2   $0x051f0000,r1  /* Check to make sure Tahoe in proper */
                    549:        cmpl    $0x041f0000,r1  /* state to check out REI ; PSL_IS = 1 */
                    550:        beql    1f              /* PSL_MODE = Kernel; PSL_IPL = 0x1f  */
                    551: 2:     movl    $0x051f0000,r2
                    552:        movl    $13,r0
                    553:        jmp    *badrtn          /*psl not equal to expected;            */
                    554: 1:
                    555: #      REI K mode to K mode; is = 1; ipl =1d   
                    556: #      movl    $0,*$HSR        /* set HISR in PSA to  0                */
                    557: 
                    558:        movl    $0,*$SSR        /* set SISR in PSA to  0                */
                    559:        mtpr    $0,$ISP         /* ISP == 0                             */
                    560:        movab   _pcb0,r1        /* Set PCBB to pcb0                     */
                    561:        mtpr    r1,$PCBB
                    562: 
                    563:        movl    $0,_pcb0+PCB_KSP        /* PCB_KSP = PCB_USP = 0 */
                    564:        movl    $0,_pcb0+PCB_USP
                    565:        movl    $0x041d0000,-(sp)       /* Set PSL,PC  on stack for next REI */
                    566:                                        /* REI to K mode and IPL == 0x1d  */
                    567:        movab   rei1,r3
                    568:        movab   1f,-(sp)
                    569: rei1:
                    570:        rei
                    571:        movl    $14,r0          /* R0 = 14; rei fell thru       */
                    572:        jmp    *badrtn
                    573: 1:
                    574:        movpsl  r1              /* If rei works, this is where it comes */
                    575:        movl    $0x041d0000,r2
                    576:        cmpl    r1,r2           /* Check if PSL loaded correctly        */
                    577:        beql    1f
                    578:        movl    $15,r0
                    579:        jmp    *badrtn          /*rei did not load psl form the stack   */
                    580: 1:
                    581:        movab   (sp),r1         /*check sp = original sp                */
                    582:        movl    _savvec0,r2
                    583:        cmpl    r1,r2
                    584:        beql    1f
                    585:        movl    $16,r0          /*r0 = 16 = error code                  */
                    586:        jmp    *badrtn          /*sp is incorrect after rei             */
                    587: 1:
                    588:        mfpr    $ISP,r1
                    589:        cmpl    r1,r2
                    590:        beql    1f
                    591:        movl    $17,r0          /*error code = r0 = 17                  */
                    592:        jmp    *badrtn          /*sp was not saved by rei into ISP      */
                    593:                                /*when is was ON; r1= obs; r2= exp      */
                    594: #
                    595: #      REI K mode to K mode; is =0; ipl = 1d
                    596: 1:
                    597:        subl3   $16,r2,_pcb0    /* set PCB_KSP to SP-16         */
                    598:        subl3   $24,r2,_pcb0+PCB_USP    /* Set PCB_USP to SP-24 */
                    599:        mtpr    $0,$ISP
                    600:        pushl   $0x001d0000     /* Set up PSL,PC on stack for REI */
                    601:        pushab  1f              /* PSL_IS = 0; PSL_IPL = 1d; K mode */
                    602:        movab   rei2,r3
                    603: rei2:
                    604:        rei
                    605:        movl    $14,r0          /* REI fell thru */
                    606:        jmp    *badrtn
                    607: 1:
                    608:        mfpr    $ISP,r1
                    609:        movl    _savvec0,r2
                    610:        cmpl    r1,r2
                    611:        beql    1f
                    612:        movl    $17,r0
                    613:        jmp    *badrtn          /*sp not saved correctly into ISP       */
                    614: 1:
                    615:        movpsl  r1
                    616:        andl2   $0xffffff00,r1
                    617:        movl    $0x001d0000,r2
                    618:        cmpl    r1,r2
                    619:        beql    1f
                    620:        movl    $15,r0          /*error code = r0 = 19                  */
                    621:        jmp    *badrtn          /*psl not loaded correctly by rei       */
                    622: 1:
                    623:        movab   (sp),r1
                    624:        mfpr    $KSP,r2
                    625:        cmpl    r1,r2
                    626:        beql    1f
                    627:        movl    $16,r0          /*error code = r0 = 20                  */
                    628:        jmp    *badrtn          /*KSP was not loaded into sp by rei     */
                    629: #
                    630: #      interrupt test - to see that REI handles pending interrupts
                    631: #      in SISR, HISR properly. REI to process has IPL 1b
                    632: #      ** HISR has pending int. at IPL#14 
                    633: #      ** SISR = bit 7 & 2 ON                          
                    634: #
                    635: 1:
                    636:        movl    $0x140004,*$HSR  /* Set HISR : pending console transmit */
                    637:                                 /* interrupt at IPL#0x14  */
                    638:        movl    $0x82,*$SSR     /* Set SISR : pending IPL#7, IPL#2 */
                    639: 
                    640:        movl    _scb+44,_savvec4   /* Save int vector for console trans int. */
                    641:        movl    _scb+SIVEC1-24,_savvec6 /* Save int vector for IPL# 7    */
                    642:        movab   hs14,_scb+44            /* New vector for HISR #0x14 */
                    643:        movab   ss7,_scb+SIVEC1-24      /* New vector soft int. #7 */
                    644:        brw     1f
                    645: #
                    646: #      **************
                    647: #
                    648:        .align  2
                    649: hs14:                          /* Handler for HISR #0x14 */
                    650:        movl    $18,r0
                    651:        jmp    *badrtn          /* Rei took pending int. in HISR #0x14 when */
                    652:                                /* PSL_IPL was #1b */
                    653: #
                    654: #
                    655:        .align  2
                    656: ss7:                           /* Handler for software int. #7 */
                    657:        movl    $19,r0
                    658:        jmp    *badrtn          /* REI took pending software int.#7 when */
                    659:                                /* PSL_IPL was > 7 */
                    660: #
                    661: #      ***************
                    662: #
                    663: 1:
                    664:        movl    $0x001b0000,-(sp)       /* Set up PSL, PC for REI       */
                    665:        movab   1f,r0                   /* PSL_IPL = 0x1b */
                    666:        andl2   $0x3fffffff,r0
                    667:        movl    r0,-(sp)                /* PSL_MODE = K, PSL_IPL = 1b,  */
                    668:        movab   rei3,r3
                    669: rei3:
                    670:        rei                     /* This REI should not take any pending int. */
                    671:        movl    $14,r0          /* error : REI fell thru */
                    672:        jmp    *badrtn
                    673: #
                    674: #      now REI again to IPL 0x13 so pending interrupt in
                    675: #      HISR at IPL#14 should be taken by REI
                    676: 1:
                    677:        movab   hsr_hdl,_scb+44         /* Set new vector for IPL#14    */
                    678:        pushl   $0x00130000             /* Set up PSL,PC for REI        */
                    679:        pushab  9f
                    680:        movab   rei4,r3
                    681: rei4:
                    682:        rei                     /* Should take pending hardware int. #0x14 */
                    683:        movl    $14,r0          /* error : REI fell thru */
                    684:        jmp    *badrtn
                    685: 9:
                    686:        movl    $20,r0
                    687:        jmp    *badrtn          /* REI did not take pending interrupt   */
                    688:                                /* with IPL #14 > PSL_IPL #13;          */
                    689:                                /* r0 = 23 = errorcode                  */
                    690: #
                    691: #      Handler for hardware int. 0x14
                    692: #
                    693:        .align  2
                    694: hsr_hdl:                       /* This is where REI should come        */
                    695:        mfpr    $HISR,r1        /* check if HISR is reset to 0          */
                    696:        clrl    r2
                    697:        cmpl    r1,r2
                    698:        beql    1f
                    699:        movl    $21,r0
                    700:        jmp    *badrtn          /* Rei did not reset HISR after taking  */
                    701:                                /* pending int in HISR.                 */
                    702: 1:
                    703:        movpsl  r1
                    704:        andl2   $0xffffff00,r1
                    705:        movl    $0x04140000,r2  /* Expected current PSL */
                    706:        cmpl    r1,r2
                    707:        beql    1f
                    708:        movl    $22,r0
                    709:        jmp    *badrtn          /* Rei did not set current PSL corectly */
                    710: #
                    711: #      check if SP is switched to ISP
                    712: #
                    713: 1:
                    714:        movab   (sp),r1         /* check if current SP = (ISP-8)        */
                    715:        mfpr    $ISP,r2
                    716:        subl2   $8,r2
                    717:        cmpl    r1,r2
                    718:        beql    1f
                    719:        movl    $23,r0          /* SP error after taking pending        */
                    720:        jmp     *badrtn         /* interrupt in HISR                    */
                    721: 1:
                    722:        movl    (sp)+,r1        /* Check pc & psl are still on the stack */
                    723:        movab   9b,r2
                    724:        cmpl    r1,r2
                    725:        beql    1f
                    726:        movl    $24,r0
                    727:        jmp    *badrtn          /* Rei or micro int handler did not leave */
                    728:                                /* correct value of pc (one before rei  */
                    729:                                /* was executed) on the stack.          */
                    730: 1:     movl    (sp)+,r1
                    731:        movl    $0x00130000,r2
                    732:        cmpl    r1,r2
                    733:        beql    1f
                    734:        movl    $25,r0
                    735:        jmp    *badrtn          /* Rei or micro int handler did not leave*/
                    736:                                /* correct value of psl (one before rei */
                    737:                                /* was executed) on the stack.          */
                    738: 
                    739: 1:     movl    _savvec4,_scb+44        /*restore vector for ipl#14,    */
                    740:        movab   sw7,_scb+96             /*new vector for ipl #7         */
                    741:        pushl   $0x00060000     /* Now set up to REI again to IPL#6, so it */
                    742:        pushab  1f              /* should take pending software int. #7 */
                    743:        movab   rei5,r3
                    744: rei5:
                    745:        rei
                    746:        movl    $14,r0          /* REI fell thru */
                    747:        jmp    *badrtn
                    748: 1:
                    749:        movl    $26,r0
                    750:        jmp    *badrtn          /* Rei did not take interrupt at IPL#7  */
                    751: #
                    752: #      Handler for software int. # 7
                    753: #
                    754:        .align  2
                    755: sw7:                           /* This is where REI comes      */
                    756:        mfpr    $SISR,r1        /* Check SISR = 0x02            */
                    757:        movl    $2,r2
                    758:        cmpl    r1,r2
                    759:        beql    1f
                    760:        movl    $27,r0
                    761:        jmp    *badrtn          /* REI did not reset SISR       */
                    762: 1:
                    763:        movl    $0,*$SSR        /* SISR = 0                     */      
                    764:        movpsl  r1
                    765:        andl2   $0xffffff00,r1  /* Mask out arithmetic flags    */
                    766:        movl    $0x04070000,r2
                    767:        cmpl    r1,r2
                    768:        beql    1f
                    769:        movl    $28,r0
                    770:        jmp    *badrtn          /* Current psl not set right    */
                    771:                                /* by rei or micro int handler  */
                    772: #
                    773: #      REI from KERNEL to USER
                    774: #
                    775: 1:     mtpr    $31,$IPL        
                    776:        movl    _savvec6,_scb+SIVEC1-24 /*restore original vector for   */
                    777:                                        /*ipl #7                        */
                    778:        movl    _savvec0,sp
                    779:        pushl   $0x1000000      /* Set up to REI to user, IPL = 0, IS = 0 */
                    780:        pushab  1f
                    781:        mtpr    $0,$ISP         /* Set ISP to 0                 */
                    782:        movab   rei6,r3
                    783: rei6:
                    784:        rei
                    785:        movl    $14,r0
                    786:        jmp    *badrtn
                    787: #
                    788: #      Now running in user mode
                    789: #
                    790: 1:
                    791:        movpsl  r1              /*check psl = 0x01000000        */
                    792:        movl    $0x1000000,r2
                    793:        cmpl    r1,r2
                    794:        beql    1f
                    795:        movl    $29,r0
                    796:        jmp    *badrtn          /*psl not set right by rei      */
                    797: 1:
                    798:        movab   (sp),r1         /*check sp = USP                */
                    799:        movl    _pcb0+PCB_USP,r2
                    800:        cmpl    r1,r2
                    801:        beql    1f
                    802:        movl    $30,r0
                    803:        jmp    *badrtn          /*sp not set to USP when mode = U*/
                    804: 1:
                    805:        movl    *$INTSP,r1      /* This is tricky; User get ISP from PSA */
                    806:        movl    _savvec0,r2
                    807:        cmpl    r1,r2
                    808:        beql    1f
                    809:        movl    $31,r0
                    810:        jmp    *badrtn          /* Rei did not save sp into ISP */
                    811:                                /* when psl_is was ON           */
                    812: #
                    813: #      REI from USER to USER   
                    814: #      still running in user mode      
                    815: #
                    816: 1:
                    817:        movl    _savvec0,sp
                    818:        pushl   $0x1000000      /* Set up to REI to another user */
                    819:        pushab  1f
                    820:        movab   rei7,r3
                    821: rei7:
                    822:        rei
                    823:        movl    $14,r0
                    824:        jmp    *badrtn
                    825: 1:
                    826:        movpsl  r1              /*check psl = 0x01000000        */
                    827:        movl    $0x1000000,r2
                    828:        cmpl    r1,r2
                    829:        beql    1f
                    830:        movl    $32,r0
                    831:        jmp    *badrtn          /*psl not set right by rei      */
                    832: 1:
                    833:        movab   (sp),r1         /*check sp = USP                */
                    834:        movl    _pcb0+PCB_USP,r2
                    835:        cmpl    r1,r2
                    836:        beql    1f
                    837:        movl    $33,r0
                    838:        jmp    *badrtn          /*sp not set to USP when mode = U*/
                    839: 1:
                    840:        movl    $2,*$SSR        /* This is cheating : Set SISR  */
                    841:        movl    _scb+SIVEC1,r4  /* directly in PSA */
                    842:        movab   sw2,_scb+SIVEC1 /* New handler for software int.#2 */
                    843:        pushl   $0x01000000     /* Set PSL,PC to REI to user ipl0 */
                    844:        pushab  1f
                    845:        movab   rei8,r3
                    846: rei8:
                    847:        rei             /* Use REI with pending int #2 in SISR to get back */
                    848:        movl    $14,r0
                    849:        jmp    *badrtn          /* to Kernel mode; Can also use a halt  */
                    850: 1:
                    851:        movl    $34,r0
                    852:        jmp    *badrtn  
                    853: #
                    854: #
                    855:        .align  2
                    856: sw2:   
                    857:        movl    r4,_scb+SIVEC1
                    858:        mtpr    $31,$IPL
                    859:        movl    (sp)+,r0
                    860:        movl    (sp)+,r0
                    861:        movl    _savvec0,sp     /* Original SP          */
                    862:        movl    _savvec2,fp
                    863:        ret
                    864: #
                    865: #
                    866:        .data   1
                    867: s2msg1:
                    868:        .ascii  "LDPCTX failed \0"
                    869: s2msg2:
                    870:        .ascii  "SVPCTX failed \0"
                    871: s2msg3:
                    872:        .ascii  "REI failed \0"

unix.superglobalmegacorp.com

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