diff options
Diffstat (limited to 'arch/x86_64/processor.c')
-rw-r--r-- | arch/x86_64/processor.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/arch/x86_64/processor.c b/arch/x86_64/processor.c new file mode 100644 index 0000000..44d437a --- /dev/null +++ b/arch/x86_64/processor.c @@ -0,0 +1,40 @@ +#include "arch/processor.h" +#include "arch/cpu.h" +#include "arch/x86_64/msr.h" + +processor_t s_processors[PROCESSOR_MAX]; +processor_t *proc_bsp = &s_processors[0]; + +extern void x86_64_lgdt(struct XDTR *gdtr); +extern void x86_64_flush_tss(void); +extern void x86_64_lidt(struct XDTR *idtr); + +extern void gdt_setup(processor_t*); +extern void tss_setup(processor_t*); +extern void idt_setup(processor_t*); + +void +processor_setup(processor_t *proc) +{ + gdt_setup(proc); + tss_setup(proc); + idt_setup(proc); + + x86_64_lgdt(&proc->_gdtr); + x86_64_lidt(&proc->_idtr); + x86_64_flush_tss(); + + msr_gsbase_write((uintptr_t)proc); +} + +processor_t* +processor_list(void) +{ + return s_processors; +} + +processor_t* +processor_current(void) +{ + return (processor_t*)msr_gsbase_read(); +} |