@@ -144,120 +144,3 @@ void init_idt() {
144144 struct idt_ptr idtr = make_idtr ();
145145 load_idt (& idtr );
146146}
147-
148- // === DEBUG ===
149-
150- static int last_vector ;
151-
152- static void testing_exception_handler (struct interrupt_frame * frame ) {
153- last_vector = frame -> vector ;
154- }
155-
156- // Only tests IDT vector #0-#31
157- bool test_exceptions () {
158- // Install test exception handler
159- active_exception_handler = testing_exception_handler ;
160-
161- #define ASSERT_LAST_IDT_VECTOR_NUM (num ) \
162- if (last_vector != num) return false
163-
164- // For vectors without error codes: use int N directly
165- #define TRIGGER_INTERRUPT (n ) asm volatile("int %0" : : "i"(n))
166-
167- // For vectors with error codes: int N never pushes an error code, but isr_err stubs
168- // expect one. We build a fake interrupt frame with a dummy error code on the stack and
169- // jump directly to the ISR stub
170- #define _STR (x ) #x
171- #define STR (x ) _STR(x)
172- #define KERNEL_SS 0x10
173- #define TRIGGER_INTERRUPT_ERR (n ) \
174- asm volatile( \
175- "movq %%rsp, %%rdx\n\t" \
176- "pushq $" STR(KERNEL_SS) "\n\t" /* fake SS */ \
177- "pushq %%rdx\n\t" /* fake RSP */ \
178- "pushfq\n\t" /* RFLAGS */ \
179- "pushq $" STR (KERNEL_CS ) "\n\t" /* fake CS */ \
180- "leaq 1f(%%rip), %%rax\n\t" \
181- "pushq %%rax\n\t" /* fake RIP */ \
182- "pushq $0\n\t" /* dummy error code */ \
183- "jmp isr_stub_" #n "\n\t" \
184- "1:\n\t" \
185- : : : "rax", "rdx", "memory")
186-
187- TRIGGER_INTERRUPT (0 );
188- ASSERT_LAST_IDT_VECTOR_NUM (0 );
189- TRIGGER_INTERRUPT (1 );
190- ASSERT_LAST_IDT_VECTOR_NUM (1 );
191- TRIGGER_INTERRUPT (2 );
192- ASSERT_LAST_IDT_VECTOR_NUM (2 );
193- TRIGGER_INTERRUPT (3 );
194- ASSERT_LAST_IDT_VECTOR_NUM (3 );
195- TRIGGER_INTERRUPT (4 );
196- ASSERT_LAST_IDT_VECTOR_NUM (4 );
197- TRIGGER_INTERRUPT (5 );
198- ASSERT_LAST_IDT_VECTOR_NUM (5 );
199- TRIGGER_INTERRUPT (6 );
200- ASSERT_LAST_IDT_VECTOR_NUM (6 );
201- TRIGGER_INTERRUPT (7 );
202- ASSERT_LAST_IDT_VECTOR_NUM (7 );
203- TRIGGER_INTERRUPT_ERR (8 );
204- ASSERT_LAST_IDT_VECTOR_NUM (8 );
205- TRIGGER_INTERRUPT (9 );
206- ASSERT_LAST_IDT_VECTOR_NUM (9 );
207- TRIGGER_INTERRUPT_ERR (10 );
208- ASSERT_LAST_IDT_VECTOR_NUM (10 );
209- TRIGGER_INTERRUPT_ERR (11 );
210- ASSERT_LAST_IDT_VECTOR_NUM (11 );
211- TRIGGER_INTERRUPT_ERR (12 );
212- ASSERT_LAST_IDT_VECTOR_NUM (12 );
213- TRIGGER_INTERRUPT_ERR (13 );
214- ASSERT_LAST_IDT_VECTOR_NUM (13 );
215- TRIGGER_INTERRUPT_ERR (14 );
216- ASSERT_LAST_IDT_VECTOR_NUM (14 );
217- TRIGGER_INTERRUPT (15 );
218- ASSERT_LAST_IDT_VECTOR_NUM (15 );
219- TRIGGER_INTERRUPT (16 );
220- ASSERT_LAST_IDT_VECTOR_NUM (16 );
221- TRIGGER_INTERRUPT_ERR (17 );
222- ASSERT_LAST_IDT_VECTOR_NUM (17 );
223- TRIGGER_INTERRUPT (18 );
224- ASSERT_LAST_IDT_VECTOR_NUM (18 );
225- TRIGGER_INTERRUPT (19 );
226- ASSERT_LAST_IDT_VECTOR_NUM (19 );
227- TRIGGER_INTERRUPT (20 );
228- ASSERT_LAST_IDT_VECTOR_NUM (20 );
229- TRIGGER_INTERRUPT_ERR (21 );
230- ASSERT_LAST_IDT_VECTOR_NUM (21 );
231- TRIGGER_INTERRUPT (22 );
232- ASSERT_LAST_IDT_VECTOR_NUM (22 );
233- TRIGGER_INTERRUPT (23 );
234- ASSERT_LAST_IDT_VECTOR_NUM (23 );
235- TRIGGER_INTERRUPT (24 );
236- ASSERT_LAST_IDT_VECTOR_NUM (24 );
237- TRIGGER_INTERRUPT (25 );
238- ASSERT_LAST_IDT_VECTOR_NUM (25 );
239- TRIGGER_INTERRUPT (26 );
240- ASSERT_LAST_IDT_VECTOR_NUM (26 );
241- TRIGGER_INTERRUPT (27 );
242- ASSERT_LAST_IDT_VECTOR_NUM (27 );
243- TRIGGER_INTERRUPT (28 );
244- ASSERT_LAST_IDT_VECTOR_NUM (28 );
245- TRIGGER_INTERRUPT (29 );
246- ASSERT_LAST_IDT_VECTOR_NUM (29 );
247- TRIGGER_INTERRUPT (30 );
248- ASSERT_LAST_IDT_VECTOR_NUM (30 );
249- TRIGGER_INTERRUPT (31 );
250- ASSERT_LAST_IDT_VECTOR_NUM (31 );
251-
252- #undef ASSERT_LAST_IDT_VECTOR_NUM
253- #undef TRIGGER_INTERRUPT
254- #undef TRIGGER_INTERRUPT_ERR
255- #undef _STR
256- #undef STR
257- #undef KERNEL_SS
258-
259- // Remove test exception handler (and install default one)
260- active_exception_handler = exception_handler ;
261-
262- return true;
263- }
0 commit comments