Re: [PATCH 07/11] KVM: arm64: Inject AArch64 exceptions from HYP
From: James Morse <james.morse@arm.com>
Date: 2020-10-27 17:42:48
Also in:
kvm, kvmarm
Hi Marc, On 26/10/2020 13:34, Marc Zyngier wrote:
Move the AArch64 exception injection code from EL1 to HYP, leaving only the ESR_EL1 updates to EL1. In order to come with the differences
(cope with the differences?)
between VHE and nVHE, two set of system register accessors are provided. SPSR, ELR, PC and PSTATE are now completely handled in the hypervisor.
quoted hunk ↗ jump to hunk
diff --git a/arch/arm64/kvm/hyp/exception.c b/arch/arm64/kvm/hyp/exception.c index 6533a9270850..cd6e643639e8 100644 --- a/arch/arm64/kvm/hyp/exception.c +++ b/arch/arm64/kvm/hyp/exception.c@@ -11,7 +11,167 @@ */ #include <hyp/adjust_pc.h> +#include <linux/kvm_host.h> +#include <asm/kvm_emulate.h> + +#if defined (__KVM_NVHE_HYPERVISOR__) +/* + * System registers are never loaded on the CPU until we actually + * restore them. + */ +static inline u64 __vcpu_read_sys_reg(const struct kvm_vcpu *vcpu, int reg) +{ + return __vcpu_sys_reg(vcpu, reg); +} + +static inline void __vcpu_write_sys_reg(struct kvm_vcpu *vcpu, u64 val, int reg) +{ + __vcpu_sys_reg(vcpu, reg) = val; +} + +static void __vcpu_write_spsr(struct kvm_vcpu *vcpu, u64 val) +{ + write_sysreg_el1(val, SYS_SPSR); +} +#elif defined (__KVM_VHE_HYPERVISOR__) +/* On VHE, all the registers are already loaded on the CPU */ +static inline u64 __vcpu_read_sys_reg(const struct kvm_vcpu *vcpu, int reg) +{ + u64 val;
+ if (__vcpu_read_sys_reg_from_cpu(reg, &val)) + return val;
As has_vhe()'s behaviour changes based on these KVM preprocessor symbols, would: | if (has_vhe() && __vcpu_read_sys_reg_from_cpu(reg, &val)) | return val; let you do both of these with only one copy of the function?
+ return __vcpu_sys_reg(vcpu, reg);
+}
+
+static inline void __vcpu_write_sys_reg(struct kvm_vcpu *vcpu, u64 val, int reg)
+{
+ if (__vcpu_write_sys_reg_to_cpu(val, reg))
+ return;
+
+ __vcpu_sys_reg(vcpu, reg) = val;
+}+static void __vcpu_write_spsr(struct kvm_vcpu *vcpu, u64 val)
+{
+ write_sysreg_el1(val, SYS_SPSR);
+}This one doesn't look like it needs duplicating.
+#else +#error Hypervisor code only! +#endif
Thanks, James _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel