Commit 47eb3cba authored by Marc Zyngier's avatar Marc Zyngier Committed by Christoffer Dall

arm/arm64: KVM: Use HVC_RESET_VECTORS to reinit HYP mode

Instead of trying to compare the value given by __hyp_get_vectors(),
which doesn't offer any real guarantee to be the stub's address, use
HVC_RESET_VECTORS to make sure we're in a sane state to reinstall
KVM across PM events.
Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Signed-off-by: default avatarChristoffer Dall <cdall@linaro.org>
parent 9e9ebd01
...@@ -53,7 +53,6 @@ __asm__(".arch_extension virt"); ...@@ -53,7 +53,6 @@ __asm__(".arch_extension virt");
static DEFINE_PER_CPU(unsigned long, kvm_arm_hyp_stack_page); static DEFINE_PER_CPU(unsigned long, kvm_arm_hyp_stack_page);
static kvm_cpu_context_t __percpu *kvm_host_cpu_state; static kvm_cpu_context_t __percpu *kvm_host_cpu_state;
static unsigned long hyp_default_vectors;
/* Per-CPU variable containing the currently running vcpu. */ /* Per-CPU variable containing the currently running vcpu. */
static DEFINE_PER_CPU(struct kvm_vcpu *, kvm_arm_running_vcpu); static DEFINE_PER_CPU(struct kvm_vcpu *, kvm_arm_running_vcpu);
...@@ -1113,8 +1112,16 @@ static void cpu_init_hyp_mode(void *dummy) ...@@ -1113,8 +1112,16 @@ static void cpu_init_hyp_mode(void *dummy)
kvm_arm_init_debug(); kvm_arm_init_debug();
} }
static void cpu_hyp_reset(void)
{
if (!is_kernel_in_hyp_mode())
__hyp_reset_vectors();
}
static void cpu_hyp_reinit(void) static void cpu_hyp_reinit(void)
{ {
cpu_hyp_reset();
if (is_kernel_in_hyp_mode()) { if (is_kernel_in_hyp_mode()) {
/* /*
* __cpu_init_stage2() is safe to call even if the PM * __cpu_init_stage2() is safe to call even if the PM
...@@ -1122,17 +1129,10 @@ static void cpu_hyp_reinit(void) ...@@ -1122,17 +1129,10 @@ static void cpu_hyp_reinit(void)
*/ */
__cpu_init_stage2(); __cpu_init_stage2();
} else { } else {
if (__hyp_get_vectors() == hyp_default_vectors) cpu_init_hyp_mode(NULL);
cpu_init_hyp_mode(NULL);
} }
} }
static void cpu_hyp_reset(void)
{
if (!is_kernel_in_hyp_mode())
__hyp_reset_vectors();
}
static void _kvm_arch_hardware_enable(void *discard) static void _kvm_arch_hardware_enable(void *discard)
{ {
if (!__this_cpu_read(kvm_arm_hardware_enabled)) { if (!__this_cpu_read(kvm_arm_hardware_enabled)) {
...@@ -1315,12 +1315,6 @@ static int init_hyp_mode(void) ...@@ -1315,12 +1315,6 @@ static int init_hyp_mode(void)
if (err) if (err)
goto out_err; goto out_err;
/*
* It is probably enough to obtain the default on one
* CPU. It's unlikely to be different on the others.
*/
hyp_default_vectors = __hyp_get_vectors();
/* /*
* Allocate stack pages for Hypervisor-mode * Allocate stack pages for Hypervisor-mode
*/ */
......
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