From: Roman Kisel <romank@linux.microsoft.com>
To: arnd@arndb.de, bhelgaas@google.com, bp@alien8.de,
catalin.marinas@arm.com, dave.hansen@linux.intel.com,
decui@microsoft.com, haiyangz@microsoft.com, hpa@zytor.com,
kw@linux.com, kys@microsoft.com, lenb@kernel.org,
lpieralisi@kernel.org, mingo@redhat.com, mhklinux@outlook.com,
rafael@kernel.org, robh@kernel.org, tglx@linutronix.de,
wei.liu@kernel.org, will@kernel.org, linux-acpi@vger.kernel.org,
linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-pci@vger.kernel.org, x86@kernel.org
Cc: ssengar@microsoft.com, sunilmut@microsoft.com, vdso@hexbites.dev
Subject: [PATCH v2 3/6] drivers/hv: arch-neutral implementation of get_vtl()
Date: Tue, 14 May 2024 15:43:50 -0700 [thread overview]
Message-ID: <20240514224508.212318-4-romank@linux.microsoft.com> (raw)
In-Reply-To: <20240514224508.212318-1-romank@linux.microsoft.com>
To run in the VTL mode, Hyper-V drivers have to know what
VTL the system boots in, and the arm64/hyperv code does not
have the means to compute that.
Refactor the code to hoist the function that detects VTL,
make it arch-neutral to be able to employ it to get the VTL
on arm64.
Signed-off-by: Roman Kisel <romank@linux.microsoft.com>
---
arch/x86/hyperv/hv_init.c | 34 -----------------------
arch/x86/include/asm/hyperv-tlfs.h | 7 -----
drivers/hv/hv_common.c | 43 ++++++++++++++++++++++++++++++
include/asm-generic/hyperv-tlfs.h | 7 +++++
include/asm-generic/mshyperv.h | 6 +++++
5 files changed, 56 insertions(+), 41 deletions(-)
diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index 17a71e92a343..c350fa05ee59 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -413,40 +413,6 @@ static void __init hv_get_partition_id(void)
local_irq_restore(flags);
}
-#if IS_ENABLED(CONFIG_HYPERV_VTL_MODE)
-static u8 __init get_vtl(void)
-{
- u64 control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_REGISTERS;
- struct hv_get_vp_registers_input *input;
- struct hv_get_vp_registers_output *output;
- unsigned long flags;
- u64 ret;
-
- local_irq_save(flags);
- input = *this_cpu_ptr(hyperv_pcpu_input_arg);
- output = (struct hv_get_vp_registers_output *)input;
-
- memset(input, 0, struct_size(input, element, 1));
- input->header.partitionid = HV_PARTITION_ID_SELF;
- input->header.vpindex = HV_VP_INDEX_SELF;
- input->header.inputvtl = 0;
- input->element[0].name0 = HV_X64_REGISTER_VSM_VP_STATUS;
-
- ret = hv_do_hypercall(control, input, output);
- if (hv_result_success(ret)) {
- ret = output->as64.low & HV_X64_VTL_MASK;
- } else {
- pr_err("Failed to get VTL(error: %lld) exiting...\n", ret);
- BUG();
- }
-
- local_irq_restore(flags);
- return ret;
-}
-#else
-static inline u8 get_vtl(void) { return 0; }
-#endif
-
/*
* This function is to be invoked early in the boot sequence after the
* hypervisor has been detected.
diff --git a/arch/x86/include/asm/hyperv-tlfs.h b/arch/x86/include/asm/hyperv-tlfs.h
index 3787d26810c1..9ee68eb8e6ff 100644
--- a/arch/x86/include/asm/hyperv-tlfs.h
+++ b/arch/x86/include/asm/hyperv-tlfs.h
@@ -309,13 +309,6 @@ enum hv_isolation_type {
#define HV_MSR_STIMER0_CONFIG (HV_X64_MSR_STIMER0_CONFIG)
#define HV_MSR_STIMER0_COUNT (HV_X64_MSR_STIMER0_COUNT)
-/*
- * Registers are only accessible via HVCALL_GET_VP_REGISTERS hvcall and
- * there is not associated MSR address.
- */
-#define HV_X64_REGISTER_VSM_VP_STATUS 0x000D0003
-#define HV_X64_VTL_MASK GENMASK(3, 0)
-
/* Hyper-V memory host visibility */
enum hv_mem_host_visibility {
VMBUS_PAGE_NOT_VISIBLE = 0,
diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c
index dde3f9b6871a..d4cf477a4d0c 100644
--- a/drivers/hv/hv_common.c
+++ b/drivers/hv/hv_common.c
@@ -660,3 +660,46 @@ u64 __weak hv_tdx_hypercall(u64 control, u64 param1, u64 param2)
return HV_STATUS_INVALID_PARAMETER;
}
EXPORT_SYMBOL_GPL(hv_tdx_hypercall);
+
+#if IS_ENABLED(CONFIG_HYPERV_VTL_MODE)
+u8 __init get_vtl(void)
+{
+ u64 control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_REGISTERS;
+ struct hv_get_vp_registers_input *input;
+ struct hv_get_vp_registers_output *output;
+ unsigned long flags;
+ u64 ret;
+
+ local_irq_save(flags);
+ input = *this_cpu_ptr(hyperv_pcpu_input_arg);
+ output = (struct hv_get_vp_registers_output *)input;
+
+ memset(input, 0, struct_size(input, element, 1));
+ input->header.partitionid = HV_PARTITION_ID_SELF;
+ input->header.vpindex = HV_VP_INDEX_SELF;
+ input->header.inputvtl = 0;
+ input->element[0].name0 = HV_REGISTER_VSM_VP_STATUS;
+
+ ret = hv_do_hypercall(control, input, output);
+ if (hv_result_success(ret)) {
+ ret = output->as64.low & HV_VTL_MASK;
+ } else {
+ pr_err("Failed to get VTL(error: %lld) exiting...\n", ret);
+
+ /*
+ * This is a dead end, something fundamental is broken.
+ *
+ * There is no sensible way of continuing as the Hyper-V drivers
+ * transitively depend via the vmbus driver on knowing which VTL
+ * they run in to establish communication with the host. The kernel
+ * is going to be worse off if continued booting than a panicked one,
+ * just hung and stuck, producing second-order failures, with neither
+ * a way to recover nor to provide expected services.
+ */
+ BUG();
+ }
+
+ local_irq_restore(flags);
+ return ret;
+}
+#endif
diff --git a/include/asm-generic/hyperv-tlfs.h b/include/asm-generic/hyperv-tlfs.h
index 87e3d49a4e29..682bcda3124f 100644
--- a/include/asm-generic/hyperv-tlfs.h
+++ b/include/asm-generic/hyperv-tlfs.h
@@ -75,6 +75,13 @@
/* AccessTscInvariantControls privilege */
#define HV_ACCESS_TSC_INVARIANT BIT(15)
+/*
+ * This synthetic register is only accessible via the HVCALL_GET_VP_REGISTERS
+ * hvcall, and there is no an associated MSR on x86.
+ */
+#define HV_REGISTER_VSM_VP_STATUS 0x000D0003
+#define HV_VTL_MASK GENMASK(3, 0)
+
/*
* Group B features.
*/
diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h
index 99935779682d..ea434186d765 100644
--- a/include/asm-generic/mshyperv.h
+++ b/include/asm-generic/mshyperv.h
@@ -301,4 +301,10 @@ static inline enum hv_isolation_type hv_get_isolation_type(void)
}
#endif /* CONFIG_HYPERV */
+#if IS_ENABLED(CONFIG_HYPERV_VTL_MODE)
+u8 __init get_vtl(void);
+#else
+static inline u8 get_vtl(void) { return 0; }
+#endif
+
#endif
--
2.45.0
WARNING: multiple messages have this Message-ID (diff)
From: Roman Kisel <romank@linux.microsoft.com>
To: arnd@arndb.de, bhelgaas@google.com, bp@alien8.de,
catalin.marinas@arm.com, dave.hansen@linux.intel.com,
decui@microsoft.com, haiyangz@microsoft.com, hpa@zytor.com,
kw@linux.com, kys@microsoft.com, lenb@kernel.org,
lpieralisi@kernel.org, mingo@redhat.com, mhklinux@outlook.com,
rafael@kernel.org, robh@kernel.org, tglx@linutronix.de,
wei.liu@kernel.org, will@kernel.org, linux-acpi@vger.kernel.org,
linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-hyperv@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-pci@vger.kernel.org, x86@kernel.org
Cc: ssengar@microsoft.com, sunilmut@microsoft.com, vdso@hexbites.dev
Subject: [PATCH v2 3/6] drivers/hv: arch-neutral implementation of get_vtl()
Date: Tue, 14 May 2024 15:43:50 -0700 [thread overview]
Message-ID: <20240514224508.212318-4-romank@linux.microsoft.com> (raw)
In-Reply-To: <20240514224508.212318-1-romank@linux.microsoft.com>
To run in the VTL mode, Hyper-V drivers have to know what
VTL the system boots in, and the arm64/hyperv code does not
have the means to compute that.
Refactor the code to hoist the function that detects VTL,
make it arch-neutral to be able to employ it to get the VTL
on arm64.
Signed-off-by: Roman Kisel <romank@linux.microsoft.com>
---
arch/x86/hyperv/hv_init.c | 34 -----------------------
arch/x86/include/asm/hyperv-tlfs.h | 7 -----
drivers/hv/hv_common.c | 43 ++++++++++++++++++++++++++++++
include/asm-generic/hyperv-tlfs.h | 7 +++++
include/asm-generic/mshyperv.h | 6 +++++
5 files changed, 56 insertions(+), 41 deletions(-)
diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index 17a71e92a343..c350fa05ee59 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -413,40 +413,6 @@ static void __init hv_get_partition_id(void)
local_irq_restore(flags);
}
-#if IS_ENABLED(CONFIG_HYPERV_VTL_MODE)
-static u8 __init get_vtl(void)
-{
- u64 control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_REGISTERS;
- struct hv_get_vp_registers_input *input;
- struct hv_get_vp_registers_output *output;
- unsigned long flags;
- u64 ret;
-
- local_irq_save(flags);
- input = *this_cpu_ptr(hyperv_pcpu_input_arg);
- output = (struct hv_get_vp_registers_output *)input;
-
- memset(input, 0, struct_size(input, element, 1));
- input->header.partitionid = HV_PARTITION_ID_SELF;
- input->header.vpindex = HV_VP_INDEX_SELF;
- input->header.inputvtl = 0;
- input->element[0].name0 = HV_X64_REGISTER_VSM_VP_STATUS;
-
- ret = hv_do_hypercall(control, input, output);
- if (hv_result_success(ret)) {
- ret = output->as64.low & HV_X64_VTL_MASK;
- } else {
- pr_err("Failed to get VTL(error: %lld) exiting...\n", ret);
- BUG();
- }
-
- local_irq_restore(flags);
- return ret;
-}
-#else
-static inline u8 get_vtl(void) { return 0; }
-#endif
-
/*
* This function is to be invoked early in the boot sequence after the
* hypervisor has been detected.
diff --git a/arch/x86/include/asm/hyperv-tlfs.h b/arch/x86/include/asm/hyperv-tlfs.h
index 3787d26810c1..9ee68eb8e6ff 100644
--- a/arch/x86/include/asm/hyperv-tlfs.h
+++ b/arch/x86/include/asm/hyperv-tlfs.h
@@ -309,13 +309,6 @@ enum hv_isolation_type {
#define HV_MSR_STIMER0_CONFIG (HV_X64_MSR_STIMER0_CONFIG)
#define HV_MSR_STIMER0_COUNT (HV_X64_MSR_STIMER0_COUNT)
-/*
- * Registers are only accessible via HVCALL_GET_VP_REGISTERS hvcall and
- * there is not associated MSR address.
- */
-#define HV_X64_REGISTER_VSM_VP_STATUS 0x000D0003
-#define HV_X64_VTL_MASK GENMASK(3, 0)
-
/* Hyper-V memory host visibility */
enum hv_mem_host_visibility {
VMBUS_PAGE_NOT_VISIBLE = 0,
diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c
index dde3f9b6871a..d4cf477a4d0c 100644
--- a/drivers/hv/hv_common.c
+++ b/drivers/hv/hv_common.c
@@ -660,3 +660,46 @@ u64 __weak hv_tdx_hypercall(u64 control, u64 param1, u64 param2)
return HV_STATUS_INVALID_PARAMETER;
}
EXPORT_SYMBOL_GPL(hv_tdx_hypercall);
+
+#if IS_ENABLED(CONFIG_HYPERV_VTL_MODE)
+u8 __init get_vtl(void)
+{
+ u64 control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_REGISTERS;
+ struct hv_get_vp_registers_input *input;
+ struct hv_get_vp_registers_output *output;
+ unsigned long flags;
+ u64 ret;
+
+ local_irq_save(flags);
+ input = *this_cpu_ptr(hyperv_pcpu_input_arg);
+ output = (struct hv_get_vp_registers_output *)input;
+
+ memset(input, 0, struct_size(input, element, 1));
+ input->header.partitionid = HV_PARTITION_ID_SELF;
+ input->header.vpindex = HV_VP_INDEX_SELF;
+ input->header.inputvtl = 0;
+ input->element[0].name0 = HV_REGISTER_VSM_VP_STATUS;
+
+ ret = hv_do_hypercall(control, input, output);
+ if (hv_result_success(ret)) {
+ ret = output->as64.low & HV_VTL_MASK;
+ } else {
+ pr_err("Failed to get VTL(error: %lld) exiting...\n", ret);
+
+ /*
+ * This is a dead end, something fundamental is broken.
+ *
+ * There is no sensible way of continuing as the Hyper-V drivers
+ * transitively depend via the vmbus driver on knowing which VTL
+ * they run in to establish communication with the host. The kernel
+ * is going to be worse off if continued booting than a panicked one,
+ * just hung and stuck, producing second-order failures, with neither
+ * a way to recover nor to provide expected services.
+ */
+ BUG();
+ }
+
+ local_irq_restore(flags);
+ return ret;
+}
+#endif
diff --git a/include/asm-generic/hyperv-tlfs.h b/include/asm-generic/hyperv-tlfs.h
index 87e3d49a4e29..682bcda3124f 100644
--- a/include/asm-generic/hyperv-tlfs.h
+++ b/include/asm-generic/hyperv-tlfs.h
@@ -75,6 +75,13 @@
/* AccessTscInvariantControls privilege */
#define HV_ACCESS_TSC_INVARIANT BIT(15)
+/*
+ * This synthetic register is only accessible via the HVCALL_GET_VP_REGISTERS
+ * hvcall, and there is no an associated MSR on x86.
+ */
+#define HV_REGISTER_VSM_VP_STATUS 0x000D0003
+#define HV_VTL_MASK GENMASK(3, 0)
+
/*
* Group B features.
*/
diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h
index 99935779682d..ea434186d765 100644
--- a/include/asm-generic/mshyperv.h
+++ b/include/asm-generic/mshyperv.h
@@ -301,4 +301,10 @@ static inline enum hv_isolation_type hv_get_isolation_type(void)
}
#endif /* CONFIG_HYPERV */
+#if IS_ENABLED(CONFIG_HYPERV_VTL_MODE)
+u8 __init get_vtl(void);
+#else
+static inline u8 get_vtl(void) { return 0; }
+#endif
+
#endif
--
2.45.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2024-05-14 22:45 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-14 22:43 [PATCH v2 0/6] arm64/hyperv: Support Virtual Trust Level Boot Roman Kisel
2024-05-14 22:43 ` Roman Kisel
2024-05-14 22:43 ` [PATCH v2 1/6] arm64/hyperv: Support DeviceTree Roman Kisel
2024-05-14 22:43 ` Roman Kisel
2024-05-15 7:45 ` Krzysztof Kozlowski
2024-05-15 7:45 ` Krzysztof Kozlowski
2024-05-15 17:33 ` Roman Kisel
2024-05-15 17:33 ` Roman Kisel
2024-05-20 6:45 ` Krzysztof Kozlowski
2024-05-20 6:45 ` Krzysztof Kozlowski
2024-05-20 20:36 ` Roman Kisel
2024-05-20 20:36 ` Roman Kisel
2024-05-15 22:02 ` Elliot Berman
2024-05-15 22:02 ` Elliot Berman
2024-05-16 15:27 ` Roman Kisel
2024-05-16 15:27 ` Roman Kisel
2024-06-11 14:55 ` Roman Kisel
2024-06-11 14:55 ` Roman Kisel
2024-05-14 22:43 ` [PATCH v2 2/6] drivers/hv: Enable VTL mode for arm64 Roman Kisel
2024-05-14 22:43 ` Roman Kisel
2024-05-15 13:37 ` Michael Kelley
2024-05-15 13:37 ` Michael Kelley
2024-05-15 18:04 ` Roman Kisel
2024-05-15 18:04 ` Roman Kisel
2024-05-14 22:43 ` Roman Kisel [this message]
2024-05-14 22:43 ` [PATCH v2 3/6] drivers/hv: arch-neutral implementation of get_vtl() Roman Kisel
2024-05-15 13:38 ` Michael Kelley
2024-05-15 13:38 ` Michael Kelley
2024-05-15 18:11 ` Roman Kisel
2024-05-15 18:11 ` Roman Kisel
2024-05-14 22:43 ` [PATCH v2 4/6] arm64/hyperv: Boot in a Virtual Trust Level Roman Kisel
2024-05-14 22:43 ` Roman Kisel
2024-05-15 13:39 ` Michael Kelley
2024-05-15 13:39 ` Michael Kelley
2024-05-15 18:13 ` Roman Kisel
2024-05-15 18:13 ` Roman Kisel
2024-05-14 22:43 ` [PATCH v2 5/6] drivers/hv/vmbus: Get the irq number from DeviceTree Roman Kisel
2024-05-14 22:43 ` Roman Kisel
2024-05-15 7:47 ` Krzysztof Kozlowski
2024-05-15 7:47 ` Krzysztof Kozlowski
2024-05-15 17:05 ` Roman Kisel
2024-05-15 17:05 ` Roman Kisel
2024-05-15 9:42 ` Saurabh Singh Sengar
2024-05-15 9:42 ` Saurabh Singh Sengar
2024-05-15 16:31 ` Roman Kisel
2024-05-15 16:31 ` Roman Kisel
2024-05-15 13:44 ` Michael Kelley
2024-05-15 13:44 ` Michael Kelley
2024-05-15 18:21 ` Roman Kisel
2024-05-15 18:21 ` Roman Kisel
2024-05-16 2:40 ` kernel test robot
2024-05-16 2:40 ` kernel test robot
2024-05-17 17:14 ` Rob Herring
2024-05-17 17:14 ` Rob Herring
2024-05-20 19:25 ` Roman Kisel
2024-05-20 19:25 ` Roman Kisel
2024-05-14 22:43 ` [PATCH v2 6/6] drivers/pci/hyperv/arm64: vPCI MSI IRQ domain from DT Roman Kisel
2024-05-14 22:43 ` Roman Kisel
2024-05-15 9:48 ` Saurabh Singh Sengar
2024-05-15 9:48 ` Saurabh Singh Sengar
2024-05-15 16:34 ` Roman Kisel
2024-05-15 16:34 ` Roman Kisel
2024-05-15 18:12 ` Bjorn Helgaas
2024-05-15 18:12 ` Bjorn Helgaas
2024-05-15 18:34 ` Roman Kisel
2024-05-15 18:34 ` Roman Kisel
2024-06-07 19:55 ` Bjorn Helgaas
2024-06-07 19:55 ` Bjorn Helgaas
2024-06-11 14:40 ` Roman Kisel
2024-06-11 14:40 ` Roman Kisel
2024-05-15 13:47 ` Michael Kelley
2024-05-15 13:47 ` Michael Kelley
2024-05-15 18:31 ` Roman Kisel
2024-05-15 18:31 ` Roman Kisel
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=20240514224508.212318-4-romank@linux.microsoft.com \
--to=romank@linux.microsoft.com \
--cc=arnd@arndb.de \
--cc=bhelgaas@google.com \
--cc=bp@alien8.de \
--cc=catalin.marinas@arm.com \
--cc=dave.hansen@linux.intel.com \
--cc=decui@microsoft.com \
--cc=haiyangz@microsoft.com \
--cc=hpa@zytor.com \
--cc=kw@linux.com \
--cc=kys@microsoft.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-hyperv@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lpieralisi@kernel.org \
--cc=mhklinux@outlook.com \
--cc=mingo@redhat.com \
--cc=rafael@kernel.org \
--cc=robh@kernel.org \
--cc=ssengar@microsoft.com \
--cc=sunilmut@microsoft.com \
--cc=tglx@linutronix.de \
--cc=vdso@hexbites.dev \
--cc=wei.liu@kernel.org \
--cc=will@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 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.