diff options
| author | Jon Santmyer <jon@jonsantmyer.com> | 2025-08-19 15:03:42 -0400 |
|---|---|---|
| committer | Jon Santmyer <jon@jonsantmyer.com> | 2025-08-19 15:03:42 -0400 |
| commit | 772717dc22e04b4d168d0f77bee6b6357118768c (patch) | |
| tree | 9da95703c3376091904e295930104b51c280008d /arch/x86_64/processor.c | |
| parent | 7ee9347560768641096df68c545ac085a20233e4 (diff) | |
| download | jove-kernel-old-772717dc22e04b4d168d0f77bee6b6357118768c.tar.gz jove-kernel-old-772717dc22e04b4d168d0f77bee6b6357118768c.tar.bz2 jove-kernel-old-772717dc22e04b4d168d0f77bee6b6357118768c.zip | |
refactor KO_MEMORY_MAPPING invoke
Diffstat (limited to 'arch/x86_64/processor.c')
| -rw-r--r-- | arch/x86_64/processor.c | 135 |
1 files changed, 0 insertions, 135 deletions
diff --git a/arch/x86_64/processor.c b/arch/x86_64/processor.c deleted file mode 100644 index f7e5cac..0000000 --- a/arch/x86_64/processor.c +++ /dev/null @@ -1,135 +0,0 @@ -#include "device/processor.h" -#include "arch/x86_64/tables.h" -#include "include/arch/x86_64/idt.h" -#include "include/arch/x86_64/object.h" -#include "jove.h" - -processor_t s_bsp = { - .odir = &_initDirectory -}; - -struct jove_ObjectDirectory s_processor_dir = { - .entries = { - [0] = { - .type = KO_OBJECT_DIRECTORY, - .data = 2 - }, - [1] = { - .type = KO_DEV_PROCESSOR, - .data = (uintptr_t)&s_bsp - } - } -}; - -char s_initial_response_buffer[256] = { 0 }; - -typedef union msr_efer -{ - struct { - uint8_t sce : 1; - uint8_t resv : 7; - uint8_t lme : 1; - uint8_t unk0 : 1; - uint8_t lma : 1; - uint8_t nxe : 1; - uint8_t svme : 1; - uint8_t lmsle : 1; - uint8_t ffxsr : 1; - uint8_t tce : 1; - }; - uint32_t v[2]; -} msr_efer_t; - -typedef union msr_star -{ - struct { - uint32_t eip; - uint16_t kcs; - uint16_t ucs; - }; - uint32_t v[2]; -} msr_star_t; - -typedef union msr_lstar -{ - uint32_t v[2]; - uintptr_t ip; -} msr_lstar_t; - -static void -s_enable_sce(void) -{ - msr_efer_t feat; - rdmsr(MSR_EFER, &feat.v[0], &feat.v[1]); - - feat.sce = 1; - wrmsr(MSR_EFER, feat.v[0], feat.v[1]); - - msr_star_t star; - star.kcs = GDT_OFFSET_KERNEL_CODE; - star.ucs = GDT_OFFSET_USER_CODE; - wrmsr(MSR_STAR, star.v[0], star.v[1]); - - extern void _syscall_entry(void); - msr_lstar_t lstar; - lstar.ip = (uintptr_t)_syscall_entry; - wrmsr(MSR_LSTAR, lstar.v[0], lstar.v[1]); -} - -void -processor_setup(void *_processor) -{ - processor_t *processor = (processor_t*)_processor; - gdt_setup(processor); - idt_setup(processor); - - wrmsr(MSR_GS_BASE, - (uint32_t)((uintptr_t)_processor & 0xFFFFFFFF), - (uint32_t)((uintptr_t)_processor >> 32)); -} - -void enable_fpu(void); -void enable_sse(void); -void enable_avx(void); - -void -bsp_setup(void) -{ -#ifdef ENABLE_SSE - enable_fpu(); - enable_sse(); -#endif -#ifdef ENABLE_AVX - enable_avx(); -#endif - - _initDirectory.entries[INIT_OBJECT_PROCESSOR_DIR] = (objdir_entry_t) { - .type = KO_OBJECT_DIRECTORY, - .data = (uintptr_t)(&s_processor_dir) - }; - - ivt_setup(); - s_enable_sce(); - - processor_setup(&s_bsp); -} - -void -rdmsr(uint32_t msr, uint32_t *lo, uint32_t *hi) -{ - __asm__ volatile("rdmsr": "=a"(*lo), "=d"(*hi): "c"(msr)); -} - -void -wrmsr(uint32_t msr, uint32_t lo, uint32_t hi) -{ - __asm__ volatile("wrmsr":: "a"(lo), "d"(hi), "c"(msr)); -} - -void* -processor_current(void) -{ - uint64_t r = 0; - rdmsr(MSR_GS_BASE, (uint32_t*)&r, ((uint32_t*)&r) + 1); - return (void*)r; -} |
