This patchset allows userspace to be a fallback for handling emulation errors. v1 -> v2: - Added additional documentation for KVM_CAP_EXIT_ON_EMULATION_FAILURE. - In prepare_emulation_failure_exit(): - Created a local variable for vcpu->run. - Cleared the flags, emulation_failure.flags. - Or'd the instruction bytes flag on to emulation_failure.flags. - Updated the comment for KVM_INTERNAL_ERROR_EMULATION flags on how they are to be used. - Updated the comment for struct emulation_failure. v2 -> v3: - Update documentation for KVM_CAP_EXIT_ON_EMULATION_FAILURE. - Fix spacing in prepare_emulation_failure_exit(). v3 -> v4: - In prepare_emulation_failure_exit(): - Clear instruction bytes to 0x90. - Copy over insn_size bytes rather than sizeof(ctxt->fetch.data). - set_page_table_entry() takes a pte rather than mask. - In _vm_get_page_table_entry(): - Removed check for page aligned addresses only. - Added canonical check. - Added a check to make sure no reserved bits are set along the walk except for the final pte (the pte cannot have the reserved bits checked otherwise the test would fail). - Added check to ensure superpage bits are clear. - Added check in test for 'allow_smaller_maxphyaddr' module parameter. - If the is_flds() check fails, only look at the first byte. - Don't use labels to increment the RIP. Decode the instruction well enough to ensure it is only 2-bytes. Aaron Lewis (2): kvm: x86: Allow userspace to handle emulation errors selftests: kvm: Allows userspace to handle emulation errors. Documentation/virt/kvm/api.rst | 18 ++ arch/x86/include/asm/kvm_host.h | 6 + arch/x86/kvm/x86.c | 37 ++- include/uapi/linux/kvm.h | 23 ++ tools/include/uapi/linux/kvm.h | 23 ++ tools/testing/selftests/kvm/.gitignore | 1 + tools/testing/selftests/kvm/Makefile | 1 + .../selftests/kvm/include/x86_64/processor.h | 3 + .../selftests/kvm/lib/x86_64/processor.c | 79 ++++++ .../kvm/x86_64/emulator_error_test.c | 224 ++++++++++++++++++ 10 files changed, 411 insertions(+), 4 deletions(-) create mode 100644 tools/testing/selftests/kvm/x86_64/emulator_error_test.c -- 2.31.1.498.g6c1eba8ee3d-goog