summaryrefslogtreecommitdiff
path: root/src/kernel/arch/amd64/interrupts
diff options
context:
space:
mode:
authordzwdz2022-07-16 21:03:40 +0200
committerdzwdz2022-07-16 21:03:40 +0200
commitc8ed6aa7476b7f506366d9fe56ed6f2e7a12b40d (patch)
treeeac26e380be691734d767bb1238e30751e0351e2 /src/kernel/arch/amd64/interrupts
parentb26098268eb443f1ed3dc50d902b2beee40c8342 (diff)
amd64: init can print to the terminal now
Diffstat (limited to 'src/kernel/arch/amd64/interrupts')
-rw-r--r--src/kernel/arch/amd64/interrupts/isr.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/kernel/arch/amd64/interrupts/isr.c b/src/kernel/arch/amd64/interrupts/isr.c
index b55bc8b..4df8e57 100644
--- a/src/kernel/arch/amd64/interrupts/isr.c
+++ b/src/kernel/arch/amd64/interrupts/isr.c
@@ -14,17 +14,17 @@ bool isr_test_interrupt_called = false;
void isr_stage3(int interrupt, uint64_t *stackframe) {
if (interrupt == 0xe) stackframe++;
kprintf("interrupt %x, rip = k/%08x, cs 0x%x\n", interrupt, stackframe[0], stackframe[1]);
+ if (interrupt == 0xe) {
+ uint64_t addr = 0x69;
+ asm("mov %%cr2, %0" : "=r"(addr));
+ kprintf("error code 0x%x, addr 0x%x\n", stackframe[-1], addr);
+ }
+
switch (interrupt) {
case 0x08: // double fault
kprintf("#DF");
panic_invalid_state();
- case 0xe:
- uint64_t addr = 0x69;
- asm("mov %%cr2, %0" : "=r"(addr));
- kprintf("error code 0x%x, addr 0x%x\n", stackframe[-1], addr);
- panic_unimplemented();
-
case 0x34:
asm("nop" ::: "memory");
isr_test_interrupt_called = true;
@@ -41,8 +41,12 @@ void isr_stage3(int interrupt, uint64_t *stackframe) {
return;
default:
- // TODO check if the exception was in the kernel
- process_kill(process_current, interrupt);
- process_switch_any();
+ if (stackframe[1] & 0x3 == 0) {
+ kprintf("bye o7\n");
+ cpu_halt();
+ } else {
+ process_kill(process_current, interrupt);
+ process_switch_any();
+ }
}
}