aboutsummaryrefslogtreecommitdiff
path: root/arch/i686/include
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i686/include')
-rw-r--r--arch/i686/include/gdt.h5
-rw-r--r--arch/i686/include/idt.h18
-rw-r--r--arch/i686/include/sys/control.h9
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)");
+}