|
@@ -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 x0, sctlr_el2
|
|
|
|
- ldr x1, =SCTLR_ELx_FLAGS
|
|
|
|
- bic x0, x0, x1 // Clear SCTL_M and etc
|
|
|
|
- msr sctlr_el2, x0
|
|
|
|
|
|
+ mrs x5, sctlr_el2
|
|
|
|
+ ldr x6, =SCTLR_ELx_FLAGS
|
|
|
|
+ bic x5, x5, x6 // Clear SCTL_M and etc
|
|
|
|
+ msr sctlr_el2, x5
|
|
isb
|
|
isb
|
|
|
|
|
|
/* Install stub vectors */
|
|
/* Install stub vectors */
|
|
- adr_l x0, __hyp_stub_vectors
|
|
|
|
- msr vbar_el2, x0
|
|
|
|
|
|
+ adr_l x5, __hyp_stub_vectors
|
|
|
|
+ msr vbar_el2, x5
|
|
b exit
|
|
b exit
|
|
|
|
|
|
1: /* Bad stub call */
|
|
1: /* Bad stub call */
|