Skip to content

Commit

Permalink
arm/arm64: KVM: Use HVC_RESET_VECTORS to reinit HYP mode
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Marc Zyngier authored and Christoffer Dall committed Apr 9, 2017
1 parent 9e9ebd0 commit 47eb3cb
Showing 1 changed file with 9 additions and 15 deletions.
24 changes: 9 additions & 15 deletions arch/arm/kvm/arm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -1113,26 +1112,27 @@ 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
* event was cancelled before the CPU was reset.
*/
__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)) {
Expand Down Expand Up @@ -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
*/
Expand Down

0 comments on commit 47eb3cb

Please sign in to comment.