|
|
1.1 ! root 1: # ************************************************************************ ! 2: # * ! 3: # * "RUN THE TEST CODE" ROUTINE ! 4: # * ! 5: # * The general template of the test code will be: ! 6: # * ! 7: # * <op-code> [<addr-mode>] [<op.#1>] [<addr-mode>] [<op.#2>] ! 8: # * ! 9: # * any unused bytes will be padded with NOPs. After the NOPs there will ! 10: # * be a jump back to this routine. The jump will only be taken if there ! 11: # * is no event generated by the test instruction. ! 12: # * ! 13: # * The event handler will verify the event type and return to this code ! 14: # * through the "event_return" pointer. ! 15: # * After the event, this routine will decide if the event should have ! 16: # * been masked or not. If it wasn't masked then this code will call the ! 17: # * routine to check the event results (reg's, PSL, etc.). The checking ! 18: # * routine is called from here because after the event, this was the ! 19: # * last routine with the right frame pointer. ! 20: # * ! 21: # * 30-May-85 added: ACC = 0 for pipelined test #2 ! 22: # * 10-Jul-85 pulled instruction cache hit parts ! 23: # ************************************************************************ ! 24: .set NOP_JMP,0x1010719f /* jump to an absolute address */ ! 25: .text ! 26: .align 1 ! 27: .globl _run_code ! 28: _run_code: ! 29: .word 0 ! 30: moval (r13),_rc_code_fp /* save the frame pointer */ ! 31: moval (r14),_rc_code_sp /* save the stack pointer */ ! 32: movab _loop_n_leave,return /* exit for unexpected event */ ! 33: callf $4,_fill_code_buff /* stuff the code buffer */ ! 34: moval _evt_return,_event_return /* set up event return addr */ ! 35: ! 36: ######################################################################### ! 37: # Invalidate the instruction cache (error loop starts here) ! 38: ######################################################################### ! 39: _shift_loop: ! 40: incl _Codek /* Bump code cache key */ ! 41: cmpl _Codek,$255 /* Last key yet ? */ ! 42: jlss 1f ! 43: movl $1,_Codek /* Reset Code key to 1 */ ! 44: mtpr $1,$PACC /* Purge all code cache */ ! 45: nop ! 46: 1: ! 47: mtpr _Codek,$CCK /* Set new key */ ! 48: ! 49: ######################################################################### ! 50: # If the addressing mode is POP or deferred POP, push the data needed ! 51: ######################################################################### ! 52: cmpl $0x8e,_addr_code /* POP SP addressing? */ ! 53: beql 1f ! 54: cmpl $0x9e,_addr_code /* POP SP deferred addr.? */ ! 55: bneq 2f ! 56: 1: ! 57: cmpl $1,_no_ops /* push 1 or 2 operands? */ ! 58: beql 1f ! 59: pushl _sgl_value_10 /* push the 2nd data operand */ ! 60: 1: ! 61: pushl _sgl_value_9 /* push the data to be popped */ ! 62: ! 63: 2: ! 64: ######################################################################### ! 65: # LOAD THE ACCUMULATOR AND THE REGISTERS ! 66: # If this is pipelined test #2, load a zero into the accumulator ! 67: ######################################################################### ! 68: moval (sp),_pre_event_sp /* save the stack pointer */ ! 69: cmpl $2,_pipe_test ! 70: bneq 1f ! 71: clrl r0 /* load the accumulator with */ ! 72: clrl r1 /* zero for pipe test #2 */ ! 73: brb 2f ! 74: 1: movl _dbl_ld_acc,r0 /* if not pipe test #2, load */ ! 75: movl _dbl_ld_acc+4,r1 /* the ACC with the data */ ! 76: 2: ! 77: cmpl _acc_ld_size,$DBL /* load DBL or SGL ACC? */ ! 78: beql 1f ! 79: ldf r0 /* load the sgl accumulator */ ! 80: brb 2f ! 81: 1: ldd r0 /* load the dbl accumulator */ ! 82: 2: ! 83: loadr $0x3fff,_load_regs /* load regs 0 - 13 (FP) */ ! 84: ! 85: ! 86: ######################################################################### ! 87: # ENABLE OR DISABLE THE EVENT, SET THE EVENT TYPE & EXECUTE THE TEST CODE ! 88: ######################################################################### ! 89: bispsw $ENABLE_EVENTS /* enable ovfl & undfl events */ ! 90: bicpsw _disable_mask /* disable events as needed */ ! 91: movl _test_event,_exp_event /* set the event expected flag */ ! 92: movpsl _init_psl /* save PSL for error checking */ ! 93: jmp *_code_addr /* execute the test code */ ! 94: halt ! 95: ! 96: ! 97: ########################################################################## ! 98: # The only way here (knock on wood) is if we executed the test instruction ! 99: # without getting any events. If an event was expected, it is an error to ! 100: # come here. ! 101: # - Save the PSL and check if the event was disabled. ! 102: ########################################################################## ! 103: .globl _rc_code_return ! 104: _rc_code_return: ! 105: movpsl _psl_val /* save the final PSL */ ! 106: clrl _exp_event /* no more events expected */ ! 107: bitl $PSL_DBL,_psl_val /* check for DBL Acc. */ ! 108: bneq 1f ! 109: stf _dbl_st_acc /* save the accumulator */ ! 110: clrl _dbl_st_acc+4 ! 111: brb 2f ! 112: 1: std _dbl_st_acc /* save the accumulator */ ! 113: 2: ! 114: tstl _evt_disabled /* Was the event disabled? */ ! 115: bneq 1f ! 116: jmp _rc_no_event /* No -event not disabled */ ! 117: 1: ! 118: ! 119: ! 120: ########################################################################## ! 121: # The event was disabled so we're OK so far. Check the PSL flags ! 122: ########################################################################## ! 123: callf $4,_bad_final_psl /* check the final PSL */ ! 124: tstl r0 /* was the PSL OK? */ ! 125: bneq 1f /* -NO. handle the error */ ! 126: jmp _loop_n_leave /* -YES. exit (or loop) */ ! 127: 1: ! 128: tstl _prt_error /* print an error message? */ ! 129: beql 1f ! 130: pushl _bad_psl_msg /* "bad final PSL" message */ ! 131: callf $8,_prt_evt_er_msg /* print the error message */ ! 132: pushl $_rc_f_psl_msg /* "final PSL = " */ ! 133: callf $8,_writes ! 134: pushl _psl_val ! 135: callf $8,_write32h ! 136: pushl $_rc_e_psl_msg /* "expected PSL = " */ ! 137: callf $8,_writes ! 138: pushl _exp_psl ! 139: callf $8,_write32h ! 140: pushl $_rc_newline /* print a line feed */ ! 141: callf $8,_writec ! 142: 1: ! 143: tstl _halt_flg /* halt on error? */ ! 144: beql 1f ! 145: pushl $BAD_PSL_HLT ! 146: callf $8,_event_halt /* set up regs and halt */ ! 147: 1: ! 148: tstl _loop_on_err /* loop on the error? */ ! 149: beql 1f ! 150: movl $1,_force_loop /* set the Force Loop flag */ ! 151: 1: ! 152: jmp _loop_n_leave /* exit or loop */ ! 153: ! 154: ! 155: ########################################################################## ! 156: # BUMMER!! WE SHOULD HAVE GOTTEN AN EVENT ! 157: ########################################################################## ! 158: _rc_no_event: ! 159: storer $0x3fff,_store_regs /* store regs 0 - 13 */ ! 160: movl _rc_code_fp,fp /* re-load the frame pointer */ ! 161: movl _rc_code_sp,sp /* re-load the stack pointer */ ! 162: tstl _force_loop /* Is "force_loop" set? */ ! 163: beql 1f ! 164: jmp _shift_loop /* Yes - loop on the error */ ! 165: 1: ! 166: incl _errcnt; /* bump the error count */ ! 167: tstl _prt_error /* print an error message? */ ! 168: beql 1f ! 169: pushl _no_evt_msg /* "did not get event" msg */ ! 170: callf $8,_prt_evt_er_msg /* print the error message */ ! 171: 1: ! 172: tstl _halt_flg /* halt on error? */ ! 173: beql 1f ! 174: pushl $NO_EVT_HLT ! 175: callf $8,_event_halt /* halt with code of 1 */ ! 176: 1: ! 177: tstl _loop_on_err /* loop on the error? */ ! 178: beql 1f ! 179: movl $1,_force_loop /* set the force_loop flag */ ! 180: 1: ! 181: jmp _loop_n_leave /* loop on the error or exit */ ! 182: halt /* we should never get here */ ! 183: ! 184: ! 185: ########################################################################## ! 186: # The only way here (knock on wood) is if we got the correct event while ! 187: # executing the instruction. ! 188: ########################################################################## ! 189: .globl _evt_return ! 190: _evt_return: ! 191: clrl _exp_event /* no more events expected */ ! 192: movl _post_evt_acc,_dbl_st_acc /* save the accumulator */ ! 193: movl _post_evt_acc+4,_dbl_st_acc+4 ! 194: movl _rc_code_fp,fp /* re-load the frame pointer */ ! 195: movl _rc_code_sp,sp /* re-load the stack pointer */ ! 196: tstl _force_loop /* Is "force_loop" set? */ ! 197: beql 1f ! 198: jmp _shift_loop /* then loop on the error */ ! 199: ! 200: 1: ! 201: ########################################################################## ! 202: # NOW CHECK TO SEE IF THE EVENT WAS DISABLED WHEN IT OCCURRED ! 203: ########################################################################## ! 204: tstl _evt_disabled /* Was the interrupt disabled? */ ! 205: bneq 1f ! 206: callf $4,_chk_event /* No -verify the stack, etc. */ ! 207: jmp _loop_n_leave /* Exit ( or loop if error ) */ ! 208: ! 209: 1: ! 210: ########################################################################## ! 211: # BUMMER!! WE SHOULDN'T HAVE GOTTEN AN EVENT ! 212: ########################################################################## ! 213: movl _rc_code_fp,fp /* re-load the frame pointer */ ! 214: movl _rc_code_sp,sp /* re-load the stack pointer */ ! 215: tstl _force_loop /* Is "force_loop" set? */ ! 216: beql 1f ! 217: jmp _shift_loop /* then loop on the error */ ! 218: 1: ! 219: incl _errcnt; /* bump the error count */ ! 220: tstl _prt_error /* print an error message? */ ! 221: beql 1f ! 222: pushl _disbl_evt_msg /* "event while disabled" msg */ ! 223: callf $8,_prt_evt_er_msg /* print the error message */ ! 224: 1: ! 225: tstl _halt_flg /* halt on error? */ ! 226: beql 1f ! 227: pushl $EVT_MSK_HLT ! 228: callf $8,_event_halt /* halt with code of 2 */ ! 229: 1: ! 230: tstl _loop_on_err /* loop on the error? */ ! 231: beql 1f ! 232: movl $1,_force_loop /* set the force_loop flag */ ! 233: ! 234: 1: ! 235: ######################################################################### ! 236: # THIS IS THE EXIT FROM THIS ROUTINE ! 237: # LOOP IF THE FORCE LOOP FLAG IS SET, OTHERWISE EXIT ! 238: ######################################################################### ! 239: _loop_n_leave: ! 240: movl _rc_code_fp,fp /* re-load the frame pointer */ ! 241: movl _rc_code_sp,sp /* re-load the stack pointer */ ! 242: tstl _force_loop /* Is "force_loop" set? */ ! 243: beql 1f ! 244: jmp _shift_loop /* then loop on the error */ ! 245: 1: ! 246: ret /* return */ ! 247: ! 248: ! 249: ! 250: ! 251: ! 252: ! 253: # ************************************************************************* ! 254: # * ! 255: # * FILL IN THE CODE BUFFER ROUTINE ! 256: # * ! 257: # * Set up the instruction code sequence. After the instruction code, ! 258: # * put a jump back to "execute_code" and fill the rest of the code buffer ! 259: # * with NOPs. ! 260: # * ! 261: # ************************************************************************* ! 262: .text ! 263: .align 1 ! 264: .globl _fill_code_buff ! 265: _fill_code_buff: ! 266: .word 0 ! 267: movl $START_OF_CODE,r0 ! 268: movl r0,_code_addr /* save the starting address */ ! 269: clrl r1 ! 270: 1: movb _inst_buf(r1),(r0) /* move the code to the code buf */ ! 271: incl r0 ! 272: aoblss $16,r1,1b ! 273: ######################################################################## ! 274: # After the instruction code, put a jump back to "_rc_code_return" ! 275: ######################################################################## ! 276: movl $NOP_JMP,_sgl_dummy1 /* "<nop><nop><jmp><abs addr>" */ ! 277: clrl r1 ! 278: 1: movb _sgl_dummy1(r1),(r0) /* move the code to the code buf */ ! 279: incl r0 ! 280: aoblss $4,r1,1b ! 281: ! 282: moval _rc_code_return,_sgl_dummy1 /* jmp to 'ex_code_return' */ ! 283: clrl r1 ! 284: 1: movb _sgl_dummy1(r1),(r0) /* move the code to the code buf */ ! 285: incl r0 ! 286: aoblss $4,r1,1b ! 287: ! 288: ######################################################################## ! 289: # Fill the rest of the buffer with NOPs and return ! 290: ######################################################################## ! 291: movl $0x10,r1 /* 0x10 = NOP op-code */ ! 292: 1: movb r1,(r0) /* put NOPs in the code space */ ! 293: aobleq $END_OF_CODE,r1,1b ! 294: ret /* return */ ! 295: ! 296: ! 297: ! 298: ######################################################################## ! 299: # Variables ! 300: ######################################################################## ! 301: .align 2 ! 302: .globl _rc_code_sp ! 303: _rc_code_sp: /* save stack pointer value here */ ! 304: .long 0 ! 305: .globl _rc_code_fp ! 306: _rc_code_fp: /* save frame pointer value here */ ! 307: .long 0 ! 308: ! 309: .globl return /* emergency indirect return addr */ ! 310: return: ! 311: .long _loop_n_leave /* return to loop or leave */ ! 312: ! 313: ######################################################################## ! 314: # ERROR MESSAGES ! 315: ######################################################################## ! 316: _rc_f_psl_msg: ! 317: .ascii "final PSL = \0" ! 318: _rc_e_psl_msg: ! 319: .ascii ", expected PSL = \0" ! 320: _rc_newline: ! 321: .ascii " \n\0"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.