diff options
Diffstat (limited to 'arch/x86_64/hal')
| -rw-r--r-- | arch/x86_64/hal/msr.c | 15 | ||||
| -rw-r--r-- | arch/x86_64/hal/msr.h | 2 | ||||
| -rw-r--r-- | arch/x86_64/hal/process.c | 2 | ||||
| -rw-r--r-- | arch/x86_64/hal/uacpi.c | 15 |
4 files changed, 33 insertions, 1 deletions
diff --git a/arch/x86_64/hal/msr.c b/arch/x86_64/hal/msr.c index f27e303..849f0ff 100644 --- a/arch/x86_64/hal/msr.c +++ b/arch/x86_64/hal/msr.c @@ -44,6 +44,21 @@ msr_enable_sce(void) } void +msr_enable_sse(void) +{ + uint64_t cr4 = 0; + __asm__ volatile("mov %%cr4, %0": "=r"(cr4)); + + cr4 &= 0xFFFFFFFFFFFFFFFB; + cr4 |= 0x2; + __asm__ volatile("mov %0, %%cr4":: "r"(cr4)); + __asm__ volatile("mov %%cr4, %0": "=r"(cr4)); + + cr4 |= (3 << 9); + __asm__ volatile("mov %0, %%cr4":: "r"(cr4)); +} + +void msr_set_lstar(void *lstar_value) { union msr_lstar lstar; diff --git a/arch/x86_64/hal/msr.h b/arch/x86_64/hal/msr.h index 69d96be..f65b621 100644 --- a/arch/x86_64/hal/msr.h +++ b/arch/x86_64/hal/msr.h @@ -40,6 +40,8 @@ void msr_set_gs_base(uintptr_t gs_base); uintptr_t msr_get_gs_base(void); void msr_enable_sce(void); +void msr_enable_sse(void); + void msr_set_lstar(void *syscall_entry); void msr_read(uint32_t msr, uint32_t *lo, uint32_t *hi); diff --git a/arch/x86_64/hal/process.c b/arch/x86_64/hal/process.c index 872be5a..6cc9372 100644 --- a/arch/x86_64/hal/process.c +++ b/arch/x86_64/hal/process.c @@ -41,7 +41,7 @@ pcb_rootdir(pcb_t *pcb) void processing_setup(void (*process_main)) { - uintptr_t ksp = ((uintptr_t)&s_init_pcb_bytes) + 0xFF0; + uintptr_t ksp = ((uintptr_t)&s_init_pcb_bytes) + 0xFF8; s_init_pcb->pid = 1; s_init_pcb->ksp = (void*)ksp; diff --git a/arch/x86_64/hal/uacpi.c b/arch/x86_64/hal/uacpi.c new file mode 100644 index 0000000..052f849 --- /dev/null +++ b/arch/x86_64/hal/uacpi.c @@ -0,0 +1,15 @@ +#include "lib/printf.h" +#include "uacpi/kernel_api.h" +#include "paging.h" + +void *uacpi_kernel_map(uacpi_phys_addr addr, uacpi_size len) +{ + //kprintf("UACPI kernel map %p -> %p\n", addr, (uintptr_t)addr | IDENT_VIRT_BASE); + return (void*)(addr | IDENT_VIRT_BASE); +} + +void uacpi_kernel_unmap(void *addr, uacpi_size len) +{ + (void)addr; + (void)len; +} |
