Commit a0e47952 authored by Andrew Scull's avatar Andrew Scull Committed by Marc Zyngier

KVM: arm64: Save chosen hyp vector to a percpu variable

Introduce a percpu variable to hold the address of the selected hyp
vector that will be used with guests. This avoids the selection process
each time a guest is being entered and can be used by nVHE when a
separate vector is introduced for the host.
Signed-off-by: default avatarAndrew Scull <ascull@google.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20200915104643.2543892-6-ascull@google.com
parent ceee2fe4
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
#include <asm/alternative.h> #include <asm/alternative.h>
#include <asm/sysreg.h> #include <asm/sysreg.h>
DECLARE_PER_CPU(unsigned long, kvm_hyp_vector);
#define read_sysreg_elx(r,nvh,vh) \ #define read_sysreg_elx(r,nvh,vh) \
({ \ ({ \
u64 reg; \ u64 reg; \
......
...@@ -47,6 +47,7 @@ __asm__(".arch_extension virt"); ...@@ -47,6 +47,7 @@ __asm__(".arch_extension virt");
#endif #endif
DEFINE_PER_CPU(struct kvm_host_data, kvm_host_data); DEFINE_PER_CPU(struct kvm_host_data, kvm_host_data);
DEFINE_PER_CPU(unsigned long, kvm_hyp_vector);
static DEFINE_PER_CPU(unsigned long, kvm_arm_hyp_stack_page); static DEFINE_PER_CPU(unsigned long, kvm_arm_hyp_stack_page);
/* The VMID used in the VTTBR */ /* The VMID used in the VTTBR */
...@@ -1276,7 +1277,7 @@ static void cpu_init_hyp_mode(void) ...@@ -1276,7 +1277,7 @@ static void cpu_init_hyp_mode(void)
pgd_ptr = kvm_mmu_get_httbr(); pgd_ptr = kvm_mmu_get_httbr();
hyp_stack_ptr = __this_cpu_read(kvm_arm_hyp_stack_page) + PAGE_SIZE; hyp_stack_ptr = __this_cpu_read(kvm_arm_hyp_stack_page) + PAGE_SIZE;
vector_ptr = (unsigned long)kvm_get_hyp_vector(); vector_ptr = __this_cpu_read(kvm_hyp_vector);
/* /*
* Call initialization code, and switch to the full blown HYP code. * Call initialization code, and switch to the full blown HYP code.
...@@ -1309,6 +1310,8 @@ static void cpu_hyp_reinit(void) ...@@ -1309,6 +1310,8 @@ static void cpu_hyp_reinit(void)
cpu_hyp_reset(); cpu_hyp_reset();
__this_cpu_write(kvm_hyp_vector, (unsigned long)kvm_get_hyp_vector());
if (is_kernel_in_hyp_mode()) if (is_kernel_in_hyp_mode())
kvm_timer_init_vhe(); kvm_timer_init_vhe();
else else
......
...@@ -59,7 +59,7 @@ static void __activate_traps(struct kvm_vcpu *vcpu) ...@@ -59,7 +59,7 @@ static void __activate_traps(struct kvm_vcpu *vcpu)
write_sysreg(val, cpacr_el1); write_sysreg(val, cpacr_el1);
write_sysreg(kvm_get_hyp_vector(), vbar_el1); write_sysreg(__this_cpu_read(kvm_hyp_vector), vbar_el1);
} }
NOKPROBE_SYMBOL(__activate_traps); NOKPROBE_SYMBOL(__activate_traps);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment