KVM: arm64: Move SP_EL1 to the system register array
authorMarc Zyngier <maz@kernel.org>
Fri, 28 Jun 2019 22:05:38 +0000 (23:05 +0100)
committerMarc Zyngier <maz@kernel.org>
Tue, 7 Jul 2020 08:28:38 +0000 (09:28 +0100)
SP_EL1 being a VNCR-capable register with ARMv8.4-NV, move it to the
system register array and update the accessors.

Reviewed-by: James Morse <james.morse@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/include/asm/kvm_host.h
arch/arm64/kvm/guest.c
arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h

index f255507dd9164f8d35802dc92ce4cbad3a3cf784..2bd6285eaf4c69fdf7a5c050fb42279c079f1a74 100644 (file)
@@ -186,6 +186,7 @@ enum vcpu_sysreg {
        APGAKEYHI_EL1,
 
        ELR_EL1,
+       SP_EL1,
 
        /* 32bit specific registers. Keep them at the end of the range */
        DACR32_EL2,     /* Domain Access Control Register */
@@ -240,8 +241,6 @@ enum vcpu_sysreg {
 struct kvm_cpu_context {
        struct user_pt_regs regs;       /* sp = sp_el0 */
 
-       u64     sp_el1;
-
        u64     spsr[KVM_NR_SPSR];
 
        struct user_fpsimd_state fp_regs;
index 99ff09ad24e8f423add43d73cc0963066cfebfa4..d614716e073b8aadbf8c6707dd88be22c81de89f 100644 (file)
@@ -129,7 +129,7 @@ static void *core_reg_addr(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
                return &vcpu->arch.ctxt.regs.pstate;
 
        case KVM_REG_ARM_CORE_REG(sp_el1):
-               return &vcpu->arch.ctxt.sp_el1;
+               return __ctxt_sys_reg(&vcpu->arch.ctxt, SP_EL1);
 
        case KVM_REG_ARM_CORE_REG(elr_el1):
                return __ctxt_sys_reg(&vcpu->arch.ctxt, ELR_EL1);
index 9ebbd626d4ab0ffc0d9923ce10ae16bea92c5450..4c26ba72120ec6e99db68e7a32ee6c2e1b6a6abb 100644 (file)
@@ -46,7 +46,7 @@ static inline void __sysreg_save_el1_state(struct kvm_cpu_context *ctxt)
        ctxt_sys_reg(ctxt, PAR_EL1)     = read_sysreg(par_el1);
        ctxt_sys_reg(ctxt, TPIDR_EL1)   = read_sysreg(tpidr_el1);
 
-       ctxt->sp_el1                    = read_sysreg(sp_el1);
+       ctxt_sys_reg(ctxt, SP_EL1)      = read_sysreg(sp_el1);
        ctxt_sys_reg(ctxt, ELR_EL1)     = read_sysreg_el1(SYS_ELR);
        ctxt->spsr[KVM_SPSR_EL1]        = read_sysreg_el1(SYS_SPSR);
 }
@@ -125,7 +125,7 @@ static inline void __sysreg_restore_el1_state(struct kvm_cpu_context *ctxt)
                write_sysreg_el1(ctxt_sys_reg(ctxt, TCR_EL1),   SYS_TCR);
        }
 
-       write_sysreg(ctxt->sp_el1,                      sp_el1);
+       write_sysreg(ctxt_sys_reg(ctxt, SP_EL1),        sp_el1);
        write_sysreg_el1(ctxt_sys_reg(ctxt, ELR_EL1),   SYS_ELR);
        write_sysreg_el1(ctxt->spsr[KVM_SPSR_EL1],      SYS_SPSR);
 }