Message ID | 20230609162200.2024064-10-maz@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: arm64: Allow using VHE in the nVHE hypervisor | expand |
Hi Marc, On 6/10/23 00:21, Marc Zyngier wrote: > We can now start with the fun stuff: if we enable VHE *only* for > the hypervisor, we need to generate the VHE instructions when > accessing the system registers. > > For this, reporpose the alternative sequence to be keyed off s/reporpose/repropose or s/reporpose/repurpose ? > ARM64_KVM_HVHE in the nVHE hypervisor code, and only there. > > Signed-off-by: Marc Zyngier <maz@kernel.org> > --- > arch/arm64/include/asm/kvm_hyp.h | 12 +++++++++--- > 1 file changed, 9 insertions(+), 3 deletions(-) > > diff --git a/arch/arm64/include/asm/kvm_hyp.h b/arch/arm64/include/asm/kvm_hyp.h > index fea04eb25cb4..b7238c72a04c 100644 > --- a/arch/arm64/include/asm/kvm_hyp.h > +++ b/arch/arm64/include/asm/kvm_hyp.h > @@ -33,12 +33,18 @@ DECLARE_PER_CPU(struct kvm_nvhe_init_params, kvm_init_params); > > #else // !__KVM_VHE_HYPERVISOR__ > > +#if defined(__KVM_NVHE_HYPERVISOR__) > +#define VHE_ALT_KEY ARM64_KVM_HVHE > +#else > +#define VHE_ALT_KEY ARM64_HAS_VIRT_HOST_EXTN > +#endif > + > #define read_sysreg_elx(r,nvh,vh) \ > ({ \ > u64 reg; \ > - asm volatile(ALTERNATIVE(__mrs_s("%0", r##nvh), \ > + asm volatile(ALTERNATIVE(__mrs_s("%0", r##nvh), \ > __mrs_s("%0", r##vh), \ > - ARM64_HAS_VIRT_HOST_EXTN) \ > + VHE_ALT_KEY) \ > : "=r" (reg)); \ > reg; \ > }) > @@ -48,7 +54,7 @@ DECLARE_PER_CPU(struct kvm_nvhe_init_params, kvm_init_params); > u64 __val = (u64)(v); \ > asm volatile(ALTERNATIVE(__msr_s(r##nvh, "%x0"), \ > __msr_s(r##vh, "%x0"), \ > - ARM64_HAS_VIRT_HOST_EXTN) \ > + VHE_ALT_KEY) \ > : : "rZ" (__val)); \ > } while (0) >
diff --git a/arch/arm64/include/asm/kvm_hyp.h b/arch/arm64/include/asm/kvm_hyp.h index fea04eb25cb4..b7238c72a04c 100644 --- a/arch/arm64/include/asm/kvm_hyp.h +++ b/arch/arm64/include/asm/kvm_hyp.h @@ -33,12 +33,18 @@ DECLARE_PER_CPU(struct kvm_nvhe_init_params, kvm_init_params); #else // !__KVM_VHE_HYPERVISOR__ +#if defined(__KVM_NVHE_HYPERVISOR__) +#define VHE_ALT_KEY ARM64_KVM_HVHE +#else +#define VHE_ALT_KEY ARM64_HAS_VIRT_HOST_EXTN +#endif + #define read_sysreg_elx(r,nvh,vh) \ ({ \ u64 reg; \ - asm volatile(ALTERNATIVE(__mrs_s("%0", r##nvh), \ + asm volatile(ALTERNATIVE(__mrs_s("%0", r##nvh), \ __mrs_s("%0", r##vh), \ - ARM64_HAS_VIRT_HOST_EXTN) \ + VHE_ALT_KEY) \ : "=r" (reg)); \ reg; \ }) @@ -48,7 +54,7 @@ DECLARE_PER_CPU(struct kvm_nvhe_init_params, kvm_init_params); u64 __val = (u64)(v); \ asm volatile(ALTERNATIVE(__msr_s(r##nvh, "%x0"), \ __msr_s(r##vh, "%x0"), \ - ARM64_HAS_VIRT_HOST_EXTN) \ + VHE_ALT_KEY) \ : : "rZ" (__val)); \ } while (0)
We can now start with the fun stuff: if we enable VHE *only* for the hypervisor, we need to generate the VHE instructions when accessing the system registers. For this, reporpose the alternative sequence to be keyed off ARM64_KVM_HVHE in the nVHE hypervisor code, and only there. Signed-off-by: Marc Zyngier <maz@kernel.org> --- arch/arm64/include/asm/kvm_hyp.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)