From a8bdb6e1ad88532b135878bb4ced9bdc799e730f Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 21 Apr 2024 20:17:18 -0300 Subject: [PATCH] x86-64: properly set up x87 state --- kernel-src/arch/x86-64/cpu.c | 9 +++++++++ kernel-src/include/x86-64/arch/context.h | 10 ++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/kernel-src/arch/x86-64/cpu.c b/kernel-src/arch/x86-64/cpu.c index f5ee4677..b3602e1a 100644 --- a/kernel-src/arch/x86-64/cpu.c +++ b/kernel-src/arch/x86-64/cpu.c @@ -40,4 +40,13 @@ void cpu_initstate() { "or $0b11000000000, %%rax;" "mov %%rax, %%cr4;" : : : "rax"); + + // set NE in cr0 and reset x87 fpu + asm volatile( + "fninit;" + "mov %%cr0, %%rax;" + "or $0b100000, %%rax;" + "mov %%rax, %%cr0;" + : : : "rax" + ); } diff --git a/kernel-src/include/x86-64/arch/context.h b/kernel-src/include/x86-64/arch/context.h index 081049ed..dbfd99cf 100644 --- a/kernel-src/include/x86-64/arch/context.h +++ b/kernel-src/include/x86-64/arch/context.h @@ -54,8 +54,14 @@ typedef struct { } \ (x)->rflags = 0x200; -#define CTX_XINIT(x, u) \ - (x)->mxcsr = 0x1F80; // all exceptions masked +// all sse exceptions masked +// initialise the x87 FPU state as it would be after the FNINIT instruction +#define CTX_XINIT(x, u) {\ + (x)->mxcsr = 0x1F80; \ + *((uint16_t *)&(x)->fx[0]) = 0x37f; \ + *((uint16_t *)&(x)->fx[2]) = 0; \ + (x)->fx[4] = 0; \ + } #define CTX_SP(x) (x)->rsp #define CTX_IP(x) (x)->rip