All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marc Zyngier <marc.zyngier@arm.com>
To: linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org,
	kvmarm@lists.cs.columbia.edu
Cc: Russell King <linux@arm.linux.org.uk>,
	Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Keerthy <j-keerthy@ti.com>
Subject: [PATCH v5 20/34] ARM: KVM: Implement HVC_RESET_VECTORS stub hypercall in the init code
Date: Mon,  3 Apr 2017 19:37:53 +0100	[thread overview]
Message-ID: <20170403183807.1620-21-marc.zyngier@arm.com> (raw)
In-Reply-To: <20170403183807.1620-1-marc.zyngier@arm.com>

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.

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>
---
 arch/arm/include/asm/virt.h |  1 +
 arch/arm/kernel/hyp-stub.S  |  2 +-
 arch/arm/kvm/init.S         | 33 +++++++++++++++++++++++++++------
 3 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/arch/arm/include/asm/virt.h b/arch/arm/include/asm/virt.h
index c5a27570b225..663adc09c918 100644
--- a/arch/arm/include/asm/virt.h
+++ b/arch/arm/include/asm/virt.h
@@ -54,6 +54,7 @@ static inline void sync_boot_mode(void)
 
 void __hyp_set_vectors(unsigned long phys_vector_base);
 unsigned long __hyp_get_vectors(void);
+void __hyp_reset_vectors(void);
 #else
 #define __boot_cpu_mode	(SVC_MODE)
 #define sync_boot_mode()
diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S
index e637854335aa..675c50f5cb5c 100644
--- a/arch/arm/kernel/hyp-stub.S
+++ b/arch/arm/kernel/hyp-stub.S
@@ -280,7 +280,7 @@ ENDPROC(__hyp_reset_vectors)
 #endif
 
 .align 5
-__hyp_stub_vectors:
+ENTRY(__hyp_stub_vectors)
 __hyp_stub_reset:	W(b)	.
 __hyp_stub_und:		W(b)	.
 __hyp_stub_svc:		W(b)	.
diff --git a/arch/arm/kvm/init.S b/arch/arm/kvm/init.S
index bf89c919efc1..86a7008e75a3 100644
--- a/arch/arm/kvm/init.S
+++ b/arch/arm/kvm/init.S
@@ -23,6 +23,7 @@
 #include <asm/kvm_asm.h>
 #include <asm/kvm_arm.h>
 #include <asm/kvm_mmu.h>
+#include <asm/virt.h>
 
 /********************************************************************
  * Hypervisor initialization
@@ -39,6 +40,10 @@
  * - Setup the page tables
  * - Enable the MMU
  * - Profit! (or eret, if you only care about the code).
+ *
+ * Another possibility is to get a HYP stub hypercall.
+ * We discriminate between the two by checking if r0 contains a value
+ * that is less than HVC_STUB_HCALL_NR.
  */
 
 	.text
@@ -58,6 +63,10 @@ __kvm_hyp_init:
 	W(b)	.
 
 __do_hyp_init:
+	@ Check for a stub hypercall
+	cmp	r0, #HVC_STUB_HCALL_NR
+	blo	__kvm_handle_stub_hvc
+
 	@ Set stack pointer
 	mov	sp, r0
 
@@ -112,19 +121,31 @@ __do_hyp_init:
 
 	eret
 
-	@ r0 : stub vectors address
+ENTRY(__kvm_handle_stub_hvc)
+	cmp	r0, #HVC_RESET_VECTORS
+	bne	1f
 ENTRY(__kvm_hyp_reset)
 	/* We're now in idmap, disable MMU */
 	mrc	p15, 4, r1, c1, c0, 0	@ HSCTLR
-	ldr	r2, =(HSCTLR_M | HSCTLR_A | HSCTLR_C | HSCTLR_I)
-	bic	r1, r1, r2
+	ldr	r0, =(HSCTLR_M | HSCTLR_A | HSCTLR_C | HSCTLR_I)
+	bic	r1, r1, r0
 	mcr	p15, 4, r1, c1, c0, 0	@ HSCTLR
 
-	/* Install stub vectors */
-	mcr	p15, 4, r0, c12, c0, 0	@ HVBAR
-	isb
+	/*
+	 * Install stub vectors, using ardb's VA->PA trick.
+	 */
+0:	adr	r0, 0b					@ PA(0)
+	movw	r1, #:lower16:__hyp_stub_vectors - 0b   @ VA(stub) - VA(0)
+	movt	r1, #:upper16:__hyp_stub_vectors - 0b
+	add	r1, r1, r0				@ PA(stub)
+	mcr	p15, 4, r1, c12, c0, 0	@ HVBAR
+	b	exit
+
+1:	ldr	r0, =HVC_STUB_ERR
 
+exit:
 	eret
+ENDPROC(__kvm_handle_stub_hvc)
 ENDPROC(__kvm_hyp_reset)
 
 	.ltorg
-- 
2.11.0

WARNING: multiple messages have this Message-ID (diff)
From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v5 20/34] ARM: KVM: Implement HVC_RESET_VECTORS stub hypercall in the init code
Date: Mon,  3 Apr 2017 19:37:53 +0100	[thread overview]
Message-ID: <20170403183807.1620-21-marc.zyngier@arm.com> (raw)
In-Reply-To: <20170403183807.1620-1-marc.zyngier@arm.com>

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.

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>
---
 arch/arm/include/asm/virt.h |  1 +
 arch/arm/kernel/hyp-stub.S  |  2 +-
 arch/arm/kvm/init.S         | 33 +++++++++++++++++++++++++++------
 3 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/arch/arm/include/asm/virt.h b/arch/arm/include/asm/virt.h
index c5a27570b225..663adc09c918 100644
--- a/arch/arm/include/asm/virt.h
+++ b/arch/arm/include/asm/virt.h
@@ -54,6 +54,7 @@ static inline void sync_boot_mode(void)
 
 void __hyp_set_vectors(unsigned long phys_vector_base);
 unsigned long __hyp_get_vectors(void);
+void __hyp_reset_vectors(void);
 #else
 #define __boot_cpu_mode	(SVC_MODE)
 #define sync_boot_mode()
diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S
index e637854335aa..675c50f5cb5c 100644
--- a/arch/arm/kernel/hyp-stub.S
+++ b/arch/arm/kernel/hyp-stub.S
@@ -280,7 +280,7 @@ ENDPROC(__hyp_reset_vectors)
 #endif
 
 .align 5
-__hyp_stub_vectors:
+ENTRY(__hyp_stub_vectors)
 __hyp_stub_reset:	W(b)	.
 __hyp_stub_und:		W(b)	.
 __hyp_stub_svc:		W(b)	.
diff --git a/arch/arm/kvm/init.S b/arch/arm/kvm/init.S
index bf89c919efc1..86a7008e75a3 100644
--- a/arch/arm/kvm/init.S
+++ b/arch/arm/kvm/init.S
@@ -23,6 +23,7 @@
 #include <asm/kvm_asm.h>
 #include <asm/kvm_arm.h>
 #include <asm/kvm_mmu.h>
+#include <asm/virt.h>
 
 /********************************************************************
  * Hypervisor initialization
@@ -39,6 +40,10 @@
  * - Setup the page tables
  * - Enable the MMU
  * - Profit! (or eret, if you only care about the code).
+ *
+ * Another possibility is to get a HYP stub hypercall.
+ * We discriminate between the two by checking if r0 contains a value
+ * that is less than HVC_STUB_HCALL_NR.
  */
 
 	.text
@@ -58,6 +63,10 @@ __kvm_hyp_init:
 	W(b)	.
 
 __do_hyp_init:
+	@ Check for a stub hypercall
+	cmp	r0, #HVC_STUB_HCALL_NR
+	blo	__kvm_handle_stub_hvc
+
 	@ Set stack pointer
 	mov	sp, r0
 
@@ -112,19 +121,31 @@ __do_hyp_init:
 
 	eret
 
-	@ r0 : stub vectors address
+ENTRY(__kvm_handle_stub_hvc)
+	cmp	r0, #HVC_RESET_VECTORS
+	bne	1f
 ENTRY(__kvm_hyp_reset)
 	/* We're now in idmap, disable MMU */
 	mrc	p15, 4, r1, c1, c0, 0	@ HSCTLR
-	ldr	r2, =(HSCTLR_M | HSCTLR_A | HSCTLR_C | HSCTLR_I)
-	bic	r1, r1, r2
+	ldr	r0, =(HSCTLR_M | HSCTLR_A | HSCTLR_C | HSCTLR_I)
+	bic	r1, r1, r0
 	mcr	p15, 4, r1, c1, c0, 0	@ HSCTLR
 
-	/* Install stub vectors */
-	mcr	p15, 4, r0, c12, c0, 0	@ HVBAR
-	isb
+	/*
+	 * Install stub vectors, using ardb's VA->PA trick.
+	 */
+0:	adr	r0, 0b					@ PA(0)
+	movw	r1, #:lower16:__hyp_stub_vectors - 0b   @ VA(stub) - VA(0)
+	movt	r1, #:upper16:__hyp_stub_vectors - 0b
+	add	r1, r1, r0				@ PA(stub)
+	mcr	p15, 4, r1, c12, c0, 0	@ HVBAR
+	b	exit
+
+1:	ldr	r0, =HVC_STUB_ERR
 
+exit:
 	eret
+ENDPROC(__kvm_handle_stub_hvc)
 ENDPROC(__kvm_hyp_reset)
 
 	.ltorg
-- 
2.11.0

  parent reply	other threads:[~2017-04-03 18:37 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-03 18:37 [PATCH v5 00/34] arm/arm64: KVM: Rework the hyp-stub API Marc Zyngier
2017-04-03 18:37 ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 01/34] arm64: hyp-stub: Stop pointlessly clobbering lr Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 02/34] arm64: KVM: Move lr save/restore to do_el2_call Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 03/34] arm64: hyp-stub: Don't save lr in the EL1 code Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 04/34] arm64: hyp-stub: Define a return value for failed stub calls Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 05/34] arm64: hyp-stub: Update documentation in asm/virt.h Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 06/34] arm64: hyp-stub: Implement HVC_RESET_VECTORS stub hypercall Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 07/34] arm64: KVM: Implement HVC_RESET_VECTORS stub hypercall in the init code Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 08/34] arm64: KVM: Implement HVC_GET_VECTORS " Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 09/34] arm64: KVM: Allow the main HYP code to use the init hyp stub implementation Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 10/34] arm64: KVM: Convert __cpu_reset_hyp_mode to using __hyp_reset_vectors Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 11/34] arm64: KVM: Implement HVC_SOFT_RESTART in the init code Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 12/34] ARM: hyp-stub: improve ABI Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 13/34] ARM: soft-reboot into same mode that we entered the kernel Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 14/34] ARM: KVM: Convert KVM to use HVC_GET_VECTORS Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 15/34] ARM: Update cpu_v7_reset documentation Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 16/34] ARM: hyp-stub: Use r1 for the soft-restart address Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 17/34] ARM: Expose the VA/IDMAP offset Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 18/34] ARM: hyp-stub: Define a return value for failed stub calls Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 19/34] ARM: hyp-stub: Implement HVC_RESET_VECTORS stub hypercall Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` Marc Zyngier [this message]
2017-04-03 18:37   ` [PATCH v5 20/34] ARM: KVM: Implement HVC_RESET_VECTORS stub hypercall in the init code Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 21/34] ARM: KVM: Implement HVC_GET_VECTORS " Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 22/34] ARM: KVM: Allow the main HYP code to use the init hyp stub implementation Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 23/34] ARM: KVM: Convert __cpu_reset_hyp_mode to using __hyp_reset_vectors Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 24/34] ARM: KVM: Implement HVC_SOFT_RESTART in the init code Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 25/34] ARM: KVM: Gracefully handle hyp-stubs being restored from under our feet Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:37 ` [PATCH v5 26/34] arm/arm64: KVM: Use __hyp_reset_vectors() directly Marc Zyngier
2017-04-03 18:37   ` Marc Zyngier
2017-04-03 18:38 ` [PATCH v5 27/34] arm/arm64: KVM: Remove kvm_get_idmap_start Marc Zyngier
2017-04-03 18:38   ` Marc Zyngier
2017-04-03 18:38 ` [PATCH v5 28/34] arm/arm64: KVM: Use HVC_RESET_VECTORS to reinit HYP mode Marc Zyngier
2017-04-03 18:38   ` Marc Zyngier
2017-04-03 18:38 ` [PATCH v5 29/34] ARM: decompressor: Remove __hyp_get_vectors usage Marc Zyngier
2017-04-03 18:38   ` Marc Zyngier
2017-04-03 18:38 ` [PATCH v5 30/34] ARM: hyp-stub/KVM: Kill __hyp_get_vectors Marc Zyngier
2017-04-03 18:38   ` Marc Zyngier
2017-04-03 18:38 ` [PATCH v5 31/34] arm64: " Marc Zyngier
2017-04-03 18:38   ` Marc Zyngier
2017-04-03 18:38 ` [PATCH v5 32/34] arm64: hyp-stub: Zero x0 on successful stub handling Marc Zyngier
2017-04-03 18:38   ` Marc Zyngier
2017-04-03 18:38 ` [PATCH v5 33/34] ARM: hyp-stub: Zero r0 " Marc Zyngier
2017-04-03 18:38   ` Marc Zyngier
2017-04-03 18:38 ` [PATCH v5 34/34] arm/arm64: Add hyp-stub API documentation Marc Zyngier
2017-04-03 18:38   ` Marc Zyngier
2017-04-04 12:04 ` [PATCH v5 00/34] arm/arm64: KVM: Rework the hyp-stub API Christoffer Dall
2017-04-04 12:04   ` Christoffer Dall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170403183807.1620-21-marc.zyngier@arm.com \
    --to=marc.zyngier@arm.com \
    --cc=ard.biesheuvel@linaro.org \
    --cc=catalin.marinas@arm.com \
    --cc=j-keerthy@ti.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux@arm.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.