Commit 506c372a authored by Marc Zyngier's avatar Marc Zyngier Committed by Christoffer Dall

arm64: KVM: Implement HVC_SOFT_RESTART in the init code

Another missing stub hypercall is HVC_SOFT_RESTART. It turns out
that it is pretty easy to implement in terms of HVC_RESET_VECTORS
(since it needs to turn the MMU off).
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 4adb1341
...@@ -129,21 +129,36 @@ ENTRY(__kvm_handle_stub_hvc) ...@@ -129,21 +129,36 @@ ENTRY(__kvm_handle_stub_hvc)
mrs x0, vbar_el2 mrs x0, vbar_el2
b exit b exit
1: cmp x0, #HVC_SOFT_RESTART
b.ne 1f
/* This is where we're about to jump, staying at EL2 */
msr elr_el2, x1
mov x0, #(PSR_F_BIT | PSR_I_BIT | PSR_A_BIT | PSR_D_BIT | PSR_MODE_EL2h)
msr spsr_el2, x0
/* Shuffle the arguments, and don't come back */
mov x0, x2
mov x1, x3
mov x2, x4
b reset
1: cmp x0, #HVC_RESET_VECTORS 1: cmp x0, #HVC_RESET_VECTORS
b.ne 1f b.ne 1f
reset:
/* /*
* Reset kvm back to the hyp stub. * Reset kvm back to the hyp stub. Do not clobber x0-x4 in
* case we coming via HVC_SOFT_RESTART.
*/ */
/* We're now in idmap, disable MMU */ mrs x5, sctlr_el2
mrs x0, sctlr_el2 ldr x6, =SCTLR_ELx_FLAGS
ldr x1, =SCTLR_ELx_FLAGS bic x5, x5, x6 // Clear SCTL_M and etc
bic x0, x0, x1 // Clear SCTL_M and etc msr sctlr_el2, x5
msr sctlr_el2, x0
isb isb
/* Install stub vectors */ /* Install stub vectors */
adr_l x0, __hyp_stub_vectors adr_l x5, __hyp_stub_vectors
msr vbar_el2, x0 msr vbar_el2, x5
b exit b exit
1: /* Bad stub call */ 1: /* Bad stub call */
......
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