From f8d0f98e80b3d7d9b24fa077818113fb0f4b3970 Mon Sep 17 00:00:00 2001 From: Olivier Valentin Date: Wed, 24 Jan 2024 09:00:19 +0100 Subject: fpu: Fix cpuid feature detection Make sure to fetch capabilities from cpuid(0xd,0x1) and max structure sizes from cpuid(0xd,0x0). Message-ID: <20240124080019.8136-1-valentio@free.fr> --- i386/i386/fpu.c | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/i386/i386/fpu.c b/i386/i386/fpu.c index fefe5e49..9bf5aecf 100644 --- a/i386/i386/fpu.c +++ b/i386/i386/fpu.c @@ -174,36 +174,26 @@ init_fpu(void) set_xcr0(fp_xsave_support); #endif /* MACH_RING1 */ + 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 " + "is smaller than our minimum %d!\n", + fp_xsave_size, + (int) sizeof(struct i386_fpsave_state)); + eax = 0xd; ecx = 0x1; cpuid(eax, ebx, ecx, edx); - if (eax & CPU_FEATURE_XSAVES) { - 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 " - "is smaller than our minimum %d!\n", - fp_xsave_size, - (int) sizeof(struct i386_fpsave_state)); + if (eax & CPU_FEATURE_XSAVES) fp_save_kind = FP_XSAVES; - } else { - eax = 0xd; - ecx = 0x0; - cpuid(eax, ebx, ecx, edx); - 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 " - "is smaller than our minimum %d!\n", - fp_xsave_size, - (int) sizeof(struct i386_fpsave_state)); - - if (eax & CPU_FEATURE_XSAVEOPT) - fp_save_kind = FP_XSAVEOPT; - else if (eax & CPU_FEATURE_XSAVEC) - fp_save_kind = FP_XSAVEC; - else - fp_save_kind = FP_XSAVE; - } + else if (eax & CPU_FEATURE_XSAVEOPT) + fp_save_kind = FP_XSAVEOPT; + else if (eax & CPU_FEATURE_XSAVEC) + fp_save_kind = FP_XSAVEC; + else + fp_save_kind = FP_XSAVE; fp_kind = FP_387X; } -- cgit v1.2.3