1/*
2 * Trap Handlers
3 */
4
5.extern trap_entry
6
7.text
8
9.macro TRAP_NOEC TRAPNUM
10trap\TRAPNUM:
11    # Push top of the trap frame
12    pushq   %rax
13    pushq    $\TRAPNUM
14    pushq   %rax
15    xorq    %rax, %rax
16    movw    %ds, %ax
17    pushq   %rax
18    jmp trap_common
19.endm
20
21.macro TRAP_EC TRAPNUM
22trap\TRAPNUM:
23    # Push top of the trap frame
24    pushq    $\TRAPNUM
25    pushq   %rax
26    xorq    %rax, %rax
27    movw    %ds, %ax
28    pushq   %rax
29    jmp     trap_common
30.endm
31
32.globl trap_table
33trap_table:
34.quad trap0
35.quad trap1
36.quad trap2
37.quad trap3
38.quad trap4
39.quad trap5
40.quad trap6
41.quad trap7
42.quad trap8
43.quad trap9
44.quad trap10
45.quad trap11
46.quad trap12
47.quad trap13
48.quad trap14
49.quad trap15
50.quad trap16
51.quad trap17
52.quad trap18
53.quad trap19
54.quad trap20
55.quad trap21
56.quad trap22
57.quad trap23
58.quad trap24
59.quad trap25
60.quad trap26
61.quad trap27
62.quad trap28
63.quad trap29
64.quad trap30
65.quad trap31
66.quad trap32
67.quad trap33
68.quad trap34
69.quad trap35
70.quad trap36
71.quad trap37
72.quad trap38
73.quad trap39
74.quad trap40
75.quad trap41
76.quad trap42
77.quad trap43
78.quad trap44
79.quad trap45
80.quad trap46
81.quad trap47
82.quad trap48
83.quad trap49
84.quad trap50
85.quad trap51
86.quad trap52
87.quad trap53
88.quad trap54
89.quad trap55
90.quad trap56
91.quad trap57
92.quad trap58
93.quad trap59
94.quad trap60
95.quad trap61
96.quad trap62
97.quad trap63
98
99TRAP_NOEC 0     // DE
100TRAP_NOEC 1     // DB
101TRAP_NOEC 2     // NMI
102TRAP_NOEC 3     // BP
103TRAP_NOEC 4     // OF
104TRAP_NOEC 5     // BR
105TRAP_NOEC 6     // UD
106TRAP_NOEC 7     // NM
107TRAP_EC 8       // DF
108TRAP_NOEC 9
109TRAP_EC 10      // TS
110TRAP_EC 11      // NP
111TRAP_EC 12      // SS
112TRAP_EC 13      // GP
113TRAP_EC 14      // PF
114TRAP_NOEC 15
115TRAP_NOEC 16    // MF
116TRAP_EC 17      // AC
117TRAP_NOEC 18    // MC
118TRAP_NOEC 19    // XF
119TRAP_NOEC 20    // VE
120TRAP_NOEC 21
121TRAP_NOEC 22
122TRAP_NOEC 23
123TRAP_NOEC 24
124TRAP_NOEC 25
125TRAP_NOEC 26
126TRAP_NOEC 27
127TRAP_NOEC 28
128TRAP_NOEC 29
129TRAP_NOEC 30
130TRAP_NOEC 31
131TRAP_NOEC 32    // IRQ 0
132TRAP_NOEC 33
133TRAP_NOEC 34
134TRAP_NOEC 35
135TRAP_NOEC 36
136TRAP_NOEC 37
137TRAP_NOEC 38
138TRAP_NOEC 39
139TRAP_NOEC 40
140TRAP_NOEC 41
141TRAP_NOEC 42
142TRAP_NOEC 43
143TRAP_NOEC 44
144TRAP_NOEC 45
145TRAP_NOEC 46
146TRAP_NOEC 47    // IRQ 15
147TRAP_NOEC 48    // IRQ 16 (PCI)
148TRAP_NOEC 49
149TRAP_NOEC 50
150TRAP_NOEC 51
151TRAP_NOEC 52
152TRAP_NOEC 53
153TRAP_NOEC 54
154TRAP_NOEC 55    // IRQ 23 (PCI)
155TRAP_NOEC 56    // LAPIC Spurious
156TRAP_NOEC 57    // LAPIC Error
157TRAP_NOEC 58    // LAPIC Thermal
158TRAP_NOEC 59
159TRAP_NOEC 60    // System Call
160TRAP_NOEC 61
161TRAP_NOEC 62
162TRAP_NOEC 63
163
164trap_common:
165    # Create the rest of the trap frame
166    pushq   %rbx
167    pushq   %rcx
168    pushq   %rdx
169    pushq   %rsi
170    pushq   %rdi
171    pushq   %rbp
172    pushq   %r8
173    pushq   %r9
174    pushq   %r10
175    pushq   %r11
176    pushq   %r12
177    pushq   %r13
178    pushq   %r14
179    pushq   %r15
180
181    # Pass the trap frame as an argument to trap_entry
182    movq    %rsp, %rdi
183    call    trap_entry
184.globl trap_return
185trap_return:
186    popq    %r15
187    popq    %r14
188    popq    %r13
189    popq    %r12
190    popq    %r11
191    popq    %r10
192    popq    %r9
193    popq    %r8
194    popq    %rbp
195    popq    %rdi
196    popq    %rsi
197    popq    %rdx
198    popq    %rcx
199    popq    %rbx
200    popq    %rax
201    movw    %ax, %ds
202    popq    %rax
203
204    # Skip error code and vector number
205    addq    $16, %rsp
206
207    # Return to userspace
208    iretq
209
210.globl Trap_Pop
211Trap_Pop:
212    movq    %rdi, %rsp
213    jmp trap_return
214
215