Thanks Ingo, but we may have to reconsider whether cpu_has_xfeatures works in this place https://lore.kernel.org/all/1b8745e0-ae80-4add-b015-affdaa69b369@xxxxxxxxx/ The current code might be accidentally disabling PKU on other PKU-compatible environments? 2025年3月20日(木) 6:39 Ingo Molnar <mingo@xxxxxxxxxx>: > > > * Akihiro Suda <suda.gitsendemail@xxxxxxxxx> wrote: > > > Even when X86_FEATURE_PKU and X86_FEATURE_OSPKE are available, > > XFEATURE_PKRU can be missing. > > In such a case, pkeys has to be disabled to avoid hanging up. > > > > WARNING: CPU: 0 PID: 1 at arch/x86/kernel/fpu/xstate.c:1003 get_xsave_addr_user+0x28/0x40 > > (...) > > Call Trace: > > <TASK> > > ? get_xsave_addr_user+0x28/0x40 > > ? __warn.cold+0x8e/0xea > > ? get_xsave_addr_user+0x28/0x40 > > ? report_bug+0xff/0x140 > > ? handle_bug+0x3b/0x70 > > ? exc_invalid_op+0x17/0x70 > > ? asm_exc_invalid_op+0x1a/0x20 > > ? get_xsave_addr_user+0x28/0x40 > > copy_fpstate_to_sigframe+0x1be/0x380 > > ? __put_user_8+0x11/0x20 > > get_sigframe+0xf1/0x280 > > x64_setup_rt_frame+0x67/0x2c0 > > arch_do_signal_or_restart+0x1b3/0x240 > > syscall_exit_to_user_mode+0xb0/0x130 > > do_syscall_64+0xab/0x1a0 > > entry_SYSCALL_64_after_hwframe+0x77/0x7f > > > > This fix is known to be needed on Apple Virtualization. > > Tested with macOS 13.5.2 running on MacBook Pro 2020 with > > Intel(R) Core(TM) i7-1068NG7 CPU @ 2.30GHz. > > > > Fixes: 70044df250d0 ("x86/pkeys: Update PKRU to enable all pkeys before XSAVE") > > Link: https://lore.kernel.org/regressions/CAG8fp8QvH71Wi_y7b7tgFp7knK38rfrF7rRHh-gFKqeS0gxY6Q@xxxxxxxxxxxxxx/T/#u > > Link: https://github.com/lima-vm/lima/issues/3334 > > > > Signed-off-by: Akihiro Suda <akihiro.suda.cz@xxxxxxxxxxxxx> > > --- > > arch/x86/kernel/cpu/common.c | 3 ++- > > 1 file changed, 2 insertions(+), 1 deletion(-) > > > > diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c > > index e9464fe411ac..4c2c268af214 100644 > > --- a/arch/x86/kernel/cpu/common.c > > +++ b/arch/x86/kernel/cpu/common.c > > @@ -517,7 +517,8 @@ static bool pku_disabled; > > static __always_inline void setup_pku(struct cpuinfo_x86 *c) > > { > > if (c == &boot_cpu_data) { > > - if (pku_disabled || !cpu_feature_enabled(X86_FEATURE_PKU)) > > + if (pku_disabled || !cpu_feature_enabled(X86_FEATURE_PKU) || > > + !cpu_has_xfeatures(XFEATURE_PKRU, NULL)) > > return; > > Note that silent quirks are counterproductive, as they don't give VM > vendors any incentives to fix their VM for such bugs. > > So I changed your quirk to be: > > --- a/arch/x86/kernel/cpu/common.c > +++ b/arch/x86/kernel/cpu/common.c > @@ -519,6 +519,17 @@ static __always_inline void setup_pku(struct cpuinfo_x86 *c) > if (c == &boot_cpu_data) { > if (pku_disabled || !cpu_feature_enabled(X86_FEATURE_PKU)) > return; > + if (!cpu_has_xfeatures(XFEATURE_PKRU, NULL)) { > + /* > + * Missing XFEATURE_PKRU is not really a valid CPU > + * configuration at this point, but apparently > + * Apple Virtualization is affected by this, > + * so return with a FW warning instead of crashing > + * the bootup: > + */ > + WARN_ONCE(1, FW_BUG "Invalid XFEATURE_PKRU configuration.\n"); > + return; > + } > /* > * Setting CR4.PKE will cause the X86_FEATURE_OSPKE cpuid > * bit to be set. Enforce it. > > This is noisy in the syslog, but it's a WARN_ONCE() and it doesn't > crash the bootup. > > Thanks, > > Ingo