arm/arm64: KVM: Use HVC_RESET_VECTORS to reinit HYP mode
authorMarc Zyngier <marc.zyngier@arm.com>
Mon, 3 Apr 2017 18:38:01 +0000 (19:38 +0100)
committerChristoffer Dall <cdall@linaro.org>
Sun, 9 Apr 2017 14:49:33 +0000 (07:49 -0700)
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: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <cdall@linaro.org>
arch/arm/kvm/arm.c

index c8f4fa69104e82f8f56be647af9f84adf6142ddc..c378502623f6a921cd38d84d04e090f282e29663 100644 (file)
@@ -53,7 +53,6 @@ __asm__(".arch_extension      virt");
 
 static DEFINE_PER_CPU(unsigned long, kvm_arm_hyp_stack_page);
 static kvm_cpu_context_t __percpu *kvm_host_cpu_state;
-static unsigned long hyp_default_vectors;
 
 /* Per-CPU variable containing the currently 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)
        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)
 {
+       cpu_hyp_reset();
+
        if (is_kernel_in_hyp_mode()) {
                /*
                 * __cpu_init_stage2() is safe to call even if the PM
@@ -1122,17 +1129,10 @@ static void cpu_hyp_reinit(void)
                 */
                __cpu_init_stage2();
        } 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)
 {
        if (!__this_cpu_read(kvm_arm_hardware_enabled)) {
@@ -1315,12 +1315,6 @@ static int init_hyp_mode(void)
        if (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
         */