The confidential VMBus is built on the guest talking to the
paravisor only.
Provide functions that allow manipulating the SynIC registers
via paravisor.
Signed-off-by: Roman Kisel <romank@linux.microsoft.com>
---
arch/arm64/hyperv/mshyperv.c | 19 +++++++++++++++++++
arch/arm64/include/asm/mshyperv.h | 3 +++
arch/x86/include/asm/mshyperv.h | 3 +++
arch/x86/kernel/cpu/mshyperv.c | 28 ++++++++++++++++++++++++++++
4 files changed, 53 insertions(+)
diff --git a/arch/arm64/hyperv/mshyperv.c b/arch/arm64/hyperv/mshyperv.c
index 4fdc26ade1d7..8778b6831062 100644
--- a/arch/arm64/hyperv/mshyperv.c
+++ b/arch/arm64/hyperv/mshyperv.c
@@ -134,3 +134,22 @@ bool hv_is_hyperv_initialized(void)
return hyperv_initialized;
}
EXPORT_SYMBOL_GPL(hv_is_hyperv_initialized);
+
+/*
+ * Not supported yet.
+ */
+u64 hv_pv_get_synic_register(unsigned int reg, int *err)
+{
+ *err = -ENODEV;
+ return !0ULL;
+}
+EXPORT_SYMBOL_GPL(hv_pv_get_synic_register);
+
+/*
+ * Not supported yet.
+ */
+int hv_pv_set_synic_register(unsigned int reg, u64 val)
+{
+ return -ENODEV;
+}
+EXPORT_SYMBOL_GPL(hv_pv_set_synic_register);
diff --git a/arch/arm64/include/asm/mshyperv.h b/arch/arm64/include/asm/mshyperv.h
index b721d3134ab6..bce37a58dff0 100644
--- a/arch/arm64/include/asm/mshyperv.h
+++ b/arch/arm64/include/asm/mshyperv.h
@@ -53,6 +53,9 @@ static inline u64 hv_get_non_nested_msr(unsigned int reg)
return hv_get_msr(reg);
}
+u64 hv_pv_get_synic_register(unsigned int reg, int *err);
+int hv_pv_set_synic_register(unsigned int reg, u64 val);
+
/* SMCCC hypercall parameters */
#define HV_SMCCC_FUNC_NUMBER 1
#define HV_FUNC_ID ARM_SMCCC_CALL_VAL( \
diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
index bab5ccfc60a7..0a4b01c1f094 100644
--- a/arch/x86/include/asm/mshyperv.h
+++ b/arch/x86/include/asm/mshyperv.h
@@ -307,6 +307,9 @@ static __always_inline u64 hv_raw_get_msr(unsigned int reg)
return __rdmsr(reg);
}
+u64 hv_pv_get_synic_register(unsigned int reg, int *err);
+int hv_pv_set_synic_register(unsigned int reg, u64 val);
+
#else /* CONFIG_HYPERV */
static inline void hyperv_init(void) {}
static inline void hyperv_setup_mmu_ops(void) {}
diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
index 3e2533954675..4f6e3d02f730 100644
--- a/arch/x86/kernel/cpu/mshyperv.c
+++ b/arch/x86/kernel/cpu/mshyperv.c
@@ -89,6 +89,34 @@ void hv_set_non_nested_msr(unsigned int reg, u64 value)
}
EXPORT_SYMBOL_GPL(hv_set_non_nested_msr);
+/*
+ * Not every paravisor supports getting SynIC registers, and
+ * this function may fail. The caller has to make sure that this function
+ * runs on the CPU of interest.
+ */
+u64 hv_pv_get_synic_register(unsigned int reg, int *err)
+{
+ if (!hv_is_synic_msr(reg)) {
+ *err = -ENODEV;
+ return !0ULL;
+ }
+ return native_read_msr_safe(reg, err);
+}
+EXPORT_SYMBOL_GPL(hv_pv_get_synic_register);
+
+/*
+ * Not every paravisor supports setting SynIC registers, and
+ * this function may fail. The caller has to make sure that this function
+ * runs on the CPU of interest.
+ */
+int hv_pv_set_synic_register(unsigned int reg, u64 val)
+{
+ if (!hv_is_synic_msr(reg))
+ return -ENODEV;
+ return wrmsrl_safe(reg, val);
+}
+EXPORT_SYMBOL_GPL(hv_pv_set_synic_register);
+
u64 hv_get_msr(unsigned int reg)
{
if (hv_nested)
--
2.43.0
On 12-05-2025 04:37, Roman Kisel wrote:
> +/*
> + * Not every paravisor supports getting SynIC registers, and
> + * this function may fail. The caller has to make sure that this function
> + * runs on the CPU of interest.
> + */
Title and Intent: Clearly state the purpose of the function in the first
sentence
/*
* Attempt to get the SynIC register value.
*
* Not all paravisors support reading SynIC registers, so this function
* may fail. The caller must ensure that it is executed on the target
* CPU.
*
* Returns: The SynIC register value or ~0ULL on failure.
* Sets err to -ENODEV if the provided register is not a valid SynIC
* MSR.
*/
> +u64 hv_pv_get_synic_register(unsigned int reg, int *err)
> +{
> + if (!hv_is_synic_msr(reg)) {
> + *err = -ENODEV;
> + return !0ULL;
> + }
> + return native_read_msr_safe(reg, err);
> +}
> +EXPORT_SYMBOL_GPL(hv_pv_get_synic_register);
> +
> +/*
> + * Not every paravisor supports setting SynIC registers, and
> + * this function may fail. The caller has to make sure that this function
> + * runs on the CPU of interest.
> + */
ditto.
> +int hv_pv_set_synic_register(unsigned int reg, u64 val)
> +{
> + if (!hv_is_synic_msr(reg))
> + return -ENODEV;
> + return wrmsrl_safe(reg, val);
> +}
> +EXPORT_SYMBOL_GPL(hv_pv_set_synic_register);
Thanks,
Alok
On 5/12/2025 2:39 AM, ALOK TIWARI wrote:
>
>
> On 12-05-2025 04:37, Roman Kisel wrote:
>> +/*
>> + * Not every paravisor supports getting SynIC registers, and
>> + * this function may fail. The caller has to make sure that this
>> function
>> + * runs on the CPU of interest.
>> + */
>
> Title and Intent: Clearly state the purpose of the function in the first
> sentence
> /*
> * Attempt to get the SynIC register value.
> *
> * Not all paravisors support reading SynIC registers, so this function
> * may fail. The caller must ensure that it is executed on the target
> * CPU.
> *
> * Returns: The SynIC register value or ~0ULL on failure.
> * Sets err to -ENODEV if the provided register is not a valid SynIC
> * MSR.
> */
>
>> +u64 hv_pv_get_synic_register(unsigned int reg, int *err)
>> +{
>> + if (!hv_is_synic_msr(reg)) {
>> + *err = -ENODEV;
>> + return !0ULL;
>> + }
>> + return native_read_msr_safe(reg, err);
>> +}
>> +EXPORT_SYMBOL_GPL(hv_pv_get_synic_register);
>> +
>> +/*
>> + * Not every paravisor supports setting SynIC registers, and
>> + * this function may fail. The caller has to make sure that this
>> function
>> + * runs on the CPU of interest.
>> + */
>
> ditto.
>
>> +int hv_pv_set_synic_register(unsigned int reg, u64 val)
>> +{
>> + if (!hv_is_synic_msr(reg))
>> + return -ENODEV;
>> + return wrmsrl_safe(reg, val);
>> +}
>> +EXPORT_SYMBOL_GPL(hv_pv_set_synic_register);
>
Indeed, I wrote a bit of a novel in the comments which might be
distracting and making it harder to find the point :)
Ought to be more conscious of the reader's perhaps constrained
time budget. I'll restructure that as you suggested!
> Thanks,
> Alok
>
--
Thank you,
Roman
© 2016 - 2025 Red Hat, Inc.