arm64: KVM: Implement HVC_RESET_VECTORS stub hypercall in the init code
authorMarc Zyngier <marc.zyngier@arm.com>
Mon, 3 Apr 2017 18:37:40 +0000 (19:37 +0100)
committerChristoffer Dall <cdall@linaro.org>
Sun, 9 Apr 2017 14:49:20 +0000 (07:49 -0700)
In order to restore HYP mode to its original condition, KVM currently
implements __kvm_hyp_reset(). As we're moving towards a hyp-stub
defined API, it becomes necessary to implement HVC_RESET_VECTORS.

This patch adds the HVC_RESET_VECTORS hypercall to the KVM init
code, which so far lacked any form of hypercall support.

Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Reviewed-by: James Morse <james.morse@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <cdall@linaro.org>
arch/arm64/kvm/hyp-init.S

index 6b29d3d9e1f285c0f1e61c3509cfbaf99402ea86..5e39ad53bcae2207d07e1ea7344a71fbb6c87abf 100644 (file)
@@ -22,6 +22,7 @@
 #include <asm/kvm_mmu.h>
 #include <asm/pgtable-hwdef.h>
 #include <asm/sysreg.h>
+#include <asm/virt.h>
 
        .text
        .pushsection    .hyp.idmap.text, "ax"
@@ -58,6 +59,9 @@ __invalid:
         * x2: HYP vectors
         */
 __do_hyp_init:
+       /* Check for a stub HVC call */
+       cmp     x0, #HVC_STUB_HCALL_NR
+       b.lo    __kvm_handle_stub_hvc
 
        msr     ttbr0_el2, x0
 
@@ -119,6 +123,9 @@ __do_hyp_init:
        eret
 ENDPROC(__kvm_hyp_init)
 
+ENTRY(__kvm_handle_stub_hvc)
+       cmp     x0, #HVC_RESET_VECTORS
+       b.ne    1f
        /*
         * Reset kvm back to the hyp stub.
         */
@@ -133,9 +140,15 @@ ENTRY(__kvm_hyp_reset)
        /* Install stub vectors */
        adr_l   x0, __hyp_stub_vectors
        msr     vbar_el2, x0
+       b       exit
 
+1:     /* Bad stub call */
+       ldr     x0, =HVC_STUB_ERR
+
+exit:
        eret
 ENDPROC(__kvm_hyp_reset)
+ENDPROC(__kvm_handle_stub_hvc)
 
        .ltorg