Skip to content

Commit 27cde4c

Browse files
committed
KVM: arm64: Rename helpers for VHE vCPU load/put
The names for the helpers we expose to the 'generic' KVM code are a bit imprecise; we switch the EL0 + EL1 sysreg context and setup trap controls that do not need to change for every guest entry/exit. Rename + shuffle things around a bit in preparation for loading the stage-2 MMU context on vcpu_load(). Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Oliver Upton <[email protected]>
1 parent 5eba523 commit 27cde4c

File tree

5 files changed

+25
-19
lines changed

5 files changed

+25
-19
lines changed

arch/arm64/include/asm/kvm_host.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,8 +1109,8 @@ static inline bool kvm_set_pmuserenr(u64 val)
11091109
}
11101110
#endif
11111111

1112-
void kvm_vcpu_load_sysregs_vhe(struct kvm_vcpu *vcpu);
1113-
void kvm_vcpu_put_sysregs_vhe(struct kvm_vcpu *vcpu);
1112+
void kvm_vcpu_load_vhe(struct kvm_vcpu *vcpu);
1113+
void kvm_vcpu_put_vhe(struct kvm_vcpu *vcpu);
11141114

11151115
int __init kvm_set_ipa_limit(void);
11161116

arch/arm64/include/asm/kvm_hyp.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ void __timer_disable_traps(struct kvm_vcpu *vcpu);
9393
void __sysreg_save_state_nvhe(struct kvm_cpu_context *ctxt);
9494
void __sysreg_restore_state_nvhe(struct kvm_cpu_context *ctxt);
9595
#else
96+
void __vcpu_load_switch_sysregs(struct kvm_vcpu *vcpu);
97+
void __vcpu_put_switch_sysregs(struct kvm_vcpu *vcpu);
9698
void sysreg_save_host_state_vhe(struct kvm_cpu_context *ctxt);
9799
void sysreg_restore_host_state_vhe(struct kvm_cpu_context *ctxt);
98100
void sysreg_save_guest_state_vhe(struct kvm_cpu_context *ctxt);
@@ -111,11 +113,6 @@ void __fpsimd_save_state(struct user_fpsimd_state *fp_regs);
111113
void __fpsimd_restore_state(struct user_fpsimd_state *fp_regs);
112114
void __sve_restore_state(void *sve_pffr, u32 *fpsr);
113115

114-
#ifndef __KVM_NVHE_HYPERVISOR__
115-
void activate_traps_vhe_load(struct kvm_vcpu *vcpu);
116-
void deactivate_traps_vhe_put(struct kvm_vcpu *vcpu);
117-
#endif
118-
119116
u64 __guest_enter(struct kvm_vcpu *vcpu);
120117

121118
bool kvm_host_psci_handler(struct kvm_cpu_context *host_ctxt, u32 func_id);

arch/arm64/kvm/arm.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
448448
kvm_vgic_load(vcpu);
449449
kvm_timer_vcpu_load(vcpu);
450450
if (has_vhe())
451-
kvm_vcpu_load_sysregs_vhe(vcpu);
451+
kvm_vcpu_load_vhe(vcpu);
452452
kvm_arch_vcpu_load_fp(vcpu);
453453
kvm_vcpu_pmu_restore_guest(vcpu);
454454
if (kvm_arm_is_pvtime_enabled(&vcpu->arch))
@@ -472,7 +472,7 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
472472
kvm_arch_vcpu_put_debug_state_flags(vcpu);
473473
kvm_arch_vcpu_put_fp(vcpu);
474474
if (has_vhe())
475-
kvm_vcpu_put_sysregs_vhe(vcpu);
475+
kvm_vcpu_put_vhe(vcpu);
476476
kvm_timer_vcpu_put(vcpu);
477477
kvm_vgic_put(vcpu);
478478
kvm_vcpu_pmu_restore_host(vcpu);

arch/arm64/kvm/hyp/vhe/switch.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,12 @@ static void __deactivate_traps(struct kvm_vcpu *vcpu)
9393
NOKPROBE_SYMBOL(__deactivate_traps);
9494

9595
/*
96-
* Disable IRQs in {activate,deactivate}_traps_vhe_{load,put}() to
96+
* Disable IRQs in __vcpu_{load,put}_{activate,deactivate}_traps() to
9797
* prevent a race condition between context switching of PMUSERENR_EL0
9898
* in __{activate,deactivate}_traps_common() and IPIs that attempts to
9999
* update PMUSERENR_EL0. See also kvm_set_pmuserenr().
100100
*/
101-
void activate_traps_vhe_load(struct kvm_vcpu *vcpu)
101+
static void __vcpu_load_activate_traps(struct kvm_vcpu *vcpu)
102102
{
103103
unsigned long flags;
104104

@@ -107,7 +107,7 @@ void activate_traps_vhe_load(struct kvm_vcpu *vcpu)
107107
local_irq_restore(flags);
108108
}
109109

110-
void deactivate_traps_vhe_put(struct kvm_vcpu *vcpu)
110+
static void __vcpu_put_deactivate_traps(struct kvm_vcpu *vcpu)
111111
{
112112
unsigned long flags;
113113

@@ -116,6 +116,18 @@ void deactivate_traps_vhe_put(struct kvm_vcpu *vcpu)
116116
local_irq_restore(flags);
117117
}
118118

119+
void kvm_vcpu_load_vhe(struct kvm_vcpu *vcpu)
120+
{
121+
__vcpu_load_switch_sysregs(vcpu);
122+
__vcpu_load_activate_traps(vcpu);
123+
}
124+
125+
void kvm_vcpu_put_vhe(struct kvm_vcpu *vcpu)
126+
{
127+
__vcpu_put_deactivate_traps(vcpu);
128+
__vcpu_put_switch_sysregs(vcpu);
129+
}
130+
119131
static const exit_handler_fn hyp_exit_handlers[] = {
120132
[0 ... ESR_ELx_EC_MAX] = NULL,
121133
[ESR_ELx_EC_CP15_32] = kvm_hyp_handle_cp15_32,

arch/arm64/kvm/hyp/vhe/sysreg-sr.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void sysreg_restore_guest_state_vhe(struct kvm_cpu_context *ctxt)
5252
NOKPROBE_SYMBOL(sysreg_restore_guest_state_vhe);
5353

5454
/**
55-
* kvm_vcpu_load_sysregs_vhe - Load guest system registers to the physical CPU
55+
* __vcpu_load_switch_sysregs - Load guest system registers to the physical CPU
5656
*
5757
* @vcpu: The VCPU pointer
5858
*
@@ -62,7 +62,7 @@ NOKPROBE_SYMBOL(sysreg_restore_guest_state_vhe);
6262
* and loading system register state early avoids having to load them on
6363
* every entry to the VM.
6464
*/
65-
void kvm_vcpu_load_sysregs_vhe(struct kvm_vcpu *vcpu)
65+
void __vcpu_load_switch_sysregs(struct kvm_vcpu *vcpu)
6666
{
6767
struct kvm_cpu_context *guest_ctxt = &vcpu->arch.ctxt;
6868
struct kvm_cpu_context *host_ctxt;
@@ -92,12 +92,10 @@ void kvm_vcpu_load_sysregs_vhe(struct kvm_vcpu *vcpu)
9292
__sysreg_restore_el1_state(guest_ctxt);
9393

9494
vcpu_set_flag(vcpu, SYSREGS_ON_CPU);
95-
96-
activate_traps_vhe_load(vcpu);
9795
}
9896

9997
/**
100-
* kvm_vcpu_put_sysregs_vhe - Restore host system registers to the physical CPU
98+
* __vcpu_put_switch_syregs - Restore host system registers to the physical CPU
10199
*
102100
* @vcpu: The VCPU pointer
103101
*
@@ -107,13 +105,12 @@ void kvm_vcpu_load_sysregs_vhe(struct kvm_vcpu *vcpu)
107105
* and deferring saving system register state until we're no longer running the
108106
* VCPU avoids having to save them on every exit from the VM.
109107
*/
110-
void kvm_vcpu_put_sysregs_vhe(struct kvm_vcpu *vcpu)
108+
void __vcpu_put_switch_sysregs(struct kvm_vcpu *vcpu)
111109
{
112110
struct kvm_cpu_context *guest_ctxt = &vcpu->arch.ctxt;
113111
struct kvm_cpu_context *host_ctxt;
114112

115113
host_ctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt;
116-
deactivate_traps_vhe_put(vcpu);
117114

118115
__sysreg_save_el1_state(guest_ctxt);
119116
__sysreg_save_user_state(guest_ctxt);

0 commit comments

Comments
 (0)