Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e537ecd7 authored by Marc Zyngier's avatar Marc Zyngier Committed by Christoffer Dall
Browse files

arm: KVM: Allow hyp teardown



So far, KVM was getting in the way of kexec on 32bit (and the arm64
kexec hackers couldn't be bothered to fix it on 32bit...).

With simpler page tables, tearing KVM down becomes very easy, so
let's just do it.

Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Signed-off-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
parent cd602a37
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -66,6 +66,8 @@ extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);

extern void __init_stage2_translation(void);

extern void __kvm_hyp_reset(unsigned long);
#endif

#endif /* __ARM_KVM_ASM_H__ */
+3 −5
Original line number Diff line number Diff line
@@ -266,12 +266,10 @@ static inline void __cpu_init_stage2(void)
	kvm_call_hyp(__init_stage2_translation);
}

static inline void __cpu_reset_hyp_mode(phys_addr_t phys_idmap_start)
static inline void __cpu_reset_hyp_mode(unsigned long vector_ptr,
					phys_addr_t phys_idmap_start)
{
	/*
	 * TODO
	 * kvm_call_reset(phys_idmap_start);
	 */
	kvm_call_hyp((void *)virt_to_idmap(__kvm_hyp_reset), vector_ptr);
}

static inline int kvm_arch_dev_ioctl_check_extension(long ext)
+2 −1
Original line number Diff line number Diff line
@@ -1074,7 +1074,8 @@ static void cpu_hyp_reinit(void)
static void cpu_hyp_reset(void)
{
	if (!is_kernel_in_hyp_mode())
		__cpu_reset_hyp_mode(kvm_get_idmap_start());
		__cpu_reset_hyp_mode(hyp_default_vectors,
				     kvm_get_idmap_start());
}

static void _kvm_arch_hardware_enable(void *discard)
+15 −0
Original line number Diff line number Diff line
@@ -112,6 +112,21 @@ __do_hyp_init:

	eret

	@ r0 : stub vectors address
ENTRY(__kvm_hyp_reset)
	/* We're now in idmap, disable MMU */
	mrc	p15, 4, r1, c1, c0, 0	@ HSCTLR
	ldr	r2, =(HSCTLR_M | HSCTLR_A | HSCTLR_C | HSCTLR_I)
	bic	r1, r1, r2
	mcr	p15, 4, r1, c1, c0, 0	@ HSCTLR

	/* Install stub vectors */
	mcr	p15, 4, r0, c12, c0, 0	@ HVBAR
	isb

	eret
ENDPROC(__kvm_hyp_reset)

	.ltorg

	.globl __kvm_hyp_init_end
+2 −1
Original line number Diff line number Diff line
@@ -359,7 +359,8 @@ static inline void __cpu_init_hyp_mode(phys_addr_t pgd_ptr,
}

void __kvm_hyp_teardown(void);
static inline void __cpu_reset_hyp_mode(phys_addr_t phys_idmap_start)
static inline void __cpu_reset_hyp_mode(unsigned long vector_ptr,
					phys_addr_t phys_idmap_start)
{
	kvm_call_hyp(__kvm_hyp_teardown, phys_idmap_start);
}