diff options
author | Danny Holman <dholman@gymli.xyz> | 2021-01-24 21:10:57 -0600 |
---|---|---|
committer | Danny Holman <dholman@gymli.xyz> | 2021-01-24 21:10:57 -0600 |
commit | a4534660fecb1b571c24ad82e67bc6c2fb814cb9 (patch) | |
tree | 149984cb0e9a32765e63df0f696091817c2b6dd5 /arch/i386/include | |
parent | dd6656f7132d1727a055035ca94945fa4fbaae58 (diff) |
x86: reorganize the i386 directory
Add structure to the internals of the x86 directory.
Signed-off-by: Danny Holman <dholman@gymli.xyz>
Diffstat (limited to 'arch/i386/include')
-rw-r--r-- | arch/i386/include/gdt.h | 69 |
1 files changed, 69 insertions, 0 deletions
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 |