mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
ANDROID: KVM: arm64: pkvm: Make {flush,sync}_shadow_state() take the full state
As we're about to need to copy some state back and forth for non0-protected guests, pass the full loaded state to the flush/sync functions. No functionnal change. Signed-off-by: Marc Zyngier <maz@kernel.org> Bug: 209580772 Change-Id: I7ad6a00a7500e91237fcc0981261c819b2224ee0 Signed-off-by: Will Deacon <willdeacon@google.com>
This commit is contained in:
committed by
Will Deacon
parent
4262892c41
commit
a1ab3b544a
@@ -408,8 +408,13 @@ static void sync_vgic_state(struct kvm_vcpu *host_vcpu,
|
||||
host_cpu_if->vgic_lr[i] = shadow_cpu_if->vgic_lr[i];
|
||||
}
|
||||
|
||||
static void flush_timer_state(struct kvm_vcpu *shadow_vcpu)
|
||||
static void flush_timer_state(struct pkvm_loaded_state *state)
|
||||
{
|
||||
struct kvm_vcpu *shadow_vcpu = state->vcpu;
|
||||
|
||||
if (!state->is_protected)
|
||||
return;
|
||||
|
||||
/*
|
||||
* A shadow vcpu has no offset, and sees vtime == ptime. The
|
||||
* ptimer is fully emulated by EL1 and cannot be trusted.
|
||||
@@ -420,8 +425,13 @@ static void flush_timer_state(struct kvm_vcpu *shadow_vcpu)
|
||||
write_sysreg_el0(__vcpu_sys_reg(shadow_vcpu, CNTV_CTL_EL0), SYS_CNTV_CTL);
|
||||
}
|
||||
|
||||
static void sync_timer_state(struct kvm_vcpu *shadow_vcpu)
|
||||
static void sync_timer_state(struct pkvm_loaded_state *state)
|
||||
{
|
||||
struct kvm_vcpu *shadow_vcpu = state->vcpu;
|
||||
|
||||
if (!state->is_protected)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Preserve the vtimer state so that it is always correct,
|
||||
* even if the host tries to make a mess.
|
||||
@@ -430,8 +440,9 @@ static void sync_timer_state(struct kvm_vcpu *shadow_vcpu)
|
||||
__vcpu_sys_reg(shadow_vcpu, CNTV_CTL_EL0) = read_sysreg_el0(SYS_CNTV_CTL);
|
||||
}
|
||||
|
||||
static void flush_shadow_state(struct kvm_vcpu *shadow_vcpu)
|
||||
static void flush_shadow_state(struct pkvm_loaded_state *state)
|
||||
{
|
||||
struct kvm_vcpu *shadow_vcpu = state->vcpu;
|
||||
struct kvm_vcpu *host_vcpu = shadow_vcpu->arch.pkvm.host_vcpu;
|
||||
u8 esr_ec;
|
||||
shadow_entry_exit_handler_fn ec_handler;
|
||||
@@ -440,7 +451,7 @@ static void flush_shadow_state(struct kvm_vcpu *shadow_vcpu)
|
||||
pkvm_reset_vcpu(shadow_vcpu);
|
||||
|
||||
flush_vgic_state(host_vcpu, shadow_vcpu);
|
||||
flush_timer_state(shadow_vcpu);
|
||||
flush_timer_state(state);
|
||||
|
||||
switch (ARM_EXCEPTION_CODE(shadow_vcpu->arch.pkvm.exit_code)) {
|
||||
case ARM_EXCEPTION_IRQ:
|
||||
@@ -462,14 +473,15 @@ static void flush_shadow_state(struct kvm_vcpu *shadow_vcpu)
|
||||
shadow_vcpu->arch.pkvm.exit_code = 0;
|
||||
}
|
||||
|
||||
static void sync_shadow_state(struct kvm_vcpu *shadow_vcpu, u32 exit_reason)
|
||||
static void sync_shadow_state(struct pkvm_loaded_state *state, u32 exit_reason)
|
||||
{
|
||||
struct kvm_vcpu *shadow_vcpu = state->vcpu;
|
||||
struct kvm_vcpu *host_vcpu = shadow_vcpu->arch.pkvm.host_vcpu;
|
||||
u8 esr_ec;
|
||||
shadow_entry_exit_handler_fn ec_handler;
|
||||
|
||||
sync_vgic_state(host_vcpu, shadow_vcpu);
|
||||
sync_timer_state(shadow_vcpu);
|
||||
sync_timer_state(state);
|
||||
|
||||
switch (ARM_EXCEPTION_CODE(exit_reason)) {
|
||||
case ARM_EXCEPTION_IRQ:
|
||||
@@ -579,11 +591,11 @@ static void handle___kvm_vcpu_run(struct kvm_cpu_context *host_ctxt)
|
||||
if (unlikely(is_protected_kvm_enabled())) {
|
||||
struct pkvm_loaded_state *state = this_cpu_ptr(&loaded_state);
|
||||
|
||||
flush_shadow_state(state->vcpu);
|
||||
flush_shadow_state(state);
|
||||
|
||||
ret = __kvm_vcpu_run(state->vcpu);
|
||||
|
||||
sync_shadow_state(state->vcpu, ret);
|
||||
sync_shadow_state(state, ret);
|
||||
|
||||
if (state->vcpu->arch.flags & KVM_ARM64_FP_ENABLED) {
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user