summaryrefslogtreecommitdiff
path: root/arch/i386/boot/idt.c
diff options
context:
space:
mode:
authorDanny Holman <dholman@gymli.xyz>2021-10-09 15:26:32 -0500
committerDanny Holman <dholman@gymli.xyz>2021-10-09 15:39:59 -0500
commit376ec895110deb142a9162984e50ad6f0616758e (patch)
treeaada41ecfa65615e2aaf8264b51eda53c4f7c6aa /arch/i386/boot/idt.c
parentc4845de1e4ba49ba066e5729814fdb5bcd7e46f8 (diff)
arch: i386: include more information in IDT
Include information about the current stack frame in the IDT handler(s). Signed-off-by: Danny Holman <dholman@gymli.xyz>
Diffstat (limited to 'arch/i386/boot/idt.c')
-rw-r--r--arch/i386/boot/idt.c80
1 files changed, 40 insertions, 40 deletions
diff --git a/arch/i386/boot/idt.c b/arch/i386/boot/idt.c
index 7213fe5..d741381 100644
--- a/arch/i386/boot/idt.c
+++ b/arch/i386/boot/idt.c
@@ -10,56 +10,56 @@ struct idt_entry idt[256];
struct idt_ptr idtr;
__attribute__((noreturn))
-void exception_handler(int number) {
- kprintf("EXCEPTION %d CAUGHT\n", number);
+void exception_handler(struct isr_frame *frame) {
+ kprintf("Error: CPU exception: %d\n", frame->vector);
__asm__ volatile("cli;hlt");
}
extern void idt_set_gate(uint8_t num, void (*handler)(void), uint16_t cs, uint8_t flags) {
- idt[num].isr_low = (uint16_t)(((uint32_t)handler >> 0) & 0xFFFF);
- idt[num].isr_high = (uint16_t)(((uint32_t)handler >> 16) & 0xFFFF);
- idt[num].reserved = 0;
- idt[num].kernel_cs = cs;
- idt[num].flags = flags;
+ struct idt_entry *desc = &idt[num];
+ desc->isr_low = (uint16_t)(((uint32_t)handler >> 0) & 0xFFFF);
+ desc->isr_high = (uint16_t)(((uint32_t)handler >> 16) & 0xFFFF);
+ desc->reserved = 0;
+ desc->kernel_cs = cs;
+ desc->flags = flags;
}
void idt_install(void) {
idtr.limit = (uint16_t)sizeof(struct idt_entry) * 256 - 1;
idtr.base = (uint32_t)&idt[0];
- memset(&idt, 0, sizeof(struct idt_entry) * 256);
- idt_set_gate(0, isr_stub_0, 0x08, 0x8e);
- idt_set_gate(1, isr_stub_1, 0x08, 0x8e);
- idt_set_gate(2, isr_stub_2, 0x08, 0x8e);
- idt_set_gate(3, isr_stub_3, 0x08, 0x8e);
- idt_set_gate(4, isr_stub_4, 0x08, 0x8e);
- idt_set_gate(5, isr_stub_5, 0x08, 0x8e);
- idt_set_gate(6, isr_stub_6, 0x08, 0x8e);
- idt_set_gate(7, isr_stub_7, 0x08, 0x8e);
- idt_set_gate(8, isr_stub_8, 0x08, 0x8e);
- idt_set_gate(9, isr_stub_9, 0x08, 0x8e);
- idt_set_gate(10, isr_stub_10, 0x08, 0x8e);
- idt_set_gate(11, isr_stub_11, 0x08, 0x8e);
- idt_set_gate(12, isr_stub_12, 0x08, 0x8e);
- idt_set_gate(13, isr_stub_13, 0x08, 0x8e);
- idt_set_gate(14, isr_stub_14, 0x08, 0x8e);
- idt_set_gate(15, isr_stub_15, 0x08, 0x8e);
- idt_set_gate(16, isr_stub_16, 0x08, 0x8e);
- idt_set_gate(17, isr_stub_17, 0x08, 0x8e);
- idt_set_gate(18, isr_stub_18, 0x08, 0x8e);
- idt_set_gate(19, isr_stub_19, 0x08, 0x8e);
- idt_set_gate(20, isr_stub_20, 0x08, 0x8e);
- idt_set_gate(21, isr_stub_21, 0x08, 0x8e);
- idt_set_gate(22, isr_stub_22, 0x08, 0x8e);
- idt_set_gate(23, isr_stub_23, 0x08, 0x8e);
- idt_set_gate(24, isr_stub_24, 0x08, 0x8e);
- idt_set_gate(25, isr_stub_25, 0x08, 0x8e);
- idt_set_gate(26, isr_stub_26, 0x08, 0x8e);
- idt_set_gate(27, isr_stub_27, 0x08, 0x8e);
- idt_set_gate(28, isr_stub_28, 0x08, 0x8e);
- idt_set_gate(29, isr_stub_29, 0x08, 0x8e);
- idt_set_gate(30, isr_stub_30, 0x08, 0x8e);
- idt_set_gate(31, isr_stub_31, 0x08, 0x8e);
+ idt_set_gate(0, isr_stub_0, 0x08, IDT_EXCEPTION);
+ idt_set_gate(1, isr_stub_1, 0x08, IDT_EXCEPTION);
+ idt_set_gate(2, isr_stub_2, 0x08, IDT_EXCEPTION);
+ idt_set_gate(3, isr_stub_3, 0x08, IDT_EXCEPTION);
+ idt_set_gate(4, isr_stub_4, 0x08, IDT_EXCEPTION);
+ idt_set_gate(5, isr_stub_5, 0x08, IDT_EXCEPTION);
+ idt_set_gate(6, isr_stub_6, 0x08, IDT_EXCEPTION);
+ idt_set_gate(7, isr_stub_7, 0x08, IDT_EXCEPTION);
+ idt_set_gate(8, isr_stub_8, 0x08, IDT_EXCEPTION);
+ idt_set_gate(9, isr_stub_9, 0x08, IDT_EXCEPTION);
+ idt_set_gate(10, isr_stub_10, 0x08, IDT_EXCEPTION);
+ idt_set_gate(11, isr_stub_11, 0x08, IDT_EXCEPTION);
+ idt_set_gate(12, isr_stub_12, 0x08, IDT_EXCEPTION);
+ idt_set_gate(13, isr_stub_13, 0x08, IDT_EXCEPTION);
+ idt_set_gate(14, isr_stub_14, 0x08, IDT_EXCEPTION);
+ idt_set_gate(15, isr_stub_15, 0x08, IDT_EXCEPTION);
+ idt_set_gate(16, isr_stub_16, 0x08, IDT_EXCEPTION);
+ idt_set_gate(17, isr_stub_17, 0x08, IDT_EXCEPTION);
+ idt_set_gate(18, isr_stub_18, 0x08, IDT_EXCEPTION);
+ idt_set_gate(19, isr_stub_19, 0x08, IDT_EXCEPTION);
+ idt_set_gate(20, isr_stub_20, 0x08, IDT_EXCEPTION);
+ idt_set_gate(21, isr_stub_21, 0x08, IDT_EXCEPTION);
+ idt_set_gate(22, isr_stub_22, 0x08, IDT_EXCEPTION);
+ idt_set_gate(23, isr_stub_23, 0x08, IDT_EXCEPTION);
+ idt_set_gate(24, isr_stub_24, 0x08, IDT_EXCEPTION);
+ idt_set_gate(25, isr_stub_25, 0x08, IDT_EXCEPTION);
+ idt_set_gate(26, isr_stub_26, 0x08, IDT_EXCEPTION);
+ idt_set_gate(27, isr_stub_27, 0x08, IDT_EXCEPTION);
+ idt_set_gate(28, isr_stub_28, 0x08, IDT_EXCEPTION);
+ idt_set_gate(29, isr_stub_29, 0x08, IDT_EXCEPTION);
+ idt_set_gate(30, isr_stub_30, 0x08, IDT_EXCEPTION);
+ idt_set_gate(31, isr_stub_31, 0x08, IDT_EXCEPTION);
__asm__ volatile("lidt %0" : : "memory"(idtr));
__asm__ volatile("sti");