diff --git a/kernel-src/include/panic.h b/kernel-src/include/panic.h new file mode 100644 index 00000000..fa2cb4ef --- /dev/null +++ b/kernel-src/include/panic.h @@ -0,0 +1,8 @@ +#ifndef _PANIC_H +#define _PANIC_H + +#include + +__attribute__((noreturn)) void _panic(char *msg, context_t *ctx); + +#endif diff --git a/kernel-src/include/x86-64/arch/context.h b/kernel-src/include/x86-64/arch/context.h index 19ffaf87..7f6ba285 100644 --- a/kernel-src/include/x86-64/arch/context.h +++ b/kernel-src/include/x86-64/arch/context.h @@ -2,6 +2,7 @@ #define _CONTEXT_H #include +#include typedef struct { uint64_t cr2; @@ -32,7 +33,11 @@ typedef struct { uint64_t ss; } __attribute__((packed)) context_t; -#define ARCH_CTX_SP(x) x->rsp; -#define ARCH_CTX_IP(x) x->rip; +#define CTX_SP(x) x->rsp; +#define CTX_IP(x) x->rip; +#define PRINT_CTX(x) { \ + printf("cr2: %016lx gs: %04x\nrax: %016lx fs: %04x\nrbx: %016lx es: %04x\nrcx: %016lx ds: %04x\nrdx: %016lx cs: %04x\n r8: %016lx ss: %04x\n r9: %016lx r10: %016lx\nr11: %016lx r12: %016lx\nr13: %016lx r14: %016lx\nr15: %016lx rdi: %016lx\nrsi: %016lx rbp: %016lx\nrip: %016lx rsp: %016lx\nerr: %016lx rfl: %016lx\n", \ + x->cr2, x->gs, x->rax, x->fs, x->rbx, x->es, x->rcx, x->ds, x->rdx, x->cs, x->r8, x->ss, x->r9, x->r10, x->r11, x->r12, x->r13, x->r14, x->r15, x->rdi, x->rsi, x->rbp, x->rip, x->rsp, x->error, x->rflags); \ +} #endif diff --git a/kernel-src/lib/panic.c b/kernel-src/lib/panic.c new file mode 100644 index 00000000..565d0f95 --- /dev/null +++ b/kernel-src/lib/panic.c @@ -0,0 +1,15 @@ +#include +#include +#include + +__attribute__((noreturn)) void _panic(char *msg, context_t *ctx) { + printf("Oops.\n"); + + if (msg) + printf("%s\n", msg); + + if (ctx) + PRINT_CTX(ctx); + + for (;;); +} diff --git a/kernel-src/sys/interrupt.c b/kernel-src/sys/interrupt.c index 2a6dc900..a6b9060e 100644 --- a/kernel-src/sys/interrupt.c +++ b/kernel-src/sys/interrupt.c @@ -2,10 +2,13 @@ #include #include #include +#include void interrupt_isr(int vec, context_t *ctx) { isr_t *isr = &_cpu()->isr[vec]; - __assert(isr->func); + if (isr->func == NULL) + _panic("Unregistered interrupt", ctx); + // TODO ipl check isr->func(isr, ctx);