arm64: hyp-stub: Implement HVC_RESET_VECTORS stub hypercall

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.

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>
This commit is contained in:
Marc Zyngier 2017-04-03 19:37:39 +01:00 committed by Christoffer Dall
parent 810c86ee4e
commit fd0e0c6170
2 changed files with 19 additions and 1 deletions

View File

@ -44,6 +44,14 @@
*/ */
#define HVC_SOFT_RESTART 2 #define HVC_SOFT_RESTART 2
/*
* HVC_RESET_VECTORS - Restore the vectors to the original HYP stubs
*/
#define HVC_RESET_VECTORS 3
/* Max number of HYP stub hypercalls */
#define HVC_STUB_HCALL_NR 4
/* Error returned when an invalid stub number is passed into x0 */ /* Error returned when an invalid stub number is passed into x0 */
#define HVC_STUB_ERR 0xbadca11 #define HVC_STUB_ERR 0xbadca11
@ -70,6 +78,7 @@ extern u32 __boot_cpu_mode[2];
void __hyp_set_vectors(phys_addr_t phys_vector_base); void __hyp_set_vectors(phys_addr_t phys_vector_base);
phys_addr_t __hyp_get_vectors(void); phys_addr_t __hyp_get_vectors(void);
void __hyp_reset_vectors(void);
/* Reports the availability of HYP mode */ /* Reports the availability of HYP mode */
static inline bool is_hyp_mode_available(void) static inline bool is_hyp_mode_available(void)

View File

@ -73,8 +73,11 @@ el1_sync:
mov x1, x3 mov x1, x3
br x4 // no return br x4 // no return
3: cmp x0, #HVC_RESET_VECTORS
beq 9f // Nothing to reset!
/* Someone called kvm_call_hyp() against the hyp-stub... */ /* Someone called kvm_call_hyp() against the hyp-stub... */
3: ldr x0, =HVC_STUB_ERR ldr x0, =HVC_STUB_ERR
9: eret 9: eret
ENDPROC(el1_sync) ENDPROC(el1_sync)
@ -127,3 +130,9 @@ ENTRY(__hyp_set_vectors)
hvc #0 hvc #0
ret ret
ENDPROC(__hyp_set_vectors) ENDPROC(__hyp_set_vectors)
ENTRY(__hyp_reset_vectors)
mov x0, #HVC_RESET_VECTORS
hvc #0
ret
ENDPROC(__hyp_reset_vectors)