bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH gnumach 2/2] fpu: Fix cpuid feature detection


From: Olivier Valentin
Subject: [PATCH gnumach 2/2] fpu: Fix cpuid feature detection
Date: Thu, 8 Feb 2024 17:50:15 +0100

Make sure to fetch capabilities from cpuid(0xd,0x1)
---
 i386/i386/fpu.c | 11 ++++++++---
 1 file 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;
-- 
2.40.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]