mirror of https://gitee.com/openkylin/linux.git
KVM: arm64: Stop save/restoring ACTLR_EL1
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
This commit is contained in:
parent
ef5a294be8
commit
e8679fedd0
|
@ -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[CSSELR_EL1] = read_sysreg(csselr_el1);
|
||||||
ctxt->sys_regs[SCTLR_EL1] = read_sysreg_el1(SYS_SCTLR);
|
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[CPACR_EL1] = read_sysreg_el1(SYS_CPACR);
|
||||||
ctxt->sys_regs[TTBR0_EL1] = read_sysreg_el1(SYS_TTBR0);
|
ctxt->sys_regs[TTBR0_EL1] = read_sysreg_el1(SYS_TTBR0);
|
||||||
ctxt->sys_regs[TTBR1_EL1] = read_sysreg_el1(SYS_TTBR1);
|
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();
|
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[CPACR_EL1], SYS_CPACR);
|
||||||
write_sysreg_el1(ctxt->sys_regs[TTBR0_EL1], SYS_TTBR0);
|
write_sysreg_el1(ctxt->sys_regs[TTBR0_EL1], SYS_TTBR0);
|
||||||
write_sysreg_el1(ctxt->sys_regs[TTBR1_EL1], SYS_TTBR1);
|
write_sysreg_el1(ctxt->sys_regs[TTBR1_EL1], SYS_TTBR1);
|
||||||
|
|
|
@ -78,7 +78,6 @@ static bool __vcpu_read_sys_reg_from_cpu(int reg, u64 *val)
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case CSSELR_EL1: *val = read_sysreg_s(SYS_CSSELR_EL1); break;
|
case CSSELR_EL1: *val = read_sysreg_s(SYS_CSSELR_EL1); break;
|
||||||
case SCTLR_EL1: *val = read_sysreg_s(SYS_SCTLR_EL12); 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 CPACR_EL1: *val = read_sysreg_s(SYS_CPACR_EL12); break;
|
||||||
case TTBR0_EL1: *val = read_sysreg_s(SYS_TTBR0_EL12); break;
|
case TTBR0_EL1: *val = read_sysreg_s(SYS_TTBR0_EL12); break;
|
||||||
case TTBR1_EL1: *val = read_sysreg_s(SYS_TTBR1_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) {
|
switch (reg) {
|
||||||
case CSSELR_EL1: write_sysreg_s(val, SYS_CSSELR_EL1); break;
|
case CSSELR_EL1: write_sysreg_s(val, SYS_CSSELR_EL1); break;
|
||||||
case SCTLR_EL1: write_sysreg_s(val, SYS_SCTLR_EL12); 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 CPACR_EL1: write_sysreg_s(val, SYS_CPACR_EL12); break;
|
||||||
case TTBR0_EL1: write_sysreg_s(val, SYS_TTBR0_EL12); break;
|
case TTBR0_EL1: write_sysreg_s(val, SYS_TTBR0_EL12); break;
|
||||||
case TTBR1_EL1: write_sysreg_s(val, SYS_TTBR1_EL12); break;
|
case TTBR1_EL1: write_sysreg_s(val, SYS_TTBR1_EL12); break;
|
||||||
|
|
Loading…
Reference in New Issue