diff options
Diffstat (limited to 'arch')
-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.h | 69 | ||||
-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.config | 7 |
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 \ |