1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
.text
.set noat
save_tf: # write the trap frame onto the stack
# save gprs
sd $1,8($k1)
sd $2,16($k1)
sd $3,24($k1)
sd $4,32($k1)
sd $5,40($k1)
sd $6,48($k1)
sd $7,56($k1)
sd $8,64($k1)
sd $9,72($k1)
sd $10,80($k1)
sd $11,88($k1)
sd $12,96($k1)
sd $13,104($k1)
sd $14,112($k1)
sd $15,120($k1)
sd $16,128($k1)
sd $17,136($k1)
sd $18,144($k1)
sd $19,152($k1)
sd $20,160($k1)
sd $21,168($k1)
sd $22,176($k1)
sd $23,184($k1)
sd $24,192($k1)
sd $25,200($k1)
sd $28,224($k1)
sd $29,232($k1)
sd $30,240($k1)
sd $k0,248($k1) # $ra is actually in $k0
# get sr, epc, badvaddr
mfpcr $t0,$0 # sr
sd $t0,256($k1)
mfpcr $t0,$1 # epc
sd $t0,264($k1)
mfpcr $t0,$2 # badvaddr
sd $t0,272($k1)
jr $ra
.global pop_tf
pop_tf: # write the trap frame onto the stack
# restore gprs
di
move $k0,$a0
ld $1,8($k0)
ld $2,16($k0)
ld $3,24($k0)
ld $4,32($k0)
ld $5,40($k0)
ld $6,48($k0)
ld $7,56($k0)
ld $8,64($k0)
ld $9,72($k0)
ld $10,80($k0)
ld $11,88($k0)
ld $12,96($k0)
ld $13,104($k0)
ld $14,112($k0)
ld $15,120($k0)
ld $16,128($k0)
ld $17,136($k0)
ld $18,144($k0)
ld $19,152($k0)
ld $20,160($k0)
ld $21,168($k0)
ld $22,176($k0)
ld $23,184($k0)
ld $24,192($k0)
ld $25,200($k0)
ld $28,224($k0)
ld $29,232($k0)
ld $30,240($k0)
ld $31,248($k0)
# gtfo!
ld $k0,264($k0)
mtpcr $k0,$1
eret
#define TRAP_TABLE_ENTRY(x) \
.align 7; \
move $k0,$ra; \
la $k1,stack_top-320; \
jal save_tf; \
move $sp,$k1; \
move $a0,$k1; \
ei; \
jal x; \
unimp
.align 12
.global trap_table
trap_table:
TRAP_TABLE_ENTRY(unhandled_trap)
TRAP_TABLE_ENTRY(unhandled_trap)
TRAP_TABLE_ENTRY(unhandled_trap)
TRAP_TABLE_ENTRY(unhandled_trap)
TRAP_TABLE_ENTRY(unhandled_trap)
TRAP_TABLE_ENTRY(unhandled_trap)
TRAP_TABLE_ENTRY(handle_syscall)
TRAP_TABLE_ENTRY(handle_breakpoint)
.align 12
.bss
.global stack_bot
.global stack_top
stack_bot:
.skip 4096
stack_top:
|