|
@@ -22,6 +22,7 @@
|
|
|
#include <linux/irqchip/arm-gic-v3.h>
|
|
|
|
|
|
#include <asm/assembler.h>
|
|
|
+#include <asm/kvm_arm.h>
|
|
|
#include <asm/ptrace.h>
|
|
|
#include <asm/virt.h>
|
|
|
|
|
@@ -53,15 +54,26 @@ ENDPROC(__hyp_stub_vectors)
|
|
|
.align 11
|
|
|
|
|
|
el1_sync:
|
|
|
- mrs x1, esr_el2
|
|
|
- lsr x1, x1, #26
|
|
|
- cmp x1, #0x16
|
|
|
- b.ne 2f // Not an HVC trap
|
|
|
- cbz x0, 1f
|
|
|
- msr vbar_el2, x0 // Set vbar_el2
|
|
|
- b 2f
|
|
|
-1: mrs x0, vbar_el2 // Return vbar_el2
|
|
|
-2: eret
|
|
|
+ mrs x30, esr_el2
|
|
|
+ lsr x30, x30, #ESR_ELx_EC_SHIFT
|
|
|
+
|
|
|
+ cmp x30, #ESR_ELx_EC_HVC64
|
|
|
+ b.ne 9f // Not an HVC trap
|
|
|
+
|
|
|
+ cmp x0, #HVC_GET_VECTORS
|
|
|
+ b.ne 1f
|
|
|
+ mrs x0, vbar_el2
|
|
|
+ b 9f
|
|
|
+
|
|
|
+1: cmp x0, #HVC_SET_VECTORS
|
|
|
+ b.ne 2f
|
|
|
+ msr vbar_el2, x1
|
|
|
+ b 9f
|
|
|
+
|
|
|
+ /* Unrecognised call type */
|
|
|
+2: mov x0, xzr
|
|
|
+
|
|
|
+9: eret
|
|
|
ENDPROC(el1_sync)
|
|
|
|
|
|
.macro invalid_vector label
|
|
@@ -102,7 +114,7 @@ ENDPROC(\label)
|
|
|
|
|
|
ENTRY(__hyp_get_vectors)
|
|
|
str lr, [sp, #-16]!
|
|
|
- mov x0, xzr
|
|
|
+ mov x0, #HVC_GET_VECTORS
|
|
|
hvc #0
|
|
|
ldr lr, [sp], #16
|
|
|
ret
|
|
@@ -110,6 +122,8 @@ ENDPROC(__hyp_get_vectors)
|
|
|
|
|
|
ENTRY(__hyp_set_vectors)
|
|
|
str lr, [sp, #-16]!
|
|
|
+ mov x1, x0
|
|
|
+ mov x0, #HVC_SET_VECTORS
|
|
|
hvc #0
|
|
|
ldr lr, [sp], #16
|
|
|
ret
|