summaryrefslogtreecommitdiff
path: root/arch/i386/include/kernel
diff options
context:
space:
mode:
authorDanny Holman <dholman@gymli.org>2024-02-16 13:04:01 -0600
committerDanny Holman <dholman@gymli.org>2024-02-16 13:04:01 -0600
commit95606a6be7c64065d295bdabb1a94fb42108e72f (patch)
tree6abd59826ec586e80d7546959e97503ceec20c41 /arch/i386/include/kernel
parentc37c25b36ab7a0e244132f1556781e82e006ffa1 (diff)
arch: i386: move GDT definitions to their own header
Move all the data structures required for operation of the GDT to their own header file. Signed-off-by: Danny Holman <dholman@gymli.org>
Diffstat (limited to 'arch/i386/include/kernel')
-rw-r--r--arch/i386/include/kernel/gdt.h55
1 files changed, 55 insertions, 0 deletions
diff --git a/arch/i386/include/kernel/gdt.h b/arch/i386/include/kernel/gdt.h
new file mode 100644
index 0000000..532881a
--- /dev/null
+++ b/arch/i386/include/kernel/gdt.h
@@ -0,0 +1,55 @@
+#ifndef I386_GDT_H
+#define I386_GDT_H
+
+#include <stdint.h>
+
+struct gdt_entry {
+ uint16_t limit_low;
+ uint16_t base_low;
+ uint8_t base_middle;
+ uint8_t access;
+ uint8_t gran;
+ uint8_t base_high;
+} __attribute__((packed));
+
+struct gdt_ptr {
+ uint16_t limit;
+ uint32_t base;
+} __attribute__((packed));
+
+struct tss_entry {
+ uint32_t link;
+ uint32_t esp0;
+ uint32_t ss0;
+ uint32_t esp1;
+ uint32_t ss2;
+ uint32_t cr3;
+ uint32_t eip;
+ uint32_t eflags;
+ uint32_t eax;
+ uint32_t ecx;
+ uint32_t edx;
+ uint32_t ebx;
+ uint32_t esp;
+ uint32_t ebp;
+ uint32_t esi;
+ uint32_t edi;
+ uint32_t es;
+ uint32_t cs;
+ uint32_t ss;
+ uint32_t ds;
+ uint32_t fs;
+ uint32_t gs;
+ uint32_t ldtr;
+ uint16_t trap;
+ uint16_t iomap_base;
+} __attribute__((packed));
+
+void gdt_set_gate(int num, uint32_t base, uint32_t limit, uint8_t access, uint8_t gran);
+void write_tss(int num, uint32_t ss0, uint32_t esp0);
+void set_kernel_esp(uint32_t esp);
+void gdt_install(void);
+
+void flush_gdt(void);
+
+#endif