linux-hyperv.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jinank Jain <jinankjain@linux.microsoft.com>
To: jinankjain@microsoft.com
Cc: kys@microsoft.com, haiyangz@microsoft.com, wei.liu@kernel.org,
	decui@microsoft.com, tglx@linutronix.de, mingo@redhat.com,
	bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org,
	hpa@zytor.com, arnd@arndb.de, peterz@infradead.org,
	jpoimboe@kernel.org, jinankjain@linux.microsoft.com,
	seanjc@google.com, kirill.shutemov@linux.intel.com,
	ak@linux.intel.com, sathyanarayanan.kuppuswamy@linux.intel.com,
	linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arch@vger.kernel.org, anrayabh@linux.microsoft.com,
	mikelley@microsoft.com
Subject: [PATCH v6 2/5] Drivers: hv: Setup synic registers in case of nested root partition
Date: Thu, 24 Nov 2022 06:02:07 +0000	[thread overview]
Message-ID: <bf78acdc273fa730faf6eff49dd67a32c2242d84.1669269377.git.jinankjain@linux.microsoft.com> (raw)
In-Reply-To: <cover.1669269377.git.jinankjain@linux.microsoft.com>

Child partitions are free to allocate SynIC message and event page but in
case of root partition it must use the pages allocated by Microsoft
Hypervisor (MSHV). Base address for these pages can be found using
synthetic MSRs exposed by MSHV. There is a slight difference in those MSRs
for nested vs non-nested root partition.

Signed-off-by: Jinank Jain <jinankjain@linux.microsoft.com>
---
 arch/x86/include/asm/hyperv-tlfs.h | 11 +++++++
 arch/x86/include/asm/mshyperv.h    | 26 ++--------------
 arch/x86/kernel/cpu/mshyperv.c     | 49 ++++++++++++++++++++++++++++++
 drivers/hv/hv.c                    | 18 ++++++++---
 4 files changed, 75 insertions(+), 29 deletions(-)

diff --git a/arch/x86/include/asm/hyperv-tlfs.h b/arch/x86/include/asm/hyperv-tlfs.h
index 58c03d18c235..b5019becb618 100644
--- a/arch/x86/include/asm/hyperv-tlfs.h
+++ b/arch/x86/include/asm/hyperv-tlfs.h
@@ -225,6 +225,17 @@ enum hv_isolation_type {
 #define HV_REGISTER_SINT14			0x4000009E
 #define HV_REGISTER_SINT15			0x4000009F
 
+/*
+ * Define synthetic interrupt controller model specific registers for
+ * nested hypervisor.
+ */
+#define HV_REGISTER_NESTED_SCONTROL            0x40001080
+#define HV_REGISTER_NESTED_SVERSION            0x40001081
+#define HV_REGISTER_NESTED_SIEFP               0x40001082
+#define HV_REGISTER_NESTED_SIMP                0x40001083
+#define HV_REGISTER_NESTED_EOM                 0x40001084
+#define HV_REGISTER_NESTED_SINT0               0x40001090
+
 /*
  * Synthetic Timer MSRs. Four timers per vcpu.
  */
diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
index 61f0c206bff0..326d699b30d5 100644
--- a/arch/x86/include/asm/mshyperv.h
+++ b/arch/x86/include/asm/mshyperv.h
@@ -198,30 +198,8 @@ static inline bool hv_is_synic_reg(unsigned int reg)
 	return false;
 }
 
-static inline u64 hv_get_register(unsigned int reg)
-{
-	u64 value;
-
-	if (hv_is_synic_reg(reg) && hv_isolation_type_snp())
-		hv_ghcb_msr_read(reg, &value);
-	else
-		rdmsrl(reg, value);
-	return value;
-}
-
-static inline void hv_set_register(unsigned int reg, u64 value)
-{
-	if (hv_is_synic_reg(reg) && hv_isolation_type_snp()) {
-		hv_ghcb_msr_write(reg, value);
-
-		/* Write proxy bit via wrmsl instruction */
-		if (reg >= HV_REGISTER_SINT0 &&
-		    reg <= HV_REGISTER_SINT15)
-			wrmsrl(reg, value | 1 << 20);
-	} else {
-		wrmsrl(reg, value);
-	}
-}
+u64 hv_get_register(unsigned int reg);
+void hv_set_register(unsigned int reg, u64 value);
 
 #else /* CONFIG_HYPERV */
 static inline void hyperv_init(void) {}
diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
index 9a4204139490..97d8ce744e47 100644
--- a/arch/x86/kernel/cpu/mshyperv.c
+++ b/arch/x86/kernel/cpu/mshyperv.c
@@ -41,6 +41,55 @@ bool hv_root_partition;
 bool hv_nested;
 struct ms_hyperv_info ms_hyperv;
 
+static inline unsigned int hv_get_nested_reg(unsigned int reg)
+{
+	switch (reg) {
+	case HV_REGISTER_SIMP:
+		return HV_REGISTER_NESTED_SIMP;
+	case HV_REGISTER_NESTED_SIEFP:
+		return HV_REGISTER_SIEFP;
+	case HV_REGISTER_SCONTROL:
+		return HV_REGISTER_NESTED_SCONTROL;
+	case HV_REGISTER_SINT0:
+		return HV_REGISTER_NESTED_SINT0;
+	case HV_REGISTER_EOM:
+		return HV_REGISTER_NESTED_EOM;
+	default:
+		return reg;
+	}
+}
+
+u64 hv_get_register(unsigned int reg)
+{
+	u64 value;
+
+	if (hv_nested)
+		reg = hv_get_nested_reg(reg);
+
+	if (hv_is_synic_reg(reg) && hv_isolation_type_snp())
+		hv_ghcb_msr_read(reg, &value);
+	else
+		rdmsrl(reg, value);
+	return value;
+}
+
+void hv_set_register(unsigned int reg, u64 value)
+{
+	if (hv_nested)
+		reg = hv_get_nested_reg(reg);
+
+	if (hv_is_synic_reg(reg) && hv_isolation_type_snp()) {
+		hv_ghcb_msr_write(reg, value);
+
+		/* Write proxy bit via wrmsl instruction */
+		if (reg >= HV_REGISTER_SINT0 &&
+		    reg <= HV_REGISTER_SINT15)
+			wrmsrl(reg, value | 1 << 20);
+	} else {
+		wrmsrl(reg, value);
+	}
+}
+
 #if IS_ENABLED(CONFIG_HYPERV)
 static void (*vmbus_handler)(void);
 static void (*hv_stimer0_handler)(void);
diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c
index 4d6480d57546..9e1eb50cc76f 100644
--- a/drivers/hv/hv.c
+++ b/drivers/hv/hv.c
@@ -147,7 +147,7 @@ int hv_synic_alloc(void)
 		 * Synic message and event pages are allocated by paravisor.
 		 * Skip these pages allocation here.
 		 */
-		if (!hv_isolation_type_snp()) {
+		if (!hv_isolation_type_snp() && !hv_root_partition) {
 			hv_cpu->synic_message_page =
 				(void *)get_zeroed_page(GFP_ATOMIC);
 			if (hv_cpu->synic_message_page == NULL) {
@@ -188,8 +188,16 @@ void hv_synic_free(void)
 		struct hv_per_cpu_context *hv_cpu
 			= per_cpu_ptr(hv_context.cpu_context, cpu);
 
-		free_page((unsigned long)hv_cpu->synic_event_page);
-		free_page((unsigned long)hv_cpu->synic_message_page);
+		if (hv_root_partition) {
+			if (hv_cpu->synic_event_page != NULL)
+				memunmap(hv_cpu->synic_event_page);
+
+			if (hv_cpu->synic_message_page != NULL)
+				memunmap(hv_cpu->synic_message_page);
+		} else {
+			free_page((unsigned long)hv_cpu->synic_event_page);
+			free_page((unsigned long)hv_cpu->synic_message_page);
+		}
 		free_page((unsigned long)hv_cpu->post_msg_page);
 	}
 
@@ -216,7 +224,7 @@ void hv_synic_enable_regs(unsigned int cpu)
 	simp.as_uint64 = hv_get_register(HV_REGISTER_SIMP);
 	simp.simp_enabled = 1;
 
-	if (hv_isolation_type_snp()) {
+	if (hv_isolation_type_snp() || hv_root_partition) {
 		hv_cpu->synic_message_page
 			= memremap(simp.base_simp_gpa << HV_HYP_PAGE_SHIFT,
 				   HV_HYP_PAGE_SIZE, MEMREMAP_WB);
@@ -233,7 +241,7 @@ void hv_synic_enable_regs(unsigned int cpu)
 	siefp.as_uint64 = hv_get_register(HV_REGISTER_SIEFP);
 	siefp.siefp_enabled = 1;
 
-	if (hv_isolation_type_snp()) {
+	if (hv_isolation_type_snp() || hv_root_partition) {
 		hv_cpu->synic_event_page =
 			memremap(siefp.base_siefp_gpa << HV_HYP_PAGE_SHIFT,
 				 HV_HYP_PAGE_SIZE, MEMREMAP_WB);
-- 
2.25.1


  parent reply	other threads:[~2022-11-24  6:02 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <https://lore.kernel.org/linux-hyperv/cover.1667394408.git.jinankjain@microsoft.com/T/#t>
2022-11-02 16:35 ` [PATCH v2 0/5] Add support running nested Microsoft Hypervisor Jinank Jain
2022-11-02 16:35   ` [PATCH v2 1/5] mshv: Add support for detecting nested hypervisor Jinank Jain
2022-11-03  3:29     ` Michael Kelley (LINUX)
2022-11-02 16:35   ` [PATCH v2 2/5] hv: Setup synic registers in case of nested root partition Jinank Jain
2022-11-03  3:29     ` Michael Kelley (LINUX)
2022-11-02 16:36   ` [PATCH v2 3/5] hv: Add an interface to do nested hypercalls Jinank Jain
2022-11-03  3:30     ` Michael Kelley (LINUX)
2022-11-02 16:36   ` [PATCH v2 4/5] hv: Enable vmbus driver for nested root partition Jinank Jain
2022-11-03  3:30     ` Michael Kelley (LINUX)
2022-11-03 14:16       ` Wei Liu
2022-11-03  7:02     ` Anirudh Rayabharam
2022-11-02 16:36   ` [PATCH v2 5/5] hv, mshv : Change interrupt vector " Jinank Jain
2022-11-17  3:27   ` [PATCH v4 0/5] Add support running nested Microsoft Hypervisor Jinank Jain
2022-11-17  3:27     ` [PATCH v4 1/5] x86/hyperv: Add support for detecting nested hypervisor Jinank Jain
2022-11-18 15:24       ` Michael Kelley (LINUX)
2022-11-17  3:27     ` [PATCH v4 2/5] Drivers: hv: Setup synic registers in case of nested root partition Jinank Jain
2022-11-18 15:34       ` Michael Kelley (LINUX)
2022-11-19  1:39       ` Nuno Das Neves
2022-11-17  3:27     ` [PATCH v4 3/5] x86/hyperv: Add an interface to do nested hypercalls Jinank Jain
2022-11-18 15:35       ` Michael Kelley (LINUX)
2022-11-17  3:27     ` [PATCH v4 4/5] Drivers: hv: Enable vmbus driver for nested root partition Jinank Jain
2022-11-18 15:36       ` Michael Kelley (LINUX)
2022-11-17  3:27     ` [PATCH v4 5/5] x86/hyperv: Change interrupt vector " Jinank Jain
2022-11-18 15:41       ` Michael Kelley (LINUX)
2022-11-24  6:02   ` [PATCH v6 0/5] Add support running nested Microsoft Hypervisor Jinank Jain
2022-11-24  6:02     ` [PATCH v6 1/5] x86/hyperv: Add support for detecting nested hypervisor Jinank Jain
2022-11-24  6:02     ` Jinank Jain [this message]
2022-11-28 19:45       ` [PATCH v6 2/5] Drivers: hv: Setup synic registers in case of nested root partition Michael Kelley (LINUX)
2022-11-24  6:02     ` [PATCH v6 3/5] x86/hyperv: Add an interface to do nested hypercalls Jinank Jain
2022-11-24  6:02     ` [PATCH v6 4/5] Drivers: hv: Enable vmbus driver for nested root partition Jinank Jain
2022-11-24  6:02     ` [PATCH v6 5/5] x86/hyperv: Change interrupt vector " Jinank Jain
2022-12-01 11:03   ` [PATCH v7 0/5] Add support running nested Microsoft Hypervisor Jinank Jain
2022-12-01 11:03     ` [PATCH v7 1/5] x86/hyperv: Add support for detecting nested hypervisor Jinank Jain
2022-12-01 11:03     ` [PATCH v7 2/5] Drivers: hv: Setup synic registers in case of nested root partition Jinank Jain
2022-12-02  4:00       ` Michael Kelley (LINUX)
2022-12-02  7:05         ` Jinank Jain
2022-12-02 15:27           ` Michael Kelley (LINUX)
2022-12-01 11:03     ` [PATCH v7 3/5] x86/hyperv: Add an interface to do nested hypercalls Jinank Jain
2022-12-01 11:03     ` [PATCH v7 4/5] Drivers: hv: Enable vmbus driver for nested root partition Jinank Jain
2022-12-01 11:03     ` [PATCH v7 5/5] x86/hyperv: Change interrupt vector " Jinank Jain
2022-12-09  5:32   ` [PATCH v8 0/5] Add support running nested Microsoft Hypervisor Jinank Jain
2022-12-09  5:32     ` [PATCH v8 1/5] x86/hyperv: Add support for detecting nested hypervisor Jinank Jain
2022-12-09 17:58       ` Nuno Das Neves
2022-12-09  5:32     ` [PATCH v8 2/5] Drivers: hv: Setup synic registers in case of nested root partition Jinank Jain
2022-12-09 17:56       ` Michael Kelley (LINUX)
2022-12-09  5:32     ` [PATCH v8 3/5] x86/hyperv: Add an interface to do nested hypercalls Jinank Jain
2022-12-09 18:16       ` Nuno Das Neves
2022-12-09  5:32     ` [PATCH v8 4/5] Drivers: hv: Enable vmbus driver for nested root partition Jinank Jain
2022-12-09 18:16       ` Nuno Das Neves
2022-12-09  5:32     ` [PATCH v8 5/5] x86/hyperv: Change interrupt vector " Jinank Jain
2022-12-14  6:32   ` [PATCH v9 0/5] Add support running nested Microsoft Hypervisor Jinank Jain
2022-12-14  6:33     ` [PATCH v9 1/5] x86/hyperv: Add support for detecting nested hypervisor Jinank Jain
2022-12-14  6:33     ` [PATCH v9 2/5] Drivers: hv: Setup synic registers in case of nested root partition Jinank Jain
2022-12-29 20:57       ` Michael Kelley (LINUX)
2022-12-14  6:33     ` [PATCH v9 3/5] x86/hyperv: Add an interface to do nested hypercalls Jinank Jain
2022-12-14 17:25       ` Nuno Das Neves
2022-12-14  6:33     ` [PATCH v9 4/5] Drivers: hv: Enable vmbus driver for nested root partition Jinank Jain
2022-12-14  6:33     ` [PATCH v9 5/5] x86/hyperv: Change interrupt vector " Jinank Jain

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=bf78acdc273fa730faf6eff49dd67a32c2242d84.1669269377.git.jinankjain@linux.microsoft.com \
    --to=jinankjain@linux.microsoft.com \
    --cc=ak@linux.intel.com \
    --cc=anrayabh@linux.microsoft.com \
    --cc=arnd@arndb.de \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=decui@microsoft.com \
    --cc=haiyangz@microsoft.com \
    --cc=hpa@zytor.com \
    --cc=jinankjain@microsoft.com \
    --cc=jpoimboe@kernel.org \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=kys@microsoft.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-hyperv@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mikelley@microsoft.com \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.org \
    --cc=sathyanarayanan.kuppuswamy@linux.intel.com \
    --cc=seanjc@google.com \
    --cc=tglx@linutronix.de \
    --cc=wei.liu@kernel.org \
    --cc=x86@kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).