arm64: KVM: VHE: Differenciate host/guest sysreg save/restore
With ARMv8, host and guest share the same system register file, making the save/restore procedure completely symetrical. With VHE, host and guest now have different requirements, as they use different sysregs. In order to prepare for this, add split sysreg save/restore functions for both host and guest. No functional changes yet. Acked-by: Christoffer Dall <christoffer.dall@linaro.org> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
This commit is contained in:
parent
915ccd1dbf
commit
edef528dc4
@ -153,8 +153,10 @@ void __vgic_v3_restore_state(struct kvm_vcpu *vcpu);
|
|||||||
void __timer_save_state(struct kvm_vcpu *vcpu);
|
void __timer_save_state(struct kvm_vcpu *vcpu);
|
||||||
void __timer_restore_state(struct kvm_vcpu *vcpu);
|
void __timer_restore_state(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
void __sysreg_save_state(struct kvm_cpu_context *ctxt);
|
void __sysreg_save_host_state(struct kvm_cpu_context *ctxt);
|
||||||
void __sysreg_restore_state(struct kvm_cpu_context *ctxt);
|
void __sysreg_restore_host_state(struct kvm_cpu_context *ctxt);
|
||||||
|
void __sysreg_save_guest_state(struct kvm_cpu_context *ctxt);
|
||||||
|
void __sysreg_restore_guest_state(struct kvm_cpu_context *ctxt);
|
||||||
void __sysreg32_save_state(struct kvm_vcpu *vcpu);
|
void __sysreg32_save_state(struct kvm_vcpu *vcpu);
|
||||||
void __sysreg32_restore_state(struct kvm_vcpu *vcpu);
|
void __sysreg32_restore_state(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ static int __hyp_text __guest_run(struct kvm_vcpu *vcpu)
|
|||||||
host_ctxt = kern_hyp_va(vcpu->arch.host_cpu_context);
|
host_ctxt = kern_hyp_va(vcpu->arch.host_cpu_context);
|
||||||
guest_ctxt = &vcpu->arch.ctxt;
|
guest_ctxt = &vcpu->arch.ctxt;
|
||||||
|
|
||||||
__sysreg_save_state(host_ctxt);
|
__sysreg_save_host_state(host_ctxt);
|
||||||
__debug_cond_save_host_state(vcpu);
|
__debug_cond_save_host_state(vcpu);
|
||||||
|
|
||||||
__activate_traps(vcpu);
|
__activate_traps(vcpu);
|
||||||
@ -116,7 +116,7 @@ static int __hyp_text __guest_run(struct kvm_vcpu *vcpu)
|
|||||||
* to Cortex-A57 erratum #852523.
|
* to Cortex-A57 erratum #852523.
|
||||||
*/
|
*/
|
||||||
__sysreg32_restore_state(vcpu);
|
__sysreg32_restore_state(vcpu);
|
||||||
__sysreg_restore_state(guest_ctxt);
|
__sysreg_restore_guest_state(guest_ctxt);
|
||||||
__debug_restore_state(vcpu, kern_hyp_va(vcpu->arch.debug_ptr), guest_ctxt);
|
__debug_restore_state(vcpu, kern_hyp_va(vcpu->arch.debug_ptr), guest_ctxt);
|
||||||
|
|
||||||
/* Jump in the fire! */
|
/* Jump in the fire! */
|
||||||
@ -125,7 +125,7 @@ static int __hyp_text __guest_run(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
fp_enabled = __fpsimd_enabled();
|
fp_enabled = __fpsimd_enabled();
|
||||||
|
|
||||||
__sysreg_save_state(guest_ctxt);
|
__sysreg_save_guest_state(guest_ctxt);
|
||||||
__sysreg32_save_state(vcpu);
|
__sysreg32_save_state(vcpu);
|
||||||
__timer_save_state(vcpu);
|
__timer_save_state(vcpu);
|
||||||
__vgic_save_state(vcpu);
|
__vgic_save_state(vcpu);
|
||||||
@ -133,7 +133,7 @@ static int __hyp_text __guest_run(struct kvm_vcpu *vcpu)
|
|||||||
__deactivate_traps(vcpu);
|
__deactivate_traps(vcpu);
|
||||||
__deactivate_vm(vcpu);
|
__deactivate_vm(vcpu);
|
||||||
|
|
||||||
__sysreg_restore_state(host_ctxt);
|
__sysreg_restore_host_state(host_ctxt);
|
||||||
|
|
||||||
if (fp_enabled) {
|
if (fp_enabled) {
|
||||||
__fpsimd_save_state(&guest_ctxt->gp_regs.fp_regs);
|
__fpsimd_save_state(&guest_ctxt->gp_regs.fp_regs);
|
||||||
@ -165,7 +165,7 @@ void __hyp_text __noreturn __hyp_panic(void)
|
|||||||
host_ctxt = kern_hyp_va(vcpu->arch.host_cpu_context);
|
host_ctxt = kern_hyp_va(vcpu->arch.host_cpu_context);
|
||||||
__deactivate_traps(vcpu);
|
__deactivate_traps(vcpu);
|
||||||
__deactivate_vm(vcpu);
|
__deactivate_vm(vcpu);
|
||||||
__sysreg_restore_state(host_ctxt);
|
__sysreg_restore_host_state(host_ctxt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call panic for real */
|
/* Call panic for real */
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#include "hyp.h"
|
#include "hyp.h"
|
||||||
|
|
||||||
/* ctxt is already in the HYP VA space */
|
/* ctxt is already in the HYP VA space */
|
||||||
void __hyp_text __sysreg_save_state(struct kvm_cpu_context *ctxt)
|
static void __hyp_text __sysreg_save_state(struct kvm_cpu_context *ctxt)
|
||||||
{
|
{
|
||||||
ctxt->sys_regs[MPIDR_EL1] = read_sysreg(vmpidr_el2);
|
ctxt->sys_regs[MPIDR_EL1] = read_sysreg(vmpidr_el2);
|
||||||
ctxt->sys_regs[CSSELR_EL1] = read_sysreg(csselr_el1);
|
ctxt->sys_regs[CSSELR_EL1] = read_sysreg(csselr_el1);
|
||||||
@ -57,7 +57,17 @@ void __hyp_text __sysreg_save_state(struct kvm_cpu_context *ctxt)
|
|||||||
ctxt->gp_regs.spsr[KVM_SPSR_EL1]= read_sysreg(spsr_el1);
|
ctxt->gp_regs.spsr[KVM_SPSR_EL1]= read_sysreg(spsr_el1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __hyp_text __sysreg_restore_state(struct kvm_cpu_context *ctxt)
|
void __hyp_text __sysreg_save_host_state(struct kvm_cpu_context *ctxt)
|
||||||
|
{
|
||||||
|
__sysreg_save_state(ctxt);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __hyp_text __sysreg_save_guest_state(struct kvm_cpu_context *ctxt)
|
||||||
|
{
|
||||||
|
__sysreg_save_state(ctxt);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __hyp_text __sysreg_restore_state(struct kvm_cpu_context *ctxt)
|
||||||
{
|
{
|
||||||
write_sysreg(ctxt->sys_regs[MPIDR_EL1], vmpidr_el2);
|
write_sysreg(ctxt->sys_regs[MPIDR_EL1], vmpidr_el2);
|
||||||
write_sysreg(ctxt->sys_regs[CSSELR_EL1], csselr_el1);
|
write_sysreg(ctxt->sys_regs[CSSELR_EL1], csselr_el1);
|
||||||
@ -90,6 +100,16 @@ void __hyp_text __sysreg_restore_state(struct kvm_cpu_context *ctxt)
|
|||||||
write_sysreg(ctxt->gp_regs.spsr[KVM_SPSR_EL1], spsr_el1);
|
write_sysreg(ctxt->gp_regs.spsr[KVM_SPSR_EL1], spsr_el1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __hyp_text __sysreg_restore_host_state(struct kvm_cpu_context *ctxt)
|
||||||
|
{
|
||||||
|
__sysreg_restore_state(ctxt);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __hyp_text __sysreg_restore_guest_state(struct kvm_cpu_context *ctxt)
|
||||||
|
{
|
||||||
|
__sysreg_restore_state(ctxt);
|
||||||
|
}
|
||||||
|
|
||||||
void __hyp_text __sysreg32_save_state(struct kvm_vcpu *vcpu)
|
void __hyp_text __sysreg32_save_state(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
u64 *spsr, *sysreg;
|
u64 *spsr, *sysreg;
|
||||||
|
Loading…
Reference in New Issue
Block a user