[PATCH v5 00/34] arm/arm64: KVM: Rework the hyp-stub API
Marc Zyngier
marc.zyngier at arm.com
Mon Apr 3 11:37:33 PDT 2017
As noticed by RMK in this thread[1], the hyp-stub API on 32bit ARM
could do with some TLC (it cannot perform a soft-restart at HYP, and
has holes in the hyp-stub support in a number of places). In general,
it would be desirable for the 32bit behaviour to align on 64bit, if
only to ease maintenance.
This series implements the following:
- Add HVC_[GS]ET_VECTORS and HVC_SOFT_RESTART to the 32bit code
- Add HVC_RESET_VECTORS to both arm and arm64, removing the need for
__hyp_reset_vectors
- Implement add the stub entry points in the KVM init code, which
didn't implement any so far
- Convert the HYP code to use the init code stubs directly
- Some general cleanup as a result of these changes (which includes
killing HVC_GET_VECTORS)
- Add some API documentation that covers the above
Patches 14 to 16 would be better squashed into 12 and 13, but I've
kept them separate so that I can take the blame for everything I've
broken.
I've tested this on arm (Cubietruck, Jetson TK1) and arm64 (Seattle),
both as host and guest. Keerthy has been kind enough to test the 32bit
code on DRA7-EVM, AM57XX-EVM and KEYSTONE-K2E-EVM.
[1] http://lists.infradead.org/pipermail/linux-arm-kernel/2016-December/473472.html
* From v4:
- Added a standard return value on stub hypercall failure
- Zero r0/x0 on successful hypercall
- Make 32bit ARM resistant to kvm_reboot while executing a guest
- Update documentation to reflect the calling convention expectations
- Added Acks from Catalin
- Rebased on 4.11-rc5
* From v3:
- Reworked the way we save/restore lr on arm64, making it EL2's job
in a consistent way (these are the three initial patches)
- Collected RBs, TBs and Acks from James, Keerthy and Russell
- Rebased on 4.11-rc3
* From v2:
- Kill HVC_GET_VECTORS and the corresponding __hyp_get_vectors
* From v1:
- Fixed some glaring bugs (reported by Ard and James)
- Tidy up stub vector export on 32bit (Ard)
- Nicer VA/PA conversion on 32bit (Ard)
- Updated cpu_v7_reset documentation
- Cleaned up HYP reset on PM events
- Minor stub documentation update
Marc Zyngier (32):
arm64: hyp-stub: Stop pointlessly clobbering lr
arm64: KVM: Move lr save/restore to do_el2_call
arm64: hyp-stub: Don't save lr in the EL1 code
arm64: hyp-stub: Define a return value for failed stub calls
arm64: hyp-stub: Update documentation in asm/virt.h
arm64: hyp-stub: Implement HVC_RESET_VECTORS stub hypercall
arm64: KVM: Implement HVC_RESET_VECTORS stub hypercall in the init
code
arm64: KVM: Implement HVC_GET_VECTORS in the init code
arm64: KVM: Allow the main HYP code to use the init hyp stub
implementation
arm64: KVM: Convert __cpu_reset_hyp_mode to using __hyp_reset_vectors
arm64: KVM: Implement HVC_SOFT_RESTART in the init code
ARM: KVM: Convert KVM to use HVC_GET_VECTORS
ARM: Update cpu_v7_reset documentation
ARM: hyp-stub: Use r1 for the soft-restart address
ARM: Expose the VA/IDMAP offset
ARM: hyp-stub: Define a return value for failed stub calls
ARM: hyp-stub: Implement HVC_RESET_VECTORS stub hypercall
ARM: KVM: Implement HVC_RESET_VECTORS stub hypercall in the init code
ARM: KVM: Implement HVC_GET_VECTORS in the init code
ARM: KVM: Allow the main HYP code to use the init hyp stub
implementation
ARM: KVM: Convert __cpu_reset_hyp_mode to using __hyp_reset_vectors
ARM: KVM: Implement HVC_SOFT_RESTART in the init code
ARM: KVM: Gracefully handle hyp-stubs being restored from under our
feet
arm/arm64: KVM: Use __hyp_reset_vectors() directly
arm/arm64: KVM: Remove kvm_get_idmap_start
arm/arm64: KVM: Use HVC_RESET_VECTORS to reinit HYP mode
ARM: decompressor: Remove __hyp_get_vectors usage
ARM: hyp-stub/KVM: Kill __hyp_get_vectors
arm64: hyp-stub/KVM: Kill __hyp_get_vectors
arm64: hyp-stub: Zero x0 on successful stub handling
ARM: hyp-stub: Zero r0 on successful stub handling
arm/arm64: Add hyp-stub API documentation
Russell King (2):
ARM: hyp-stub: improve ABI
ARM: soft-reboot into same mode that we entered the kernel
Documentation/virtual/kvm/arm/hyp-abi.txt | 53 +++++++++++++++++++++++++++++++
arch/arm/boot/compressed/head.S | 12 ++++++-
arch/arm/include/asm/kvm_asm.h | 4 +--
arch/arm/include/asm/kvm_host.h | 6 ----
arch/arm/include/asm/kvm_mmu.h | 1 -
arch/arm/include/asm/proc-fns.h | 4 +--
arch/arm/include/asm/virt.h | 14 +++++++-
arch/arm/kernel/hyp-stub.S | 41 +++++++++++++++++++-----
arch/arm/kernel/reboot.c | 7 ++--
arch/arm/kvm/arm.c | 25 ++++++---------
arch/arm/kvm/handle_exit.c | 8 +++++
arch/arm/kvm/hyp/hyp-entry.S | 29 ++++++++++++++---
arch/arm/kvm/init.S | 51 ++++++++++++++++++++++++-----
arch/arm/kvm/interrupts.S | 4 ---
arch/arm/kvm/mmu.c | 5 ---
arch/arm/mm/mmu.c | 5 +++
arch/arm/mm/proc-v7.S | 15 ++++++---
arch/arm64/include/asm/kvm_asm.h | 3 +-
arch/arm64/include/asm/kvm_host.h | 7 ----
arch/arm64/include/asm/kvm_mmu.h | 1 -
arch/arm64/include/asm/virt.h | 31 ++++++++++++------
arch/arm64/kernel/hyp-stub.S | 38 ++++++++--------------
arch/arm64/kvm/hyp-init.S | 46 +++++++++++++++++++++------
arch/arm64/kvm/hyp.S | 5 +--
arch/arm64/kvm/hyp/hyp-entry.S | 43 ++++++++++++-------------
25 files changed, 312 insertions(+), 146 deletions(-)
create mode 100644 Documentation/virtual/kvm/arm/hyp-abi.txt
--
2.11.0
More information about the linux-arm-kernel
mailing list