summaryrefslogtreecommitdiff
path: root/i386
diff options
context:
space:
mode:
authorOlivier Valentin <valentio@free.fr>2024-02-08 17:50:15 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2024-02-08 21:42:54 +0100
commit274626ed5398db8e44dc995078dbd00e2aa0c1b0 (patch)
tree057d1482e1917f500185cc0fdd0f90f1f444a1d2 /i386
parent41a4430cb913183f9b0aaa7f04ce5c2514b2de7c (diff)
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.c11
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;