|
|
1.1 root 1: #
2: # TRACE TRAP EVENT TEST
3: #
4: # R0 = error code
5: # 1 - instruction is executed before trap exception occured
6: # R1 : PC of instruction excecuted
7: # 2 - Error in PC after taking trap
8: # R1 : Actual, R2 : Expected
9: # 3 - PSL is not saved after taking trap
10: # R2 : PC of instruction trapped
11: # 4 - Too many parameter pushed on the stack
12: # R2 : PC of instruction trapped
13:
14: .globl _ttrap_evt
15: _ttrap_evt:
16: .word 0x1fff
17: mtpr $0x1f,$IPL /* Set IPL to HIGH */
18: movab (sp),_savvec0 /* Save sp */
19: mtpr _savvec0,$ISP /* Set ISP to sp */
20: movl _scb+TRACEVEC,_savvec7 /* Save TRACE trap vector */
21: movab vecvec6,_scb+TRACEVEC /* Set new TRACE trap vector */
22: movl $-1,-(sp) /* Set marker on sp */
23:
24: andl3 $_pcb0,$0x3fffffff,r1 /* Initialize PCB slightly */
25: mtpr r1,$PCBB /* Set PCBB */
26: movab (sp),_pcb0 /* Set PCB_KSP to current sp */
27: movab (sp),_pcb0+4 /* Set PCB_USP to current sp */
28:
29: clrl _savvec1
30: clrl _savvec2 /* savvec2 : exp value of savvec1 */
31: /* after trapped. */
32: movab epc1,_exp_pc /* expected PC after trap */
33: movab epc1,r8
34: bispsw $0x10 /* Turn on TRACE enable bit */
35: epc1: movl $1,_savvec1
36: epc2: bicpsw $0x10 /* Turn off TRACE enable bit */
37: movab epc3,_exp_pc
38: incl _savvec1
39: movab epc3,r8
40: bispsw $0x10 /* Turn on trace enable bit */
41: epc3: bicpsw $0x10 /* Turn off TRACE enable bit */
42: eee:
43: mtpr $31,$IPL /* Restore original SP, PSL, */
44: movl _savvec0,sp /* TRACE trap vector. */
45: movl _savvec7,_scb+TRACEVEC
46: ret /* Done with this sucker !! */
47:
48:
49:
50: .align 2 /* TRACE trap handler */
51: vecvec6:
52: bicpsw $0x10 /* Clear TRACE bit */
53: cmpl _savvec1,_savvec2 /* Check if instruction is */
54: beql 1f /* executed before trapped .. */
55: movl $1,r0
56: movl r8,r1 /* PC of inst. executed before trapped */
57: jmp *badrtn /* Error - inst is executed */
58: /* before trap occured. */
59: 1:
60: incl _savvec2
61: movl (sp)+,r1 /* Pop actual PC from stack */
62: movl r1,r10 /* Save PC to return */
63: movl _exp_pc,r2 /* Get expected PC */
64: cmpl r1,r2 /* Compare to actual PC */
65: beql 1f
66: movl $2,r0 /* PC error : error code = 2 */
67: jmp *badrtn /* r1 = actual; r2 = expected */
68:
69: 1:
70: movab epc2,_exp_pc /* Expected PC of next trap */
71: movl (sp)+,r1 /* Pop next longword from stack */
72: movl r1,r11 /* Save PSL for REI */
73: cmpl $-1,r1 /* Check if this's PSL or marker */
74: bneq 1f
75: 2: movl $3,r0 /* Error : PSL not saved */
76: jmp *badrtn /* Error code = 3; r1 = monster */
77: /* from stack !! */
78: 1: cmpl $-1,(sp) /* Error if SP not pointing at marker */
79: beql 1f
80: 2: movl $4,r0 /* Error : too many monsters */
81: jmp *badrtn /* pushed on the stack !! */
82: 1:
83: movl r11,-(sp) /* Push PSL & PC for next REI */
84: movl r10,-(sp)
85: rei
86: halt
87:
88: .align 2
89: _exp_pc:
90: .long 0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.