From fce640c0f9b4f31601c7c43053fa2053a7a1f7c7 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sat, 20 Aug 2022 11:58:05 -0300 Subject: [PATCH] sse support --- src/arch/x86_64/cpu.c | 11 +++++++++++ src/arch/x86_64/include/arch/regs.h | 1 + src/arch/x86_64/regs.c | 5 ++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/arch/x86_64/cpu.c b/src/arch/x86_64/cpu.c index 5780ad61..33991fc8 100644 --- a/src/arch/x86_64/cpu.c +++ b/src/arch/x86_64/cpu.c @@ -37,4 +37,15 @@ void cpu_state_init(){ // undefined opcode exception will handle system calls then else printf("CPU%lu: syscall instruction not supported\n", arch_getcls()->lapicid); + // enable SSE + + asm volatile( + "mov %%cr0, %%rax;" + "and $0xFFFB, %%ax;" + "or $2, %%eax;" + "mov %%rax, %%cr0;" + "mov %%cr4, %%rax;" + "or $0b11000000000, %%rax;" + "mov %%rax, %%cr4;" + : : : "rax"); } diff --git a/src/arch/x86_64/include/arch/regs.h b/src/arch/x86_64/include/arch/regs.h index 770c2708..b19462e7 100644 --- a/src/arch/x86_64/include/arch/regs.h +++ b/src/arch/x86_64/include/arch/regs.h @@ -6,6 +6,7 @@ typedef struct{ uint64_t gsbase, fsbase; + uint8_t fx[512]; } arch_extraregs; typedef struct{ diff --git a/src/arch/x86_64/regs.c b/src/arch/x86_64/regs.c index 767b1815..2808c0d3 100644 --- a/src/arch/x86_64/regs.c +++ b/src/arch/x86_64/regs.c @@ -4,13 +4,16 @@ void arch_regs_saveextra(arch_extraregs* regs){ // user gs was swapped regs->gsbase = rdmsr(MSR_KERNELGSBASE); - regs->fsbase = rdmsr(MSR_FSBASE); + regs->fsbase = rdmsr(MSR_FSBASE); + asm("fxsave (%%rax)" : : "a"(®s->fx[0])); + } void arch_regs_setupextra(arch_extraregs* regs){ // gs will be swapped later wrmsr(MSR_KERNELGSBASE, regs->gsbase); wrmsr(MSR_FSBASE, regs->fsbase); + asm("fxrstor (%%rax)" : : "a"(®s->fx[0])); } void arch_regs_setupkernel(arch_regs* regs, void* ip, void* stack, bool interrupts){