The SVM DecodeAssists feature provides decode state for selected VM-Exits. KVM currently does not expose this feature to L1. Some L1 hypervisors may therefore treat the platform's SVM support as incomplete.
In practice, this was observed with Hyper-V running on top of KVM. Hyper-V appears to require DecodeAssists before enabling nested SVM for its guests. Virtualizing the feature lets users enable Hyper-V virtualization features inside a Windows VM when needed, e.g. to run QEMU/KVM in WSL. Without DecodeAssists, Hyper-V does not enable nested SVM because DecodeAssists is missing from KVM's virtual SVM model. Virtualize DecodeAssists for nested SVM. Propagate fresh hardware instruction bytes from VMCB02, synthesize the architectural EXITINFO state for emulator-generated intercepts, and provide instruction bytes for KVM-synthesized data #PF/#NPF exits. Prefer matching bytes already fetched by the emulator, and fetch missing bytes from L2 RIP only as a fallback. Avoid fallback reads for SEV guests, whose encrypted memory cannot provide plaintext instruction bytes to KVM. The selftest coverage in this version is intentionally broad and may be more extensive than necessary. I kept the full set for now to cover hardware-originated, KVM-synthesized, userspace-injected, and boundary cases; it can be trimmed later if some cases prove redundant. The selftest has been run with kvm.force_emulation_prefix both disabled and enabled. --- Changes since v1: - Split the implementation into seven patches to make the individual pieces easier to review. - Add EXITINFO virtualization for emulator-generated MOV CR/DR, INTn, INVLPG, and INVLPGA intercepts. - Limit GuestInstrBytes propagation to data #NPF and intercepted #PF exits, and clear the fields for instruction-fetch and unrelated exits. - Provide GuestInstrBytes for KVM-synthesized data #PF/#NPF exits. Use matching emulator bytes first and fetch missing bytes from L2 RIP as a fallback, while avoiding fallback reads for SEV guests. - Expand the selftest beyond hardware #NPF and stale-state coverage to exercise hardware, synthesized, userspace-injected, instruction-fetch, page-boundary, and CS-limit cases. v1: https://lore.kernel.org/r/[email protected] Tina Zhang (8): KVM: x86: Add intercept_linear_addr to x86_instruction_info KVM: nSVM: Synthesize DecodeAssists EXITINFO for emulated intercepts KVM: nSVM: Track fresh VMCB02 DecodeAssist bytes KVM: nSVM: Propagate hardware DecodeAssist bytes to VMCB12 KVM: nSVM: Use emulator bytes for synthesized nested #NPF/#PF KVM: nSVM: Fetch missing DecodeAssist bytes for synthesized #NPF/#PF KVM: nSVM: Advertise DecodeAssists to L1 KVM: selftests: Add nested SVM DecodeAssists test arch/x86/kvm/emulate.c | 30 +- arch/x86/kvm/kvm_emulate.h | 1 + arch/x86/kvm/svm/nested.c | 188 ++++- arch/x86/kvm/svm/svm.c | 56 +- arch/x86/kvm/svm/svm.h | 24 +- tools/testing/selftests/kvm/Makefile.kvm | 1 + .../selftests/kvm/include/x86/processor.h | 1 + .../kvm/x86/svm_nested_decode_assists_test.c | 694 ++++++++++++++++++ 8 files changed, 980 insertions(+), 15 deletions(-) create mode 100644 tools/testing/selftests/kvm/x86/svm_nested_decode_assists_test.c base-commit: 8cd9520d35a6c38db6567e97dd93b1f11f185dc6 -- 2.43.7

