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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
.text
.set noat
.ent save_tf
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
.end save_tf
.globl pop_tf
.ent pop_tf
pop_tf: # write the trap frame onto the stack
# restore gprs
ld $t0,256($a0) # restore sr, which should disable interrupts
mtpcr $t0,$0
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
.end pop_tf
#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
.ent trap_table
trap_table:
TRAP_TABLE_ENTRY(handle_illegal_instruction)
TRAP_TABLE_ENTRY(handle_privileged_instruction)
TRAP_TABLE_ENTRY(handle_fp_disabled)
TRAP_TABLE_ENTRY(handle_badtrap)
TRAP_TABLE_ENTRY(handle_misaligned_fetch)
TRAP_TABLE_ENTRY(handle_misaligned_ldst)
TRAP_TABLE_ENTRY(handle_fault_fetch)
TRAP_TABLE_ENTRY(handle_fault_ldst)
TRAP_TABLE_ENTRY(handle_syscall)
TRAP_TABLE_ENTRY(handle_breakpoint)
TRAP_TABLE_ENTRY(handle_badtrap)
TRAP_TABLE_ENTRY(handle_badtrap)
TRAP_TABLE_ENTRY(handle_badtrap)
TRAP_TABLE_ENTRY(handle_badtrap)
TRAP_TABLE_ENTRY(handle_badtrap)
TRAP_TABLE_ENTRY(handle_badtrap)
.align 12
.end trap_table
.bss
.global stack_bot
.global stack_top
stack_bot:
.skip 4096
stack_top:
|