diff options
author | Olivier Valentin <valentio@free.fr> | 2024-02-08 17:50:15 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2024-02-08 21:42:54 +0100 |
commit | 274626ed5398db8e44dc995078dbd00e2aa0c1b0 (patch) | |
tree | 057d1482e1917f500185cc0fdd0f90f1f444a1d2 /i386 | |
parent | 41a4430cb913183f9b0aaa7f04ce5c2514b2de7c (diff) | |
download | gnumach-274626ed5398db8e44dc995078dbd00e2aa0c1b0.tar.gz gnumach-274626ed5398db8e44dc995078dbd00e2aa0c1b0.tar.bz2 gnumach-274626ed5398db8e44dc995078dbd00e2aa0c1b0.zip |
fpu: Fix cpuid feature detection
Make sure to fetch capabilities from cpuid(0xd,0x1)
Message-ID: <20240208165015.4700-3-valentio@free.fr>
Diffstat (limited to 'i386')
-rw-r--r-- | i386/i386/fpu.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/i386/i386/fpu.c b/i386/i386/fpu.c index fefe5e49..4cd31dd9 100644 --- a/i386/i386/fpu.c +++ b/i386/i386/fpu.c @@ -163,6 +163,7 @@ init_fpu(void) if (CPU_HAS_FEATURE(CPU_FEATURE_XSAVE)) { unsigned eax, ebx, ecx, edx; + unsigned xsave_cpu_features; eax = 0xd; ecx = 0x0; @@ -177,7 +178,10 @@ init_fpu(void) eax = 0xd; ecx = 0x1; cpuid(eax, ebx, ecx, edx); - if (eax & CPU_FEATURE_XSAVES) { + xsave_cpu_features = eax; + + if (xsave_cpu_features & CPU_FEATURE_XSAVES) { + // all states enabled by XCR0|IA32_XSS fp_xsave_size = offsetof(struct i386_fpsave_state, xfp_save_state) + ebx; if (fp_xsave_size < sizeof(struct i386_fpsave_state)) panic("CPU-provided xstate size %d " @@ -190,6 +194,7 @@ init_fpu(void) eax = 0xd; ecx = 0x0; cpuid(eax, ebx, ecx, edx); + // all states enabled by XCR0 fp_xsave_size = offsetof(struct i386_fpsave_state, xfp_save_state) + ebx; if(fp_xsave_size < sizeof(struct i386_fpsave_state)) panic("CPU-provided xstate size %d " @@ -197,9 +202,9 @@ init_fpu(void) fp_xsave_size, (int) sizeof(struct i386_fpsave_state)); - if (eax & CPU_FEATURE_XSAVEOPT) + if (xsave_cpu_features & CPU_FEATURE_XSAVEOPT) fp_save_kind = FP_XSAVEOPT; - else if (eax & CPU_FEATURE_XSAVEC) + else if (xsave_cpu_features & CPU_FEATURE_XSAVEC) fp_save_kind = FP_XSAVEC; else fp_save_kind = FP_XSAVE; |