mbox series

[v6,0/2] fallback for emulation errors

Message ID 20210510144834.658457-1-aaronlewis@google.com (mailing list archive)
Headers show
Series fallback for emulation errors | expand

Message

Aaron Lewis May 10, 2021, 2:48 p.m. UTC
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.

v4 -> v5:

 - Switch 'insn_size' to u32.
 - Add documentation for how the flags are used.
 - Remove 'max_insn_size' and use 'sizeof(run->emulation_failure.insn_bytes)' instead.
 - Fix typos.
 - Fix canonical check.
 - Add reserved check for bit-7 of PML4E.
 - Add reserved check for bit-63 of all page table levels if EFER.NXE = 0.
 - Remove opcode check (it might be a prefix).
 - Remove labels.
 - Remove detritus (rogue cpuid entry in the test).

v5 -> v6

 - Fix documentation.

Aaron Lewis (2):
  kvm: x86: Allow userspace to handle emulation errors
  selftests: kvm: Allows userspace to handle emulation errors.

 Documentation/virt/kvm/api.rst                |  19 ++
 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  |   4 +
 .../selftests/kvm/lib/x86_64/processor.c      |  94 ++++++++
 .../kvm/x86_64/emulator_error_test.c          | 219 ++++++++++++++++++
 10 files changed, 423 insertions(+), 4 deletions(-)
 create mode 100644 tools/testing/selftests/kvm/x86_64/emulator_error_test.c

Comments

Paolo Bonzini June 23, 2021, 9:44 p.m. UTC | #1
On 10/05/21 16:48, Aaron Lewis wrote:
> 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.
> 
> v4 -> v5:
> 
>   - Switch 'insn_size' to u32.
>   - Add documentation for how the flags are used.
>   - Remove 'max_insn_size' and use 'sizeof(run->emulation_failure.insn_bytes)' instead.
>   - Fix typos.
>   - Fix canonical check.
>   - Add reserved check for bit-7 of PML4E.
>   - Add reserved check for bit-63 of all page table levels if EFER.NXE = 0.
>   - Remove opcode check (it might be a prefix).
>   - Remove labels.
>   - Remove detritus (rogue cpuid entry in the test).
> 
> v5 -> v6
> 
>   - Fix documentation.
> 
> Aaron Lewis (2):
>    kvm: x86: Allow userspace to handle emulation errors
>    selftests: kvm: Allows userspace to handle emulation errors.
> 
>   Documentation/virt/kvm/api.rst                |  19 ++
>   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  |   4 +
>   .../selftests/kvm/lib/x86_64/processor.c      |  94 ++++++++
>   .../kvm/x86_64/emulator_error_test.c          | 219 ++++++++++++++++++
>   10 files changed, 423 insertions(+), 4 deletions(-)
>   create mode 100644 tools/testing/selftests/kvm/x86_64/emulator_error_test.c
> 

Queued, thanks (not yet tested, but still).

Paolo