diff options
Diffstat (limited to 'arch/i686/include')
-rw-r--r-- | arch/i686/include/gdt.h | 5 | ||||
-rw-r--r-- | arch/i686/include/idt.h | 18 | ||||
-rw-r--r-- | arch/i686/include/sys/control.h | 9 |
3 files changed, 27 insertions, 5 deletions
diff --git a/arch/i686/include/gdt.h b/arch/i686/include/gdt.h index 6badf84..9148c3d 100644 --- a/arch/i686/include/gdt.h +++ b/arch/i686/include/gdt.h @@ -47,11 +47,6 @@ _Static_assert(sizeof(struct SegmentDescriptor_t) == 8); void SegmentDescriptor(struct SegmentDescriptor_t *self, unsigned base, unsigned limit, uint8_t access); -struct __attribute__((packed)) Pointer { - uint16_t limit; - uint32_t base; -}; - void gdt_install(); enum SegmentIndex { diff --git a/arch/i686/include/idt.h b/arch/i686/include/idt.h new file mode 100644 index 0000000..22dc6de --- /dev/null +++ b/arch/i686/include/idt.h @@ -0,0 +1,18 @@ +#pragma once + +#include <stdint.h> + +struct interrupt_frame { + uint32_t ip; + uint32_t cs; + uint32_t flags; + uint32_t sp; + uint32_t ss; +}; + +void abort_handler(struct interrupt_frame *frame); +void interrupt_handler(struct interrupt_frame *frame); +void interrupt_handler_e(struct interrupt_frame *frame, uint32_t error); +void syscall_handler(struct interrupt_frame *frame); + +void idt_install(); diff --git a/arch/i686/include/sys/control.h b/arch/i686/include/sys/control.h new file mode 100644 index 0000000..a40a67f --- /dev/null +++ b/arch/i686/include/sys/control.h @@ -0,0 +1,9 @@ +#pragma once + +static void +abort() +{ + asm volatile(R"(cli +h: hlt +jmp h)"); +} |