KVM: arm64: Enable SVE support on nVHE systems
Marc Zyngier
maintainerv2 cover KVM: arm64: Enable SVE support on nVHE systems
This series enables SVE support for KVM on nVHE hardware (or more likely, software models), and is an alternative to Daniel's patch[1] which has gone through 3 versions, but still has a number of issues.
Instead of waiting for things to happen, I decided to try and see what I could come up with.
The SVE save/restore is modelled after the SVE VHE flow, itself closely following the FPSIMD flow:
- the guest traps to EL2 on first SVE access, and will not trap anymore until vcpu_put()
- ZCR_EL2 stays constant as long as the guest has SVE enabled
- once back on the host side, ZCR_EL2 is restored to its default value on first SVE access
Most of this series only repaints things so that VHE and nVHE look as similar as possible, the ZCR_EL2 management being the most visible exception. This results in a bunch of preparatory patches that aim at making the code slightly more readable.
This has been tested on a FVP model with both VHE/nVHE configurations using the string tests included with the "optimized-routines" library[2].
Patches against 5.12-rc2.
* From v1 [3]:
- Fixed __sve_save_state SYM_FUNC_END label
- Turned the ZCR_EL2 reset hypercall into a host trap
- Fixed SVE state mapping size
- Correctly mask RES0 bits from ZCR_ELx
- Introduced sve_cond_update_zcr_vq() as a ZCR_ELx update helper
- Renamed vcpu_sve_vq() to vcpu_sve_max_vq()
- Collected Acks from Will
[1] https://lore.kernel.org/r/[email protected]
[2] https://github.com/ARM-software/optimized-routines
[3] https://lore.kernel.org/r/[email protected]
Daniel Kiss (1):
KVM: arm64: Enable SVE support for nVHE
Marc Zyngier (10):
KVM: arm64: Provide KVM's own save/restore SVE primitives
KVM: arm64: Use {read,write}_sysreg_el1 to access ZCR_EL1
KVM: arm64: Let vcpu_sve_pffr() handle HYP VAs
KVM: arm64: Introduce vcpu_sve_vq() helper
arm64: sve: Provide a conditional update accessor for ZCR_ELx
KVM: arm64: Rework SVE host-save/guest-restore
KVM: arm64: Map SVE context at EL2 when available
KVM: arm64: Save guest's ZCR_EL1 before saving the FPSIMD state
KVM: arm64: Trap host SVE accesses when the FPSIMD state is dirty
KVM: arm64: Save/restore SVE state for nVHE
arch/arm64/Kconfig | 7 --- arch/arm64/include/asm/fpsimd.h | 9 +++ arch/arm64/include/asm/fpsimdmacros.h | 10 +++- arch/arm64/include/asm/kvm_host.h | 21 ++----- arch/arm64/include/asm/kvm_hyp.h | 2 + arch/arm64/kvm/arm.c | 5 -- arch/arm64/kvm/fpsimd.c | 26 +++++++-- arch/arm64/kvm/guest.c | 6 +- arch/arm64/kvm/hyp/fpsimd.S | 10 ++++ arch/arm64/kvm/hyp/include/hyp/switch.h | 77 ++++++++++++------------- arch/arm64/kvm/hyp/nvhe/hyp-main.c | 4 ++ arch/arm64/kvm/hyp/nvhe/switch.c | 13 +++-- arch/arm64/kvm/reset.c | 4 -- 13 files changed, 109 insertions(+), 85 deletions(-)
Signature · 6 lines
2.29.2 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerPATCH v2 1/11 KVM: arm64: Provide KVM's own save/restore SVE primitives
as we are about to change the way KVM deals with SVE, provide KVM with its own save/restore SVE primitives.
No functional change intended.
--- arch/arm64/include/asm/fpsimdmacros.h | 2 ++ arch/arm64/include/asm/kvm_hyp.h | 2 ++ arch/arm64/kvm/hyp/fpsimd.S | 10 ++++++++++ arch/arm64/kvm/hyp/include/hyp/switch.h | 10 +++++----- 4 files changed, 19 insertions(+), 5 deletions(-)
arch/arm64/include/asm/fpsimdmacros.h +2 -0
@@ -6,6 +6,8 @@* Author: Catalin Marinas <[email protected]> */ +#include <asm/assembler.h> + .macro fpsimd_save state, tmpnr stp q0, q1, [\state, #16 * 0] stp q2, q3, [\state, #16 * 2]
arch/arm64/include/asm/kvm_hyp.h +2 -0
@@ -85,6 +85,8 @@ void __debug_switch_to_host(struct kvm_vcpu *vcpu);void __fpsimd_save_state (struct user_fpsimd_state *fp_regs);void __fpsimd_restore_state (struct user_fpsimd_state *fp_regs); +void __sve_save_state (void *sve_pffr,u32 *fpsr); +void __sve_restore_state (void *sve_pffr,u32 *fpsr,unsigned int vqminus1);#ifndef __KVM_NVHE_HYPERVISOR__void activate_traps_vhe_load (struct kvm_vcpu *vcpu);
arch/arm64/kvm/hyp/fpsimd.S +10 -0
@@ -19,3 +19,13 @@ SYM_FUNC_START(__fpsimd_restore_state) fpsimd_restore x0, 1 ret SYM_FUNC_END(__fpsimd_restore_state) + +SYM_FUNC_START(__sve_restore_state) + sve_load 0, x1, x2, 3, x4 + ret +SYM_FUNC_END(__sve_restore_state) + +SYM_FUNC_START(__sve_save_state) + sve_save 0, x1, 2 + ret +SYM_FUNC_END(__sve_save_state)
arch/arm64/kvm/hyp/include/hyp/switch.h +5 -5
@@ -256,8 +256,8 @@ static inline bool __hyp_handle_fpsimd(struct kvm_vcpu *vcpu) vcpu->arch.host_fpsimd_state, struct thread_struct, uw.fpsimd_state); -sve_save_state (sve_pffr (thread), - &vcpu->arch.host_fpsimd_state->fpsr); +__sve_save_state (sve_pffr (thread), + &vcpu->arch.host_fpsimd_state->fpsr); }else {__fpsimd_save_state (vcpu->arch.host_fpsimd_state); }
@@ -266,9 +266,9 @@ static inline bool __hyp_handle_fpsimd(struct kvm_vcpu *vcpu) }if (sve_guest) { -sve_load_state (vcpu_sve_pffr (vcpu), - &vcpu->arch.ctxt.fp_regs.fpsr, -sve_vq_from_vl (vcpu->arch.sve_max_vl) -1 ); +__sve_restore_state (vcpu_sve_pffr (vcpu), + &vcpu->arch.ctxt.fp_regs.fpsr, +sve_vq_from_vl (vcpu->arch.sve_max_vl) -1 );write_sysreg_s (__vcpu_sys_reg (vcpu,ZCR_EL1 ),SYS_ZCR_EL12 ); }else {__fpsimd_restore_state (&vcpu->arch.ctxt.fp_regs);
Signature · 6 lines
2.29.2 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerPATCH v2 2/11 KVM: arm64: Use {read,write}_sysreg_el1 to access ZCR_EL1
In reply to Marc ZyngierSwitch to the unified EL1 accessors for ZCR_EL1, which will make things easier for nVHE support.
--- arch/arm64/kvm/fpsimd.c | 3 ++- arch/arm64/kvm/hyp/include/hyp/switch.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
arch/arm64/kvm/fpsimd.c +2 -1
@@ -11,6 +11,7 @@#include <linux/kvm_host.h> #include <asm/fpsimd.h> #include <asm/kvm_asm.h> +#include <asm/kvm_hyp.h> #include <asm/kvm_mmu.h> #include <asm/sysreg.h>
@@ -112,7 +113,7 @@ void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu)fpsimd_save_and_flush_cpu_state ();if (guest_has_sve) -__vcpu_sys_reg (vcpu,ZCR_EL1 ) =read_sysreg_s (SYS_ZCR_EL12 ); +__vcpu_sys_reg (vcpu,ZCR_EL1 ) =read_sysreg_el1 (SYS_ZCR ); }else if (host_has_sve) {/* * The FPSIMD/SVE state in the CPU has not been touched, and we
arch/arm64/kvm/hyp/include/hyp/switch.h +1 -1
@@ -269,7 +269,7 @@ static inline bool __hyp_handle_fpsimd(struct kvm_vcpu *vcpu)__sve_restore_state (vcpu_sve_pffr (vcpu), &vcpu->arch.ctxt.fp_regs.fpsr,sve_vq_from_vl (vcpu->arch.sve_max_vl) -1 ); -write_sysreg_s (__vcpu_sys_reg (vcpu,ZCR_EL1 ),SYS_ZCR_EL12 ); +write_sysreg_el1 (__vcpu_sys_reg (vcpu,ZCR_EL1 ),SYS_ZCR ); }else {__fpsimd_restore_state (&vcpu->arch.ctxt.fp_regs); }
Signature · 6 lines
2.29.2 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerPATCH v2 3/11 KVM: arm64: Let vcpu_sve_pffr() handle HYP VAs
In reply to Marc ZyngierThe vcpu_sve_pffr() returns a pointer, which can be an interesting thing to do on nVHE. Wrap the pointer with kern_hyp_va(), and take this opportunity to remove the unnecessary casts (sve_state being a void *).
--- arch/arm64/include/asm/kvm_host.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/include/asm/kvm_host.h +2 -2
@@ -372,8 +372,8 @@ struct kvm_vcpu_arch { };/* Pointer to the vcpu's SVE FFR for sve_{save,load}_state() */ -#define vcpu_sve_pffr (vcpu) ((void *)((char *)((vcpu)->arch.sve_state) + \ - sve_ffr_offset((vcpu)->arch.sve_max_vl))) +#define vcpu_sve_pffr (vcpu) (kern_hyp_va((vcpu)->arch.sve_state) + \ + sve_ffr_offset((vcpu)->arch.sve_max_vl))#define vcpu_sve_state_size (vcpu) ({ \ size_t __size_ret; \
Signature · 6 lines
2.29.2 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerPATCH v2 4/11 KVM: arm64: Introduce vcpu_sve_vq() helper
In reply to Marc ZyngierThe KVM code contains a number of "sve_vq_from_vl(vcpu->arch.sve_max_vl)" instances, and we are about to add more.
Introduce vcpu_sve_vq() as a shorthand for this expression.
--- arch/arm64/include/asm/kvm_host.h | 4 +++- arch/arm64/kvm/guest.c | 6 +++--- arch/arm64/kvm/hyp/include/hyp/switch.h | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-)
arch/arm64/include/asm/kvm_host.h +3 -1
@@ -375,6 +375,8 @@ struct kvm_vcpu_arch {#define vcpu_sve_pffr (vcpu) (kern_hyp_va((vcpu)->arch.sve_state) + \ sve_ffr_offset((vcpu)->arch.sve_max_vl)) +#define vcpu_sve_max_vq (vcpu) sve_vq_from_vl((vcpu)->arch.sve_max_vl) +#define vcpu_sve_state_size (vcpu) ({ \ size_t __size_ret; \ unsigned int __vcpu_vq; \
@@ -382,7 +384,7 @@ struct kvm_vcpu_arch {if (WARN_ON (!sve_vl_valid ((vcpu)->arch.sve_max_vl))) { \ __size_ret =0 ; \ }else { \ - __vcpu_vq =sve_vq_from_vl ((vcpu)->arch.sve_max_vl); \ + __vcpu_vq =vcpu_sve_max_vq (vcpu); \ __size_ret =SVE_SIG_REGS_SIZE (__vcpu_vq); \ } \ \
arch/arm64/kvm/guest.c +3 -3
@@ -299,7 +299,7 @@ static int get_sve_vls(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)memset (vqs,0 ,sizeof (vqs)); - max_vq =sve_vq_from_vl (vcpu->arch.sve_max_vl); + max_vq =vcpu_sve_max_vq (vcpu);for (vq =SVE_VQ_MIN ; vq <= max_vq; ++vq)if (sve_vq_available (vq)) vqs[vq_word (vq)] |=vq_mask (vq);
@@ -427,7 +427,7 @@ static int sve_reg_to_region(struct sve_state_reg_region *region,if (!vcpu_has_sve (vcpu) || (reg->id &SVE_REG_SLICE_MASK ) >0 )return -ENOENT ; - vq =sve_vq_from_vl (vcpu->arch.sve_max_vl); + vq =vcpu_sve_max_vq (vcpu); reqoffset =SVE_SIG_ZREG_OFFSET (vq, reg_num) -SVE_SIG_REGS_OFFSET ;
@@ -437,7 +437,7 @@ static int sve_reg_to_region(struct sve_state_reg_region *region,if (!vcpu_has_sve (vcpu) || (reg->id &SVE_REG_SLICE_MASK ) >0 )return -ENOENT ; - vq =sve_vq_from_vl (vcpu->arch.sve_max_vl); + vq =vcpu_sve_max_vq (vcpu); reqoffset =SVE_SIG_PREG_OFFSET (vq, reg_num) -SVE_SIG_REGS_OFFSET ;
arch/arm64/kvm/hyp/include/hyp/switch.h +1 -1
@@ -268,7 +268,7 @@ static inline bool __hyp_handle_fpsimd(struct kvm_vcpu *vcpu)if (sve_guest) {__sve_restore_state (vcpu_sve_pffr (vcpu), &vcpu->arch.ctxt.fp_regs.fpsr, -sve_vq_from_vl (vcpu->arch.sve_max_vl) -1 ); +vcpu_sve_vq (vcpu) -1 );write_sysreg_el1 (__vcpu_sys_reg (vcpu,ZCR_EL1 ),SYS_ZCR ); }else {__fpsimd_restore_state (&vcpu->arch.ctxt.fp_regs);
Signature · 6 lines
2.29.2 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerPATCH v2 5/11 arm64: sve: Provide a conditional update accessor for ZCR_ELx
In reply to Marc ZyngierA common pattern is to conditionally update ZCR_ELx in order to avoid the "self-synchronizing" effect that writing to this register has.
Let's provide an accessor that does exactly this.
--- arch/arm64/include/asm/fpsimd.h | 9 +++++++++ 1 file changed, 9 insertions(+)
arch/arm64/include/asm/fpsimd.h +9 -0
@@ -130,6 +130,15 @@ static inline void sve_user_enable(void)sysreg_clear_set (cpacr_el1,0 ,CPACR_EL1_ZEN_EL0EN ); } +#define sve_cond_update_zcr_vq (val, reg) \ + do { \ + u64 __zcr = read_sysreg_s((reg)); \ + u64 __new = __zcr & ~ZCR_ELx_LEN_MASK; \ + __new |= (val) & ZCR_ELx_LEN_MASK; \ + if (__zcr != __new) \ + write_sysreg_s(__new, (reg)); \ + } while (0) +/* * Probing and setup functions. * Calls to these functions must be serialised with one another.
Signature · 6 lines
2.29.2 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Re: [PATCH v2 05/11] arm64: sve: Provide a conditional update accessor for ZCR_ELx
Quoted 17 lines · Marc Zyngier
A common pattern is to conditionally update
ZCR_ELxin order to avoid the "self-synchronizing" effect that writing to this register has.Let's provide an accessor that does exactly this.
Signed-off-by Marc Zyngier <[email protected]>--- arch/arm64/include/asm/fpsimd.h | 9 +++++++++ 1 file changed, 9 insertions(+)arch/arm64/include/asm/fpsimd.h +0
-0@@ -130,6 +130,15 @@ static inline void sve_user_enable(void)sysreg_clear_set (cpacr_el1,0 ,CPACR_EL1_ZEN_EL0EN );
arch/arm64/include/asm/fpsimd.h static inline void sve_user_enable(void) · line 140
Quoted 10 lines
arch/arm64/include/asm/fpsimd.h +8
-0} +#define sve_cond_update_zcr_vq (val, reg) \ + do { \ + u64 __zcr = read_sysreg_s((reg)); \ + u64 __new = __zcr & ~ZCR_ELx_LEN_MASK; \ + __new |= (val) & ZCR_ELx_LEN_MASK; \ + if (__zcr != __new) \ + write_sysreg_s(__new, (reg)); \ + } while (0)
Will
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Re: [PATCH v2 05/11] arm64: sve: Provide a conditional update accessor for ZCR_ELx
In reply to Marc ZyngierQuoted 5 lines · Marc Zyngier
A common pattern is to conditionally update
ZCR_ELxin order to avoid the "self-synchronizing" effect that writing to this register has.Let's provide an accessor that does exactly this.
arch/arm64/include/asm/fpsimd.h static inline void sve_user_enable(void) · line 141
Quoted 9 lines
arch/arm64/include/asm/fpsimd.h +9
-0+#define sve_cond_update_zcr_vq (val, reg) \ + do { \ + u64 __zcr = read_sysreg_s((reg)); \ + u64 __new = __zcr & ~ZCR_ELx_LEN_MASK; \ + __new |= (val) & ZCR_ELx_LEN_MASK; \ + if (__zcr != __new) \ + write_sysreg_s(__new, (reg)); \ + } while (0) +
Do compilers actually do much better with this than with a static inline like the other functions in this header? Seems like something they should be figuring out.
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerRe: [PATCH v2 05/11] arm64: sve: Provide a conditional update accessor for ZCR_ELx
Quoted 10 lines · Mark Brown
Quoted 5 lines · Marc Zyngier
A common pattern is to conditionally update
ZCR_ELxin order to avoid the "self-synchronizing" effect that writing to this register has.Let's provide an accessor that does exactly this.
Reviewed-by Mark Brown <[email protected]>
Quoted 13 lines
arch/arm64/include/asm/fpsimd.h static inline void sve_user_enable(void) · line 141
Quoted 9 lines
arch/arm64/include/asm/fpsimd.h +9
-0+#define sve_cond_update_zcr_vq (val, reg) \ + do { \ + u64 __zcr = read_sysreg_s((reg)); \ + u64 __new = __zcr & ~ZCR_ELx_LEN_MASK; \ + __new |= (val) & ZCR_ELx_LEN_MASK; \ + if (__zcr != __new) \ + write_sysreg_s(__new, (reg)); \ + } while (0) +Do compilers actually do much better with this than with a static inline like the other functions in this header? Seems like something they should be figuring out.
It's not about performance or anything of the sort: in most cases where we end-up using this, it is on the back of an exception. So performance is the least of our worries.
However, the "reg" parameter to read/write_sysreg_s() cannot be a variable, because it is directly fed to the assembler. If you want to use functions, you need to specialise them per register. At this point, I'm pretty happy with a #define.
M.
Signature · 5 lines
Jazz is not dead. It just smells funny... _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Re: [PATCH v2 05/11] arm64: sve: Provide a conditional update accessor for ZCR_ELx
Quoted 6 lines · Marc Zyngier
Quoted 3 lines · Mark Brown
Do compilers actually do much better with this than with a static inline like the other functions in this header? Seems like something they should be figuring out.
Quoted 8 lines
It's not about performance or anything of the sort: in most cases where we end-up using this, it is on the back of an exception. So performance is the least of our worries.
However, the "reg" parameter to read/write_sysreg_s() cannot be a variable, because it is directly fed to the assembler. If you want to use functions, you need to specialise them per register. At this point, I'm pretty happy with a #define.
Ah, that makes sense - it was more of a "that's weird" than "that's actually a problem", hence the Reviwed-by.
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerPATCH v2 6/11 KVM: arm64: Rework SVE host-save/guest-restore
In reply to Marc ZyngierIn order to keep the code readable, move the host-save/guest-restore sequences in their own functions, with the following changes:
- the hypervisor ZCR is now set from C code
- ZCR_EL2 is always used as the EL2 accessor
This results in some minor assembler macro rework. No functional change intended.
--- arch/arm64/include/asm/fpsimdmacros.h | 8 +++-- arch/arm64/include/asm/kvm_hyp.h | 2 +- arch/arm64/kvm/hyp/fpsimd.S | 2 +- arch/arm64/kvm/hyp/include/hyp/switch.h | 40 +++++++++++++++---------- 4 files changed, 32 insertions(+), 20 deletions(-)
arch/arm64/include/asm/fpsimdmacros.h +6 -2
@@ -232,8 +232,7 @@ str w\nxtmp, [\xpfpsr, #4] .endm -.macro sve_load nxbase, xpfpsr, xvqminus1, nxtmp, xtmp2 - sve_load_vq \xvqminus1, x\nxtmp, \xtmp2 +.macro __sve_load nxbase, xpfpsr, nxtmp _for n, 0, 31, _sve_ldr_v \n, \nxbase, \n - 34 _sve_ldr_p 0, \nxbase _sve_wrffr 0
@@ -244,3 +243,8 @@ ldr w\nxtmp, [\xpfpsr, #4] msr fpcr, x\nxtmp .endm + +.macro sve_load nxbase, xpfpsr, xvqminus1, nxtmp, xtmp2 + sve_load_vq \xvqminus1, x\nxtmp, \xtmp2 + __sve_load \nxbase, \xpfpsr, \nxtmp +.endm
arch/arm64/include/asm/kvm_hyp.h +1 -1
@@ -86,7 +86,7 @@ void __debug_switch_to_host(struct kvm_vcpu *vcpu);void __fpsimd_save_state (struct user_fpsimd_state *fp_regs);void __fpsimd_restore_state (struct user_fpsimd_state *fp_regs);void __sve_save_state (void *sve_pffr,u32 *fpsr); -void __sve_restore_state (void *sve_pffr,u32 *fpsr,unsigned int vqminus1); +void __sve_restore_state (void *sve_pffr,u32 *fpsr);#ifndef __KVM_NVHE_HYPERVISOR__void activate_traps_vhe_load (struct kvm_vcpu *vcpu);
arch/arm64/kvm/hyp/fpsimd.S +1 -1
@@ -21,7 +21,7 @@ SYM_FUNC_START(__fpsimd_restore_state) SYM_FUNC_END(__fpsimd_restore_state) SYM_FUNC_START(__sve_restore_state) - sve_load 0, x1, x2, 3, x4 + __sve_load 0, x1, 2 ret SYM_FUNC_END(__sve_restore_state)
arch/arm64/kvm/hyp/include/hyp/switch.h +24 -16
@@ -196,6 +196,24 @@ static inline bool __populate_fault_info(struct kvm_vcpu *vcpu)return true; } +static inline void __hyp_sve_save_host (struct kvm_vcpu *vcpu) +{ +struct thread_struct *thread; + + thread = container_of(vcpu->arch.host_fpsimd_state, struct thread_struct, + uw.fpsimd_state); + +__sve_save_state (sve_pffr (thread), &vcpu->arch.host_fpsimd_state->fpsr); +} + +static inline void __hyp_sve_restore_guest (struct kvm_vcpu *vcpu) +{ +sve_cond_update_zcr_vq (vcpu_sve_max_vq (vcpu) -1 ,SYS_ZCR_EL2 ); +__sve_restore_state (vcpu_sve_pffr (vcpu), + &vcpu->arch.ctxt.fp_regs.fpsr); +write_sysreg_el1 (__vcpu_sys_reg (vcpu,ZCR_EL1 ),SYS_ZCR ); +} +/* Check for an FPSIMD/SVE trap and handle as appropriate */ static inline bool __hyp_handle_fpsimd (struct kvm_vcpu *vcpu) {
@@ -251,28 +269,18 @@ static inline bool __hyp_handle_fpsimd(struct kvm_vcpu *vcpu)* In the SVE case, VHE is assumed: it is enforced by * Kconfig and kvm_arch_init(). */ -if (sve_host) { -struct thread_struct *thread =container_of ( - vcpu->arch.host_fpsimd_state, - struct thread_struct, uw.fpsimd_state); - -__sve_save_state (sve_pffr (thread), - &vcpu->arch.host_fpsimd_state->fpsr); - }else { +if (sve_host) +__hyp_sve_save_host (vcpu); +else __fpsimd_save_state (vcpu->arch.host_fpsimd_state); - } vcpu->arch.flags &= ~KVM_ARM64_FP_HOST ; } -if (sve_guest) { -__sve_restore_state (vcpu_sve_pffr (vcpu), - &vcpu->arch.ctxt.fp_regs.fpsr, -vcpu_sve_vq (vcpu) -1 ); -write_sysreg_el1 (__vcpu_sys_reg (vcpu,ZCR_EL1 ),SYS_ZCR ); - }else { +if (sve_guest) +__hyp_sve_restore_guest (vcpu); +else __fpsimd_restore_state (&vcpu->arch.ctxt.fp_regs); - }/* Skip restoring fpexc32 for AArch64 guests */ if (!(read_sysreg (hcr_el2) &HCR_RW ))
Signature · 6 lines
2.29.2 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Re: [PATCH v2 06/11] KVM: arm64: Rework SVE host-save/guest-restore
Quoted 8 lines · Marc Zyngier
In order to keep the code readable, move the host-save/guest-restore sequences in their own functions, with the following changes:
- the hypervisor ZCR is now set from C code
-ZCR_EL2is always used as the EL2 accessorThis results in some minor assembler macro rework. No functional change intended.
Quoted 8 lines
Acked-by Will Deacon <[email protected]>Signed-off-by Marc Zyngier <[email protected]>--- arch/arm64/include/asm/fpsimdmacros.h | 8 +++-- arch/arm64/include/asm/kvm_hyp.h | 2 +- arch/arm64/kvm/hyp/fpsimd.S | 2 +- arch/arm64/kvm/hyp/include/hyp/switch.h | 40 +++++++++++++++---------- 4 files changed, 32 insertions(+), 20 deletions(-)
Will
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerPATCH v2 7/11 KVM: arm64: Map SVE context at EL2 when available
In reply to Marc ZyngierWhen running on nVHE, and that the vcpu supports SVE, map the SVE state at EL2 so that KVM can access it.
--- arch/arm64/kvm/fpsimd.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
arch/arm64/kvm/fpsimd.c +11 -0
@@ -43,6 +43,17 @@ int kvm_arch_vcpu_run_map_fp(struct kvm_vcpu *vcpu)if (ret) goto error; +if (vcpu->arch.sve_state) { +void *sve_end; + + sve_end = vcpu->arch.sve_state +vcpu_sve_state_size (vcpu); + + ret =create_hyp_mappings (vcpu->arch.sve_state, sve_end, +PAGE_HYP ); +if (ret) + goto error; + } + vcpu->arch.host_thread_info =kern_hyp_va (ti); vcpu->arch.host_fpsimd_state =kern_hyp_va (fpsimd); error:
Signature · 6 lines
2.29.2 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Re: [PATCH v2 07/11] KVM: arm64: Map SVE context at EL2 when available
Quoted 16 lines · Marc Zyngier
When running on nVHE, and that the vcpu supports SVE, map the SVE state at EL2 so that KVM can access it.
Signed-off-by Marc Zyngier <[email protected]>--- arch/arm64/kvm/fpsimd.c | 11 +++++++++++ 1 file changed, 11 insertions(+)arch/arm64/kvm/fpsimd.c +0
-0@@ -43,6 +43,17 @@ int kvm_arch_vcpu_run_map_fp(struct kvm_vcpu *vcpu)if (ret) goto error;
arch/arm64/kvm/fpsimd.c int kvm_arch_vcpu_run_map_fp(struct kvm_vcpu *vcpu) · line 55
Quoted 10 lines
arch/arm64/kvm/fpsimd.c +10
-0+if (vcpu->arch.sve_state) { +void *sve_end; + + sve_end = vcpu->arch.sve_state +vcpu_sve_state_size (vcpu); + + ret =create_hyp_mappings (vcpu->arch.sve_state, sve_end, +PAGE_HYP ); +if (ret) + goto error; + }
Will
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerPATCH v2 8/11 KVM: arm64: Save guest's ZCR_EL1 before saving the FPSIMD state
In reply to Marc ZyngierMake sure the guest's ZCR_EL1 is saved before we save/flush the state. This will be useful in later patches.
--- arch/arm64/kvm/fpsimd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/kvm/fpsimd.c +2 -2
@@ -121,10 +121,10 @@ void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu)local_irq_save (flags);if (vcpu->arch.flags &KVM_ARM64_FP_ENABLED ) { -fpsimd_save_and_flush_cpu_state (); -if (guest_has_sve)__vcpu_sys_reg (vcpu,ZCR_EL1 ) =read_sysreg_el1 (SYS_ZCR ); + +fpsimd_save_and_flush_cpu_state (); }else if (host_has_sve) {/* * The FPSIMD/SVE state in the CPU has not been touched, and we
Signature · 6 lines
2.29.2 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerPATCH v2 9/11 KVM: arm64: Trap host SVE accesses when the FPSIMD state is dirty
In reply to Marc ZyngierZCR_EL2 controls the upper bound for ZCR_EL1, and is set to a potentially lower limit when the guest uses SVE. In order to restore the SVE state on the EL1 host, we must first reset ZCR_EL2 to its original value.
To make it as lazy as possible on the EL1 host side, set the SVE trapping in place when returning exiting from the guest. On the first EL1 access to SVE, ZCR_EL2 will be restored to its full glory.
--- arch/arm64/kvm/hyp/nvhe/hyp-main.c | 4 ++++ arch/arm64/kvm/hyp/nvhe/switch.c | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-)
arch/arm64/kvm/hyp/nvhe/hyp-main.c +4 -0
@@ -177,6 +177,10 @@ void handle_trap(struct kvm_cpu_context *host_ctxt)case ESR_ELx_EC_SMC64:handle_host_smc (host_ctxt);break ; +case ESR_ELx_EC_SVE: +sve_cond_update_zcr_vq (ZCR_ELx_LEN_MASK,SYS_ZCR_EL2 ); +sysreg_clear_set (cptr_el2,CPTR_EL2_TZ ,0 ); +break ;default :hyp_panic (); }
arch/arm64/kvm/hyp/nvhe/switch.c +7 -2
@@ -68,7 +68,7 @@ static void __activate_traps(struct kvm_vcpu *vcpu)static void __deactivate_traps (struct kvm_vcpu *vcpu) {extern char __kvm_hyp_host_vector[]; -u64 mdcr_el2; +u64 mdcr_el2, cptr;___deactivate_traps (vcpu);
@@ -101,7 +101,12 @@ static void __deactivate_traps(struct kvm_vcpu *vcpu)write_sysreg (HCR_HOST_NVHE_PROTECTED_FLAGS , hcr_el2); elsewrite_sysreg (HCR_HOST_NVHE_FLAGS ,hcr_el2 ); -write_sysreg (CPTR_EL2_DEFAULT , cptr_el2); + + cptr =CPTR_EL2_DEFAULT ; +if (vcpu_has_sve (vcpu) && (vcpu->arch.flags &KVM_ARM64_FP_ENABLED )) + cptr |=CPTR_EL2_TZ ; + +write_sysreg (cptr, cptr_el2);write_sysreg (__kvm_hyp_host_vector, vbar_el2); }
Signature · 6 lines
2.29.2 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Re: [PATCH v2 09/11] KVM: arm64: Trap host SVE accesses when the FPSIMD state is dirty
Quoted 7 lines · Marc Zyngier
ZCR_EL2controls the upper bound forZCR_EL1, and is set to a potentially lower limit when the guest uses SVE. In order to restore the SVE state on the EL1 host, we must first resetZCR_EL2to its original value.To make it as lazy as possible on the EL1 host side, set the SVE trapping in place when returning exiting from
"returning exiting"?
Quoted 14 lines
arch/arm64/kvm/hyp/nvhe/switch.c +1
-1@@ -68,7 +68,7 @@ static void __activate_traps(struct kvm_vcpu *vcpu)static void __deactivate_traps (struct kvm_vcpu *vcpu) {extern char __kvm_hyp_host_vector[]; -u64 mdcr_el2; +u64 mdcr_el2, cptr;___deactivate_traps (vcpu);
arch/arm64/kvm/hyp/nvhe/switch.c static void __deactivate_traps(struct kvm_vcpu *vcpu) · line 107
Quoted 8 lines
arch/arm64/kvm/hyp/nvhe/switch.c +4
-1@@ -101,7 +101,12 @@ static void __deactivate_traps(struct kvm_vcpu *vcpu)write_sysreg (HCR_HOST_NVHE_PROTECTED_FLAGS , hcr_el2); elsewrite_sysreg (HCR_HOST_NVHE_FLAGS ,hcr_el2 ); -write_sysreg (CPTR_EL2_DEFAULT , cptr_el2); + + cptr =CPTR_EL2_DEFAULT ; +if (vcpu_has_sve (vcpu) && (vcpu->arch.flags &KVM_ARM64_FP_ENABLED )) + cptr |=CPTR_EL2_TZ ;
Will
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerRe: [PATCH v2 09/11] KVM: arm64: Trap host SVE accesses when the FPSIMD state is dirty
Quoted 11 lines · Will Deacon
Quoted 7 lines · Marc Zyngier
ZCR_EL2controls the upper bound forZCR_EL1, and is set to a potentially lower limit when the guest uses SVE. In order to restore the SVE state on the EL1 host, we must first resetZCR_EL2to its original value.To make it as lazy as possible on the EL1 host side, set the SVE trapping in place when returning exiting from
"returning exiting"?
Meh. Kept the latter.
Thanks,
M.
Signature · 5 lines
Without deviation from the norm, progress is not possible. _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerRe: [PATCH v2 09/11] KVM: arm64: Trap host SVE accesses when the FPSIMD state is dirty
In reply to Marc ZyngierQuoted 23 lines · Marc Zyngier
ZCR_EL2controls the upper bound forZCR_EL1, and is set to a potentially lower limit when the guest uses SVE. In order to restore the SVE state on the EL1 host, we must first resetZCR_EL2to its original value.To make it as lazy as possible on the EL1 host side, set the SVE trapping in place when returning exiting from the guest. On the first EL1 access to SVE,
ZCR_EL2will be restored to its full glory.Suggested-by Andrew Scull <[email protected]>Signed-off-by Marc Zyngier <[email protected]>--- arch/arm64/kvm/hyp/nvhe/hyp-main.c | 4 ++++ arch/arm64/kvm/hyp/nvhe/switch.c | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-)arch/arm64/kvm/hyp/nvhe/hyp-main.c +0
-0
arch/arm64/kvm/hyp/nvhe/hyp-main.c void handle_trap(struct kvm_cpu_context *host_ctxt) · line 183
Quoted 7 lines
arch/arm64/kvm/hyp/nvhe/hyp-main.c +4
-0@@ -177,6 +177,10 @@ void handle_trap(struct kvm_cpu_context *host_ctxt)case ESR_ELx_EC_SMC64:handle_host_smc (host_ctxt);break ; +case ESR_ELx_EC_SVE: +sve_cond_update_zcr_vq (ZCR_ELx_LEN_MASK,SYS_ZCR_EL2 ); +sysreg_clear_set (cptr_el2,CPTR_EL2_TZ ,0 ); +break ;
It turns out that my last test-run was flawed, as my model was stuck with VHE, meaning this snippet was never run. If it ran, I would have noticed that CPTR_EL2.TZ being set results in the ZCR_EL2 access to trap at EL2, meaning the above explodes very quickly.
I've queued the below patch on top of the existing series, which cures the issue and let the tests run for real this time.
Thanks to Will for the timely report, and apologies for the lousy testing...
M.
From 5b08709313718e95ba06ef49aa82f964a605bd9c Mon Sep 17 00:00:00 2001
From: Marc Zyngier <[email protected]>
Date: Thu, 18 Mar 2021 18:30:26 +0000
Subject: [PATCH] KVM: arm64: Fix host's ZCR_EL2 restore on nVHE
We re-enter the EL1 host with CPTR_EL2.TZ set in order to be able to lazily restore ZCR_EL2 when required.
However, the same CPTR_EL2 configuration also leads to trapping when ZCR_EL2 is accessed from EL2. Duh!
Clear CPTR_EL2.TZ *before* writing to ZCR_EL2.
--- arch/arm64/kvm/hyp/nvhe/hyp-main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/arm64/kvm/hyp/nvhe/hyp-main.c +2 -1
@@ -178,8 +178,9 @@ void handle_trap(struct kvm_cpu_context *host_ctxt)handle_host_smc (host_ctxt);break ;case ESR_ELx_EC_SVE: -sve_cond_update_zcr_vq (ZCR_ELx_LEN_MASK,SYS_ZCR_EL2 );sysreg_clear_set (cptr_el2,CPTR_EL2_TZ ,0 ); +isb (); +sve_cond_update_zcr_vq (ZCR_ELx_LEN_MASK,SYS_ZCR_EL2 );break ;default :hyp_panic ();
Signature · 9 lines
2.29.2 -- Without deviation from the norm, progress is not possible. _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerPATCH v2 10/11 KVM: arm64: Save/restore SVE state for nVHE
In reply to Marc ZyngierImplement the SVE save/restore for nVHE, following a similar logic to that of the VHE implementation:
- the SVE state is switched on trap from EL1 to EL2
- no further changes to ZCR_EL2 occur as long as the guest isn't preempted or exit to userspace
- ZCR_EL2 is reset to its default value on the first SVE access from the host EL1, and ZCR_EL1 restored to the default guest value in vcpu_put()
--- arch/arm64/kvm/fpsimd.c | 10 +++++-- arch/arm64/kvm/hyp/include/hyp/switch.h | 37 +++++++++---------------- arch/arm64/kvm/hyp/nvhe/switch.c | 4 +-- 3 files changed, 23 insertions(+), 28 deletions(-)
arch/arm64/kvm/fpsimd.c +8 -2
@@ -121,11 +121,17 @@ void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu)local_irq_save (flags);if (vcpu->arch.flags &KVM_ARM64_FP_ENABLED ) { -if (guest_has_sve) +if (guest_has_sve) {__vcpu_sys_reg (vcpu,ZCR_EL1 ) =read_sysreg_el1 (SYS_ZCR ); +/* Restore the VL that was saved when bound to the CPU */ +if (!has_vhe ()) +sve_cond_update_zcr_vq (vcpu_sve_max_vq (vcpu) -1 , +SYS_ZCR_EL1 ); + } +fpsimd_save_and_flush_cpu_state (); - }else if (host_has_sve) { + }else if (has_vhe () && host_has_sve) {/* * The FPSIMD/SVE state in the CPU has not been touched, and we * have SVE (and VHE): CPACR_EL1 (alias CPTR_EL2) has been
arch/arm64/kvm/hyp/include/hyp/switch.h +13 -24
@@ -217,25 +217,19 @@ static inline void __hyp_sve_restore_guest(struct kvm_vcpu *vcpu)/* Check for an FPSIMD/SVE trap and handle as appropriate */ static inline bool __hyp_handle_fpsimd (struct kvm_vcpu *vcpu) { -bool vhe, sve_guest, sve_host; +bool sve_guest, sve_host;u8 esr_ec; +u64 reg;if (!system_supports_fpsimd ())return false; -/* -* Currently system_supports_sve() currently implies has_vhe(), -* so the check is redundant. However, has_vhe() can be determined -* statically and helps the compiler remove dead code. -*/ -if (has_vhe () &&system_supports_sve ()) { +if (system_supports_sve ()) { sve_guest =vcpu_has_sve (vcpu); sve_host = vcpu->arch.flags &KVM_ARM64_HOST_SVE_IN_USE ; - vhe = true; }else { sve_guest = false; sve_host = false; - vhe =has_vhe (); } esr_ec =kvm_vcpu_trap_get_class (vcpu);
@@ -244,31 +238,26 @@ static inline bool __hyp_handle_fpsimd(struct kvm_vcpu *vcpu)return false;/* Don't handle SVE traps for non-SVE vcpus here: */ -if (!sve_guest) -if (esr_ec != ESR_ELx_EC_FP_ASIMD) -return false; +if (!sve_guest && esr_ec != ESR_ELx_EC_FP_ASIMD) +return false;/* Valid trap. Switch the context: */ - -if (vhe) { -u64 reg =read_sysreg (cpacr_el1) |CPACR_EL1_FPEN ; - +if (has_vhe ()) { + reg =CPACR_EL1_FPEN ;if (sve_guest) reg |=CPACR_EL1_ZEN ; -write_sysreg (reg, cpacr_el1); +sysreg_clear_set (cpacr_el1,0 , reg); }else { -write_sysreg (read_sysreg (cptr_el2) & ~(u64 )CPTR_EL2_TFP , - cptr_el2); - } + reg =CPTR_EL2_TFP ; +if (sve_guest) + reg |=CPTR_EL2_TZ ; +sysreg_clear_set (cptr_el2, reg,0 ); + }isb ();if (vcpu->arch.flags &KVM_ARM64_FP_HOST ) { -/* -* In the SVE case, VHE is assumed: it is enforced by -* Kconfig and kvm_arch_init(). -*/ if (sve_host)__hyp_sve_save_host (vcpu);else
arch/arm64/kvm/hyp/nvhe/switch.c +2 -2
@@ -41,9 +41,9 @@ static void __activate_traps(struct kvm_vcpu *vcpu)__activate_traps_common (vcpu); val =CPTR_EL2_DEFAULT ; - val |=CPTR_EL2_TTA |CPTR_EL2_TZ |CPTR_EL2_TAM ; + val |=CPTR_EL2_TTA |CPTR_EL2_TAM ;if (!update_fp_enabled (vcpu)) { - val |=CPTR_EL2_TFP ; + val |=CPTR_EL2_TFP |CPTR_EL2_TZ ;__activate_traps_fpsimd32 (vcpu); }
Signature · 6 lines
2.29.2 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Re: [PATCH v2 10/11] KVM: arm64: Save/restore SVE state for nVHE
Quoted 25 lines · Marc Zyngier
Implement the SVE save/restore for nVHE, following a similar logic to that of the VHE implementation:
- the SVE state is switched on trap from EL1 to EL2
- no further changes to
ZCR_EL2occur as long as the guest isn't preempted or exit to userspace-
ZCR_EL2is reset to its default value on the first SVE access from the host EL1, andZCR_EL1restored to the default guest value invcpu_put()Signed-off-by Marc Zyngier <[email protected]>--- arch/arm64/kvm/fpsimd.c | 10 +++++-- arch/arm64/kvm/hyp/include/hyp/switch.h | 37 +++++++++---------------- arch/arm64/kvm/hyp/nvhe/switch.c | 4 +-- 3 files changed, 23 insertions(+), 28 deletions(-)arch/arm64/kvm/fpsimd.c +0
-0@@ -121,11 +121,17 @@ void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu)local_irq_save (flags);
arch/arm64/kvm/fpsimd.c void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu) · line 130
Quoted 10 lines
arch/arm64/kvm/fpsimd.c +5
-1if (vcpu->arch.flags &KVM_ARM64_FP_ENABLED ) { -if (guest_has_sve) +if (guest_has_sve) {__vcpu_sys_reg (vcpu,ZCR_EL1 ) =read_sysreg_el1 (SYS_ZCR ); +/* Restore the VL that was saved when bound to the CPU */ +if (!has_vhe ()) +sve_cond_update_zcr_vq (vcpu_sve_max_vq (vcpu) -1 , +SYS_ZCR_EL1 );
You end up reading ZCR_EL1 twice here, but it's probably not the end of the world.
Anyway:
Will
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerRe: [PATCH v2 10/11] KVM: arm64: Save/restore SVE state for nVHE
Quoted 33 lines · Will Deacon
Quoted 31 lines · Marc Zyngier
Implement the SVE save/restore for nVHE, following a similar logic to that of the VHE implementation:
- the SVE state is switched on trap from EL1 to EL2
- no further changes to
ZCR_EL2occur as long as the guest isn't preempted or exit to userspace-
ZCR_EL2is reset to its default value on the first SVE access from the host EL1, andZCR_EL1restored to the default guest value invcpu_put()Signed-off-by Marc Zyngier <[email protected]>--- arch/arm64/kvm/fpsimd.c | 10 +++++-- arch/arm64/kvm/hyp/include/hyp/switch.h | 37 +++++++++---------------- arch/arm64/kvm/hyp/nvhe/switch.c | 4 +-- 3 files changed, 23 insertions(+), 28 deletions(-)arch/arm64/kvm/fpsimd.c +1
-1@@ -121,11 +121,17 @@ void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu)local_irq_save (flags);if (vcpu->arch.flags &KVM_ARM64_FP_ENABLED ) { -if (guest_has_sve) +if (guest_has_sve) {__vcpu_sys_reg (vcpu,ZCR_EL1 ) =read_sysreg_el1 (SYS_ZCR );
Quoted 7 lines
arch/arm64/kvm/fpsimd.c void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu) · line 130
Quoted 4 lines
arch/arm64/kvm/fpsimd.c +4
-0+/* Restore the VL that was saved when bound to the CPU */ +if (!has_vhe ()) +sve_cond_update_zcr_vq (vcpu_sve_max_vq (vcpu) -1 , +SYS_ZCR_EL1 );You end up reading
ZCR_EL1twice here, but it's probably not the end of the world.
True, but I'd expect read accesses to ZCR_EL1 to be reasonably fast, something we can't expect from writes.
Quoted 4 lines
Anyway:
Acked-by Will Deacon <[email protected]>
Thanks,
M.
Signature · 5 lines
Without deviation from the norm, progress is not possible. _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Marc Zyngier
maintainerPATCH v2 11/11 KVM: arm64: Enable SVE support for nVHE
In reply to Marc ZyngierFrom: Daniel Kiss <[email protected]>
Now that KVM is equipped to deal with SVE on nVHE, remove the code preventing it from being used as well as the bits of documentation that were mentioning the incompatibility.
--- arch/arm64/Kconfig | 7 ------- arch/arm64/include/asm/kvm_host.h | 13 ------------- arch/arm64/kvm/arm.c | 5 ----- arch/arm64/kvm/reset.c | 4 ---- 4 files changed, 29 deletions(-)
arch/arm64/Kconfig +0 -7
@@ -1686,7 +1686,6 @@ endmenu config ARM64_SVE bool "ARM Scalable Vector Extension support" default y - depends on !KVM || ARM64_VHE help The Scalable Vector Extension (SVE) is an extension to the AArch64 execution state which complements and extends the SIMD functionality
@@ -1715,12 +1714,6 @@ config ARM64_SVE booting the kernel. If unsure and you are not observing these symptoms, you should assume that it is safe to say Y. - CPUs that support SVE are architecturally required to support the - Virtualization Host Extensions (VHE), so the kernel makes no - provision for supporting SVE alongside KVM without VHE enabled. - Thus, you will need to enable CONFIG_ARM64_VHE if you want to support - KVM in the same kernel image. - config ARM64_MODULE_PLTS bool "Use PLTs to allow module memory to spill over into vmalloc area" depends on MODULES
arch/arm64/include/asm/kvm_host.h +0 -13
@@ -694,19 +694,6 @@ static inline void kvm_init_host_cpu_context(struct kvm_cpu_context *cpu_ctxt)ctxt_sys_reg (cpu_ctxt,MPIDR_EL1 ) =read_cpuid_mpidr (); } -static inline bool kvm_arch_requires_vhe (void ) -{ -/* -* The Arm architecture specifies that implementation of SVE -* requires VHE also to be implemented. The KVM code for arm64 -* relies on this when SVE is present: -*/ -if (system_supports_sve ()) -return true; - -return false; -} -void kvm_arm_vcpu_ptrauth_trap (struct kvm_vcpu *vcpu);static inline void kvm_arch_hardware_unsetup (void ) {}
arch/arm64/kvm/arm.c +0 -5
@@ -1889,11 +1889,6 @@ int kvm_arch_init(void *opaque) in_hyp_mode =is_kernel_in_hyp_mode (); -if (!in_hyp_mode &&kvm_arch_requires_vhe ()) { -kvm_pr_unimpl ("CPU unsupported in non-VHE mode, not initializing\n" ); -return -ENODEV ; - } -if (cpus_have_final_cap (ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE ) ||cpus_have_final_cap (ARM64_WORKAROUND_1508412 )) kvm_info("Guests without required CPU erratum workarounds can deadlock system!\n" \
arch/arm64/kvm/reset.c +0 -4
@@ -74,10 +74,6 @@ static int kvm_vcpu_enable_sve(struct kvm_vcpu *vcpu)if (!system_supports_sve ())return -EINVAL ; -/* Verify that KVM startup enforced this when SVE was detected: */ -if (WARN_ON (!has_vhe ())) -return -EINVAL ; - vcpu->arch.sve_max_vl = kvm_sve_max_vl;/*
Signature · 6 lines
2.29.2 _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Quoted 4 lines · Marc Zyngier
Most of this series only repaints things so that VHE and nVHE look as similar as possible, the
ZCR_EL2management being the most visible exception. This results in a bunch of preparatory patches that aim at making the code slightly more readable.
That readability stuff is definitely helping from my PoV.
(FWIW, from the SVE side)
Quoted 3 lines
This has been tested on a FVP model with both VHE/nVHE configurations using the string tests included with the "optimized-routines" library[2].
There's also some tests Dave wrote which got upstreamed in kselftest now, some normal kselftests and also a stress test that sits and writes/reads bit patterns into the registers and is pretty good at picking up any context switch issues.
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm