[PATCH 2/4] Drivers: hv: Use nested hypercall for post message and signal event

Nuno Das Neves
2025-06-11T00:03:32Z

When running nested, these hypercalls must be sent to the L0 hypervisor
or vmbus will fail.

Add ARM64 stubs for the nested hypercall helpers to not break
compilation (nested is still only supported in x86).

Signed-off-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>
---
arch/arm64/include/asm/mshyperv.h | 10 ++++++++++
drivers/hv/connection.c | 3 +++
drivers/hv/hv.c | 3 +++
3 files changed, 16 insertions(+)

diff --git a/arch/arm64/include/asm/mshyperv.h b/arch/arm64/include/asm/mshyperv.h
index b721d3134ab6..893d6a2e8dab 100644
--- a/arch/arm64/include/asm/mshyperv.h
+++ b/arch/arm64/include/asm/mshyperv.h
@@ -53,6 +53,16 @@ static inline u64 hv_get_non_nested_msr(unsigned int reg)
return hv_get_msr(reg);
}

+static inline u64 hv_do_nested_hypercall(u64 control, void *input, void *output)
+{
+ return U64_MAX;
+}
+
+static inline u64 hv_do_fast_nested_hypercall8(u64 control, u64 input1)
+{
+ return U64_MAX;
+}
+
/* SMCCC hypercall parameters */
#define HV_SMCCC_FUNC_NUMBER 1
#define HV_FUNC_ID ARM_SMCCC_CALL_VAL( \
diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c
index be490c598785..992022bc770c 100644
--- a/drivers/hv/connection.c
+++ b/drivers/hv/connection.c
@@ -518,6 +518,9 @@ void vmbus_set_event(struct vmbus_channel *channel)
channel->sig_event, 0);
else
WARN_ON_ONCE(1);
+ } else if (hv_nested) {
+ hv_do_fast_nested_hypercall8(HVCALL_SIGNAL_EVENT,
+ channel->sig_event);
} else {
hv_do_fast_hypercall8(HVCALL_SIGNAL_EVENT, channel->sig_event);
}
diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c
index 308c8f279df8..99b73e779bf0 100644
--- a/drivers/hv/hv.c
+++ b/drivers/hv/hv.c
@@ -84,6 +84,9 @@ int hv_post_message(union hv_connection_id connection_id,
sizeof(*aligned_msg));
else
status = HV_STATUS_INVALID_PARAMETER;
+ } else if (hv_nested) {
+ status = hv_do_nested_hypercall(HVCALL_POST_MESSAGE,
+ aligned_msg, NULL);
} else {
status = hv_do_hypercall(HVCALL_POST_MESSAGE,
aligned_msg, NULL);
--
2.34.1