summaryrefslogtreecommitdiff
path: root/arch/i386
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386')
-rw-r--r--arch/i386/boot/boot.s (renamed from arch/i386/boot.s)0
-rw-r--r--arch/i386/boot/crti.s (renamed from arch/i386/crti.s)0
-rw-r--r--arch/i386/boot/crtn.s (renamed from arch/i386/crtn.s)0
-rw-r--r--arch/i386/boot/tty.c (renamed from arch/i386/tty.c)0
-rw-r--r--arch/i386/boot/vga.h (renamed from arch/i386/vga.h)0
-rw-r--r--arch/i386/include/gdt.h69
-rw-r--r--arch/i386/kernel/pic.h (renamed from arch/i386/pic.h)0
-rw-r--r--arch/i386/kernel/serial.c (renamed from arch/i386/serial.c)0
-rw-r--r--arch/i386/make.config7
9 files changed, 73 insertions, 3 deletions
diff --git a/arch/i386/boot.s b/arch/i386/boot/boot.s
index 56ac227..56ac227 100644
--- a/arch/i386/boot.s
+++ b/arch/i386/boot/boot.s
diff --git a/arch/i386/crti.s b/arch/i386/boot/crti.s
index 4e1e4cb..4e1e4cb 100644
--- a/arch/i386/crti.s
+++ b/arch/i386/boot/crti.s
diff --git a/arch/i386/crtn.s b/arch/i386/boot/crtn.s
index 447afb1..447afb1 100644
--- a/arch/i386/crtn.s
+++ b/arch/i386/boot/crtn.s
diff --git a/arch/i386/tty.c b/arch/i386/boot/tty.c
index 9c3985b..9c3985b 100644
--- a/arch/i386/tty.c
+++ b/arch/i386/boot/tty.c
diff --git a/arch/i386/vga.h b/arch/i386/boot/vga.h
index e89f202..e89f202 100644
--- a/arch/i386/vga.h
+++ b/arch/i386/boot/vga.h
diff --git a/arch/i386/include/gdt.h b/arch/i386/include/gdt.h
new file mode 100644
index 0000000..4ffa155
--- /dev/null
+++ b/arch/i386/include/gdt.h
@@ -0,0 +1,69 @@
+#ifndef GDT_H
+#define GDT_H
+
+#include <stdint.h>
+
+#define SEG_DESCTYPE(x) ((x) << 0x04)
+#define SEG_PRES(x) ((x) << 0x07)
+#define SEG_SAVL(x) ((x) << 0x0C)
+#define SEG_LONG(x) ((x) << 0x0D)
+#define SEG_SIZE(x) ((x) << 0x0E)
+#define SEG_GRAN(x) ((x) << 0x0F)
+#define SEG_PRIV(x) (((x) & 0x03) << 0x05)
+
+#define SEG_DATA_RD 0x00
+#define SEG_DATA_RDA 0x01
+#define SEG_DATA_RDWR 0x02
+#define SEG_DATA_RDWRA 0x03
+#define SEG_DATA_RDEXPD 0x04
+#define SEG_DATA_RDEXPDA 0x05
+#define SEG_DATA_RDWREXD 0x06
+#define SEG_DATA_RDWREXDA 0x07
+#define SEG_CODE_EX 0x08
+#define SEG_CODE_EXA 0x09
+#define SEG_CODE_EXRD 0x0A
+#define SEG_CODE_EXRDA 0x0B
+#define SEG_CODE_EXC 0x0C
+#define SEG_CODE_EXCA 0x0D
+#define SEG_CODE_EXRDC 0x0E
+#define SEG_CODE_EXRDCA 0x0F
+
+#define GDT_CODE_PL0 SEG_DESCTYPE(1) | SEG_PRES(1) | SEG_SAVL(0) | \
+ SEG_LONG(0) | SEG_SIZE(1) | SEG_GRAN(1) | \
+ SEG_PRIV(0) | SEG_CODE_EXRD
+
+#define GDT_DATA_PL0 SEG_DESCTYPE(1) | SEG_PRES(1) | SEG_SAVL(0) | \
+ SEG_LONG(0) | SEG_SIZE(1) | SEG_GRAN(1) | \
+ SEG_PRIV(0) | SEG_CODE_RDWR
+
+#define GDT_CODE_PL3 SEG_DESCTYPE(1) | SEG_PRES(1) | SEG_SAVL(0) | \
+ SEG_LONG(0) | SEG_SIZE(1) | SEG_GRAN(1) | \
+ SEG_PRIV(3) | SEG_DATA_EXRD
+
+#define GDT_DATA_PL3 SEG_DESCTYPE(1) | SEG_PRES(1) | SEG_SAVL(0) | \
+ SEG_LONG(0) | SEG_SIZE(1) | SEG_GRAN(1) | \
+ SEG_PRIV(3) | SEG_DATA_RDWR
+
+struct gdt {
+ uint16_t size;
+ uint32_t offset;
+} __attribute__((packed));
+
+void flush_gdt(void);
+
+uint64_t create_descriptor(uint32_t base, uint32_t limit, uint16_t flag) {
+ uint64_t descriptor;
+
+ descriptor = limit & 0x000F0000;
+ descriptor |= (flag << 8) & 0x00F0FF00;
+ descriptor |= (base >> 16) & 0x000000FF;
+ descriptor |= base & 0xFF000000;
+
+ descriptor <<= 32;
+ descriptor |= base << 16;
+ descriptor |= limit & 0x0000FFFF;
+
+ return descriptor;
+}
+
+#endif
diff --git a/arch/i386/pic.h b/arch/i386/kernel/pic.h
index da4a2ee..da4a2ee 100644
--- a/arch/i386/pic.h
+++ b/arch/i386/kernel/pic.h
diff --git a/arch/i386/serial.c b/arch/i386/kernel/serial.c
index 20bd8f9..20bd8f9 100644
--- a/arch/i386/serial.c
+++ b/arch/i386/kernel/serial.c
diff --git a/arch/i386/make.config b/arch/i386/make.config
index 680760f..3add948 100644
--- a/arch/i386/make.config
+++ b/arch/i386/make.config
@@ -1,7 +1,8 @@
KERNEL_ARCH_CFLAGS=
KERNEL_ARCH_LDFLAGS=
KERNEL_ARCH_LIBS=
+KERNEL_ARCH_INCLUDE=$(ARCHDIR)/include
-KERNEL_ARCH_OBJS=$(ARCHDIR)/boot.o \
- $(ARCHDIR)/tty.o \
- $(ARCHDIR)/serial.o \
+KERNEL_ARCH_OBJS=$(ARCHDIR)/boot/boot.o \
+ $(ARCHDIR)/boot/tty.o \
+ $(ARCHDIR)/kernel/serial.o \