Some more data on this, in case it helps either the KVM or the Hyper-V
side. It is also tracked, with the WSL logs, at
https://github.com/microsoft/WSL/issues/41709
1. Setup
--------
Host: Windows 11 Pro 25H2, OS build 26200.9457 (fully up to date
through Windows Update), WSL 2.9.3.0, AMD Ryzen 9 7940HX
L1: WSL2 kernel 6.18.35.2-microsoft-standard-WSL2, kvm_amd nested=1
L2: Windows 11 25H2 guest, q35, 4 vCPUs, 8GiB RAM,
OVMF_CODE_4M.ms.fd (Secure Boot, SMM), swtpm,
QEMU 10.2.1, libvirt 12.0.0
Wei mentioned that this may already be fixed in Hyper-V. Since it
still reproduces on the latest released build above, the fix does not
seem to be in released builds yet. Which build or channel carries it?
I am happy to test it.
2. Not a recent regression
--------------------------
The libvirt log of this guest on the same machine shows the same
"KVM: entry failed, hardware error 0xffffffff" going back a year:
WSL kernel Period Boots Failures
5.15.167.4-microsoft-... 2025-09-01 .. 2025-10-01 127 133
6.18.35.2-microsoft-... 2026-09-24 .. 2026-09-28 15 21
6.18.35.2 + this patch (v2) 2026-09-29 1 0
3. Testing of v2
----------------
I applied v2 to the WSL2 6.18.35.2 kernel and traced enter_smm() with
bpftrace, recording vcpu->arch.cr3 on entry and on return, while the
guest booted from firmware to the Windows desktop with SMM and Secure
Boot enabled:
SMM entries in total: 7532
entries with CR3 above 4GiB before entry: 1185
of those, CR3[63:32] cleared on return: 1185
VMRUN failures: 0
For example:
vcpu=1 cr3 before=0x13aa12000 after=0x3aa12000
Every one of those 1185 entries would have hit the failure without the
patch, and the guest returned from SMM normally in all cases.
4. The rejected VMCB
--------------------
To capture the failing state without restarting WSL, I built an
unpatched kvm.ko/kvm-amd.ko for the same running kernel, loaded them
with kvm_amd.dump_invalid_vmcb=1 and booted the guest. It failed at
SMM entry again, with CR3 above 4GiB.
The relevant fields are exit_code ffffffff, rip 8000 (first instruction
of the SMI handler), cr0 00050032 (PE=0, PG=0), efer 00001000 (SVME
only, LMA=0), event_inj 0 (no pending event), and cr3 0000000262906000,
i.e. CR3[63:32] = 0x2 outside of long mode. The full dump:
SVM vCPU1 VMCB 000000004a03e896, last attempted VMRUN on CPU 2
VMCB Control Area:
cr_read: 0010
cr_write: 0010
dr_read: 00ff
dr_write: 00ff
exceptions: 00060042
intercepts: bddc8027 00006e7f
pause filter count: 3000
pause filter threshold:128
iopm_base_pa: 000000034604c000
msrpm_base_pa: 00000003d50da000
tsc_offset: ffffbe16edc138b1
asid: 8
tlb_ctl: 0
int_ctl: 01000000
int_vector: 00000000
int_state: 00000000
exit_code: ffffffff
exit_info1: 0000000000000000
exit_info2: 0000000000000000
exit_int_info: 00000000
exit_int_info_err: 00000000
nested_ctl: 1
nested_cr3: 0000000260eac000
avic_vapic_bar: 0000000000000000
ghcb: 0000000000000000
event_inj: 00000000
event_inj_err: 00000000
virt_ext: 0
next_rip: 0000000000000000
avic_backing_page: 0000000000000000
avic_logical_id: 0000000000000000
avic_physical_id: 0000000000000000
vmsa_pa: 0000000000000000
allowed_sev_features:0000000000000000
guest_sev_features: 0000000000000000
VMCB State Save Area:
es: s: 0000 a: 0893 l: ffffffff b: 0000000000000000
cs: s: fb00 a: 0893 l: ffffffff b: 000000007bffb000
ss: s: 0000 a: 0893 l: ffffffff b: 0000000000000000
ds: s: 0000 a: 0893 l: ffffffff b: 0000000000000000
fs: s: 0000 a: 0893 l: ffffffff b: 0000000000000000
gs: s: 0000 a: 0893 l: ffffffff b: 0000000000000000
gdtr: s: 0000 a: 0000 l: 00000057 b: ffff9a0133f5ffb0
ldtr: s: 0000 a: 0000 l: 00000000 b: 0000000000000000
idtr: s: 0000 a: 0000 l: 00000000 b: 0000000000000000
tr: s: 0040 a: 008b l: 00000067 b: ffff9a0133f5e000
vmpl: 0 cpl: 0 efer: 0000000000001000
cr0: 0000000000050032 cr2: ffffe7888c4ec690
cr3: 0000000262906000 cr4: 0000000000000040
dr6: 00000000ffff0ff0 dr7: 0000000000000400
rip: 0000000000008000 rflags: 0000000000000002
rsp: ffffbf0c30b864d8 rax: 0000000000000000
s_cet: 0000000000000000 ssp: 0000000000000000
isst_addr: 0000000000000000
star: 0023001000000000 lstar: fffff801b9ac1840
cstar: fffff801b9ac1300 sfmask: 0000000000004700
kernel_gs_base: 000000caa8494000 sysenter_cs: 0000000000000000
sysenter_esp: 0000000000000000 sysenter_eip: 0000000000000000
gpat: 0007010600070106 dbgctl: 0000000000000000
br_from: 0000000000000000 br_to: 0000000000000000
excp_from: 0000000000000000 excp_to: 0000000000000000
rax: 0000000000000000 rbx: fffff8014d990018
rcx: 00000000000000b2 rdx: 00000000000000b2
rsi: 0000000000000200 rdi: 0000000000000218
rbp: ffffbf0c30b86500 rsp: ffffbf0c30b864d8
r8: 0000000000000000 r9: 0000000000000000
r10: 0000000000000000 r11: ffff89fdab000000
r12: ffffbf0c30b86720 r13: fffff8014d990060
r14: fffff8014d990078 r15: 0000000000000002
And QEMU's view of the same vCPU (it only prints CR3[31:0] here):
KVM: entry failed, hardware error 0xffffffff
EAX=00000000 EBX=4d990018 ECX=000000b2 EDX=000000b2
ESI=00000200 EDI=00000218 EBP=30b86500 ESP=30b864d8
EIP=00008000 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=1 HLT=0
ES =0000 00000000 ffffffff 00809300
CS =fb00 7bffb000 ffffffff 00809300
SS =0000 00000000 ffffffff 00809300
DS =0000 00000000 ffffffff 00809300
FS =0000 00000000 ffffffff 00809300
GS =0000 00000000 ffffffff 00809300
LDT=0000 00000000 00000000 00000000
TR =0040 33f5e000 00000067 00008b00
GDT= 33f5ffb0 00000057
IDT= 00000000 00000000
CR0=00050032 CR2=8c4ec690 CR3=62906000 CR4=00000000
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000
DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
EFER=0000000000000000
Code=00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 <bb> 4d 80
2e a1 38 fb 48 2e 89 07 2e 66 a1 30 fb 2e 66 89 47 02 2e 66 0f 01 17 b8 08 00 2e
Thanks,
Qiliang