ARM: hyp-stub: Implement HVC_RESET_VECTORS stub hypercall
authorMarc Zyngier <marc.zyngier@arm.com>
Mon, 3 Apr 2017 18:37:52 +0000 (19:37 +0100)
committerChristoffer Dall <cdall@linaro.org>
Sun, 9 Apr 2017 14:49:27 +0000 (07:49 -0700)
Let's define a new stub hypercall that resets the HYP configuration
to its default: hyp-stub vectors, and MMU disabled.

Of course, for the hyp-stub itself, this is a trivial no-op.
Hypervisors will have a bit more work to do.

Tested-by: Keerthy <j-keerthy@ti.com>
Acked-by: Russell King <rmk+kernel@armlinux.org.uk>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <cdall@linaro.org>
arch/arm/include/asm/virt.h
arch/arm/kernel/hyp-stub.S

index c16f70d6953f1c66d72ae1422629900f4dd78207..c5a27570b2256b8d8fb7a5e4356c59b842340019 100644 (file)
@@ -101,6 +101,9 @@ extern char __hyp_text_end[];
 #define HVC_GET_VECTORS 0
 #define HVC_SET_VECTORS 1
 #define HVC_SOFT_RESTART 2
+#define HVC_RESET_VECTORS 3
+
+#define HVC_STUB_HCALL_NR 4
 
 #endif /* __ASSEMBLY__ */
 
index b20ca88159115fc6637654ac0f7f76a1959d6d12..e637854335aa43091bbf6ece606a9ebc5e93b000 100644 (file)
@@ -216,7 +216,10 @@ __hyp_stub_do_trap:
        bne     1f
        bx      r1
 
-1:     ldr     r0, =HVC_STUB_ERR
+1:     teq     r0, #HVC_RESET_VECTORS
+       beq     __hyp_stub_exit
+
+       ldr     r0, =HVC_STUB_ERR
 
 __hyp_stub_exit:
        __ERET
@@ -264,6 +267,12 @@ ENTRY(__hyp_soft_restart)
        ret     lr
 ENDPROC(__hyp_soft_restart)
 
+ENTRY(__hyp_reset_vectors)
+       mov     r0, #HVC_RESET_VECTORS
+       __HVC(0)
+       ret     lr
+ENDPROC(__hyp_reset_vectors)
+
 #ifndef ZIMAGE
 .align 2
 .L__boot_cpu_mode_offset: