45 #define GDT_CPL_MASK 3 46 #define GDT_CPL_RING0 0 47 #define GDT_CPL_RING3 3 55 #define INT_TYPE_TASK32 0x5 56 #define INT_TYPE_INT16 0x6 57 #define INT_TYPE_TRAP16 0x7 58 #define INT_TYPE_INT32 0xE 59 #define INT_TYPE_TRAP32 0xF 65 #define KERNELSTACK_SIZE PAGE_SIZE 72 #define GDT_MAX_SIZE 0x10000 74 #define GDT_MAX_PAGES ((GDT_MAX_SIZE + PAGE_MASK) >> PAGE_BITS) 76 #define GDT_MAX_COUNT (GDT_MAX_SIZE / sizeof(struct GDTEntry)) 84 #define IDT_MAX_SIZE PAGE_SIZE 86 #define IDT_MAX_COUNT 256 93 #define USERMODE_KERNELSTACK_ADDRESS 0xFF800000 94 #define USERMODE_GDT_ADDRESS 0xFF801000 95 #define USERMODE_IDT_ADDRESS 0xFF811000 96 #define USERMODE_INTJMP_ADDRESS 0xFF812000 97 #define USERMODE_TASK_ADDRESS 0xFF813000 99 #define USERMODE_KERNELSTACK_LIMIT (USERMODE_KERNELSTACK_ADDRESS + KERNELSTACK_SIZE) 102 #define USERMODE_INTJMP_ENABLE_FPU (USERMODE_INTJMP_ADDRESS + 2048)
void gdtEntrySetAddress(struct GDTEntry *entry, uint32_t address)
Helper function to set the address inside a GDTEntry.
struct GDTEntry * gdtGetFreeEntry()
Get a free entry in the GDT.
void gdtReleaseEntry(struct GDTEntry *entry)
Mark a GDTEntry as free.
struct GDTEntry * codeRing3
struct GDTEntry * dataRing0
uint32_t gdtGetEntryOffset(struct GDTEntry *entry, uint32_t ring)
Determines the offset of a GDT entry.
uint32_t tssRunUsermodeThread(struct thread *t)
Run a thread.
struct GDTEntry * dataRing3
void * intJmpTable_kernel
struct GDTEntry * usermodeTask
void gdtEntrySetLimit(struct GDTEntry *entry, uint64_t length)
Helper function to set the length inside a GDTEntry.
struct GDTEntry * kernelTask
struct GDTEntry * codeRing0
void gdtInit()
Initializes the GDT, task registers, and sets up everything required for multiprocessing.
struct GDTTable __attribute__((packed))