|
@@ -87,10 +87,24 @@ alternative_endif
|
|
|
/* Here, we're pretty sure the host called HVC. */
|
|
|
ldp x0, x1, [sp], #16
|
|
|
|
|
|
- cmp x0, #HVC_GET_VECTORS
|
|
|
- b.ne 1f
|
|
|
- mrs x0, vbar_el2
|
|
|
- b 2f
|
|
|
+ /* Check for a stub HVC call */
|
|
|
+ cmp x0, #HVC_STUB_HCALL_NR
|
|
|
+ b.hs 1f
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Compute the idmap address of __kvm_handle_stub_hvc and
|
|
|
+ * jump there. Since we use kimage_voffset, do not use the
|
|
|
+ * HYP VA for __kvm_handle_stub_hvc, but the kernel VA instead
|
|
|
+ * (by loading it from the constant pool).
|
|
|
+ *
|
|
|
+ * Preserve x0-x4, which may contain stub parameters.
|
|
|
+ */
|
|
|
+ ldr x5, =__kvm_handle_stub_hvc
|
|
|
+ ldr_l x6, kimage_voffset
|
|
|
+
|
|
|
+ /* x5 = __pa(x5) */
|
|
|
+ sub x5, x5, x6
|
|
|
+ br x5
|
|
|
|
|
|
1:
|
|
|
/*
|
|
@@ -99,7 +113,7 @@ alternative_endif
|
|
|
kern_hyp_va x0
|
|
|
do_el2_call
|
|
|
|
|
|
-2: eret
|
|
|
+ eret
|
|
|
|
|
|
el1_trap:
|
|
|
/*
|