OSDN Git Service

KVM: arm64: Stop save/restoring ACTLR_EL1
authorJames Morse <james.morse@arm.com>
Fri, 29 May 2020 15:06:56 +0000 (15:06 +0000)
committerMarc Zyngier <maz@kernel.org>
Tue, 9 Jun 2020 08:07:58 +0000 (09:07 +0100)
KVM sets HCR_EL2.TACR via HCR_GUEST_FLAGS. This means ACTLR* accesses
from the guest are always trapped, and always return the value in the
sys_regs array.

The guest can't change the value of these registers, so we are
save restoring the reset value, which came from the host.

Stop save/restoring this register. Keep the storage for this register
in sys_regs[] as this is how the value is exposed to user-space,
removing it would break migration.

Signed-off-by: James Morse <james.morse@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20200529150656.7339-4-james.morse@arm.com
arch/arm64/kvm/hyp/sysreg-sr.c
arch/arm64/kvm/sys_regs.c

index 6d2df9f..0d60e6e 100644 (file)
@@ -39,7 +39,6 @@ static void __hyp_text __sysreg_save_el1_state(struct kvm_cpu_context *ctxt)
 {
        ctxt->sys_regs[CSSELR_EL1]      = read_sysreg(csselr_el1);
        ctxt->sys_regs[SCTLR_EL1]       = read_sysreg_el1(SYS_SCTLR);
-       ctxt->sys_regs[ACTLR_EL1]       = read_sysreg(actlr_el1);
        ctxt->sys_regs[CPACR_EL1]       = read_sysreg_el1(SYS_CPACR);
        ctxt->sys_regs[TTBR0_EL1]       = read_sysreg_el1(SYS_TTBR0);
        ctxt->sys_regs[TTBR1_EL1]       = read_sysreg_el1(SYS_TTBR1);
@@ -122,7 +121,6 @@ static void __hyp_text __sysreg_restore_el1_state(struct kvm_cpu_context *ctxt)
                isb();
        }
 
-       write_sysreg(ctxt->sys_regs[ACTLR_EL1],         actlr_el1);
        write_sysreg_el1(ctxt->sys_regs[CPACR_EL1],     SYS_CPACR);
        write_sysreg_el1(ctxt->sys_regs[TTBR0_EL1],     SYS_TTBR0);
        write_sysreg_el1(ctxt->sys_regs[TTBR1_EL1],     SYS_TTBR1);
index 12f8d57..dfb966f 100644 (file)
@@ -78,7 +78,6 @@ static bool __vcpu_read_sys_reg_from_cpu(int reg, u64 *val)
        switch (reg) {
        case CSSELR_EL1:        *val = read_sysreg_s(SYS_CSSELR_EL1);   break;
        case SCTLR_EL1:         *val = read_sysreg_s(SYS_SCTLR_EL12);   break;
-       case ACTLR_EL1:         *val = read_sysreg_s(SYS_ACTLR_EL1);    break;
        case CPACR_EL1:         *val = read_sysreg_s(SYS_CPACR_EL12);   break;
        case TTBR0_EL1:         *val = read_sysreg_s(SYS_TTBR0_EL12);   break;
        case TTBR1_EL1:         *val = read_sysreg_s(SYS_TTBR1_EL12);   break;
@@ -118,7 +117,6 @@ static bool __vcpu_write_sys_reg_to_cpu(u64 val, int reg)
        switch (reg) {
        case CSSELR_EL1:        write_sysreg_s(val, SYS_CSSELR_EL1);    break;
        case SCTLR_EL1:         write_sysreg_s(val, SYS_SCTLR_EL12);    break;
-       case ACTLR_EL1:         write_sysreg_s(val, SYS_ACTLR_EL1);     break;
        case CPACR_EL1:         write_sysreg_s(val, SYS_CPACR_EL12);    break;
        case TTBR0_EL1:         write_sysreg_s(val, SYS_TTBR0_EL12);    break;
        case TTBR1_EL1:         write_sysreg_s(val, SYS_TTBR1_EL12);    break;