| From 8762ea4e263cf4888551991113f1caaa42620199 Mon Sep 17 00:00:00 2001 |
| From: Marc Zyngier <maz@kernel.org> |
| Date: Tue, 9 Jun 2020 08:40:35 +0100 |
| Subject: [PATCH] KVM: arm64: Make vcpu_cp1x() work on Big Endian hosts |
| |
| commit 3204be4109ad681523e3461ce64454c79278450a upstream. |
| |
| AArch32 CP1x registers are overlayed on their AArch64 counterparts |
| in the vcpu struct. This leads to an interesting problem as they |
| are stored in their CPU-local format, and thus a CP1x register |
| doesn't "hit" the lower 32bit portion of the AArch64 register on |
| a BE host. |
| |
| To workaround this unfortunate situation, introduce a bias trick |
| in the vcpu_cp1x() accessors which picks the correct half of the |
| 64bit register. |
| |
| Cc: stable@vger.kernel.org |
| Reported-by: James Morse <james.morse@arm.com> |
| Tested-by: James Morse <james.morse@arm.com> |
| Acked-by: James Morse <james.morse@arm.com> |
| Signed-off-by: Marc Zyngier <maz@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h |
| index 9f19c354b165..5ecf3ea2ede4 100644 |
| --- a/arch/arm64/include/asm/kvm_host.h |
| +++ b/arch/arm64/include/asm/kvm_host.h |
| @@ -392,8 +392,10 @@ void vcpu_write_sys_reg(struct kvm_vcpu *vcpu, u64 val, int reg); |
| * CP14 and CP15 live in the same array, as they are backed by the |
| * same system registers. |
| */ |
| -#define vcpu_cp14(v,r) ((v)->arch.ctxt.copro[(r)]) |
| -#define vcpu_cp15(v,r) ((v)->arch.ctxt.copro[(r)]) |
| +#define CPx_BIAS IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) |
| + |
| +#define vcpu_cp14(v,r) ((v)->arch.ctxt.copro[(r) ^ CPx_BIAS]) |
| +#define vcpu_cp15(v,r) ((v)->arch.ctxt.copro[(r) ^ CPx_BIAS]) |
| |
| struct kvm_vm_stat { |
| ulong remote_tlb_flush; |
| -- |
| 2.27.0 |
| |