Commit 48280042 authored by Andrew Cooper's avatar Andrew Cooper Committed by Borislav Petkov

x86/fpu/xstate: Fix XSTATE_WARN_ON() to emit relevant diagnostics

"XSAVE consistency problem" has been reported under Xen, but that's the extent
of my divination skills.

Modify XSTATE_WARN_ON() to force the caller to provide relevant diagnostic
information, and modify each caller suitably.

For check_xstate_against_struct(), this removes a double WARN() where one will
do perfectly fine.

CC stable as this has been wonky debugging for 7 years and it is good to
have there too.
Signed-off-by: default avatarAndrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20220810221909.12768-1-andrew.cooper3@citrix.com
parent f0c4d9fc
...@@ -440,8 +440,8 @@ static void __init __xstate_dump_leaves(void) ...@@ -440,8 +440,8 @@ static void __init __xstate_dump_leaves(void)
} }
} }
#define XSTATE_WARN_ON(x) do { \ #define XSTATE_WARN_ON(x, fmt, ...) do { \
if (WARN_ONCE(x, "XSAVE consistency problem, dumping leaves")) { \ if (WARN_ONCE(x, "XSAVE consistency problem: " fmt, ##__VA_ARGS__)) { \
__xstate_dump_leaves(); \ __xstate_dump_leaves(); \
} \ } \
} while (0) } while (0)
...@@ -554,8 +554,7 @@ static bool __init check_xstate_against_struct(int nr) ...@@ -554,8 +554,7 @@ static bool __init check_xstate_against_struct(int nr)
(nr >= XFEATURE_MAX) || (nr >= XFEATURE_MAX) ||
(nr == XFEATURE_PT_UNIMPLEMENTED_SO_FAR) || (nr == XFEATURE_PT_UNIMPLEMENTED_SO_FAR) ||
((nr >= XFEATURE_RSRVD_COMP_11) && (nr <= XFEATURE_RSRVD_COMP_16))) { ((nr >= XFEATURE_RSRVD_COMP_11) && (nr <= XFEATURE_RSRVD_COMP_16))) {
WARN_ONCE(1, "no structure for xstate: %d\n", nr); XSTATE_WARN_ON(1, "No structure for xstate: %d\n", nr);
XSTATE_WARN_ON(1);
return false; return false;
} }
return true; return true;
...@@ -598,12 +597,13 @@ static bool __init paranoid_xstate_size_valid(unsigned int kernel_size) ...@@ -598,12 +597,13 @@ static bool __init paranoid_xstate_size_valid(unsigned int kernel_size)
* XSAVES. * XSAVES.
*/ */
if (!xsaves && xfeature_is_supervisor(i)) { if (!xsaves && xfeature_is_supervisor(i)) {
XSTATE_WARN_ON(1); XSTATE_WARN_ON(1, "Got supervisor feature %d, but XSAVES not advertised\n", i);
return false; return false;
} }
} }
size = xstate_calculate_size(fpu_kernel_cfg.max_features, compacted); size = xstate_calculate_size(fpu_kernel_cfg.max_features, compacted);
XSTATE_WARN_ON(size != kernel_size); XSTATE_WARN_ON(size != kernel_size,
"size %u != kernel_size %u\n", size, kernel_size);
return size == kernel_size; return size == kernel_size;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment