There is no definition of the output structure for the
GetVpRegisters hypercall. Hence, using the hypercall
is not possible when the output value has some structure
to it. Even getting a datum of a primitive type reads
as ad-hoc without that definition.
Define struct hv_output_get_vp_registers to enable using
the GetVpRegisters hypercall. Make provisions for all
supported architectures. No functional changes.
Signed-off-by: Roman Kisel <romank@linux.microsoft.com>
---
include/hyperv/hvgdk_mini.h | 41 +++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/include/hyperv/hvgdk_mini.h b/include/hyperv/hvgdk_mini.h
index db3d1aaf7330..4fffca9e16df 100644
--- a/include/hyperv/hvgdk_mini.h
+++ b/include/hyperv/hvgdk_mini.h
@@ -1068,6 +1068,35 @@ union hv_dispatch_suspend_register {
} __packed;
};
+union hv_arm64_pending_interruption_register {
+ u64 as_uint64;
+ struct {
+ u64 interruption_pending : 1;
+ u64 interruption_type: 1;
+ u64 reserved : 30;
+ u64 error_code : 32;
+ } __packed;
+};
+
+union hv_arm64_interrupt_state_register {
+ u64 as_uint64;
+ struct {
+ u64 interrupt_shadow : 1;
+ u64 reserved : 63;
+ } __packed;
+};
+
+union hv_arm64_pending_synthetic_exception_event {
+ u64 as_uint64[2];
+ struct {
+ u8 event_pending : 1;
+ u8 event_type : 3;
+ u8 reserved : 4;
+ u8 rsvd[3];
+ u64 context;
+ } __packed;
+};
+
union hv_x64_interrupt_state_register {
u64 as_uint64;
struct {
@@ -1103,8 +1132,20 @@ union hv_register_value {
union hv_explicit_suspend_register explicit_suspend;
union hv_intercept_suspend_register intercept_suspend;
union hv_dispatch_suspend_register dispatch_suspend;
+#ifdef CONFIG_ARM64
+ union hv_arm64_interrupt_state_register interrupt_state;
+ union hv_arm64_pending_interruption_register pending_interruption;
+#endif
+#ifdef CONFIG_X86
union hv_x64_interrupt_state_register interrupt_state;
union hv_x64_pending_interruption_register pending_interruption;
+#endif
+ union hv_arm64_pending_synthetic_exception_event pending_synthetic_exception_event;
+};
+
+/* NOTE: Linux helper struct - NOT from Hyper-V code. */
+struct hv_output_get_vp_registers {
+ DECLARE_FLEX_ARRAY(union hv_register_value, values);
};
#if defined(CONFIG_ARM64)
--
2.34.1
On 1/8/2025 2:21 PM, Roman Kisel wrote:
> There is no definition of the output structure for the
> GetVpRegisters hypercall. Hence, using the hypercall
> is not possible when the output value has some structure
> to it. Even getting a datum of a primitive type reads
> as ad-hoc without that definition.
>
> Define struct hv_output_get_vp_registers to enable using
> the GetVpRegisters hypercall. Make provisions for all
> supported architectures. No functional changes.
>
> Signed-off-by: Roman Kisel <romank@linux.microsoft.com>
> ---
> include/hyperv/hvgdk_mini.h | 41 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 41 insertions(+)
>
> diff --git a/include/hyperv/hvgdk_mini.h b/include/hyperv/hvgdk_mini.h
> index db3d1aaf7330..4fffca9e16df 100644
> --- a/include/hyperv/hvgdk_mini.h
> +++ b/include/hyperv/hvgdk_mini.h
> @@ -1068,6 +1068,35 @@ union hv_dispatch_suspend_register {
> } __packed;
> };
>
> +union hv_arm64_pending_interruption_register {
> + u64 as_uint64;
> + struct {
> + u64 interruption_pending : 1;
> + u64 interruption_type: 1;
> + u64 reserved : 30;
> + u64 error_code : 32;
> + } __packed;
> +};
> +
> +union hv_arm64_interrupt_state_register {
> + u64 as_uint64;
> + struct {
> + u64 interrupt_shadow : 1;
> + u64 reserved : 63;
> + } __packed;
> +};
> +
> +union hv_arm64_pending_synthetic_exception_event {
> + u64 as_uint64[2];
> + struct {
> + u8 event_pending : 1;
> + u8 event_type : 3;
> + u8 reserved : 4;
> + u8 rsvd[3];
> + u64 context;
> + } __packed;
> +};
> +
You've omitted the exception_type field.
This is how it should be:
union hv_arm64_pending_synthetic_exception_event {
u64 as_uint64[2];
struct {
u8 event_pending : 1;
u8 event_type : 3;
u8 reserved : 4;
u8 rsvd[3];
u32 exception_type;
u64 context;
} __packed;
};
> union hv_x64_interrupt_state_register {
> u64 as_uint64;
> struct {
> @@ -1103,8 +1132,20 @@ union hv_register_value {
> union hv_explicit_suspend_register explicit_suspend;
> union hv_intercept_suspend_register intercept_suspend;
> union hv_dispatch_suspend_register dispatch_suspend;
> +#ifdef CONFIG_ARM64
> + union hv_arm64_interrupt_state_register interrupt_state;
> + union hv_arm64_pending_interruption_register pending_interruption;
> +#endif
> +#ifdef CONFIG_X86
> union hv_x64_interrupt_state_register interrupt_state;
> union hv_x64_pending_interruption_register pending_interruption;
> +#endif
> + union hv_arm64_pending_synthetic_exception_event pending_synthetic_exception_event;
> +};
> +
> +/* NOTE: Linux helper struct - NOT from Hyper-V code. */
> +struct hv_output_get_vp_registers {
> + DECLARE_FLEX_ARRAY(union hv_register_value, values);
> };
>
> #if defined(CONFIG_ARM64)
On Wed, Jan 08, 2025 at 03:25:22PM -0800, Nuno Das Neves wrote:
> On 1/8/2025 2:21 PM, Roman Kisel wrote:
> > There is no definition of the output structure for the
> > GetVpRegisters hypercall. Hence, using the hypercall
> > is not possible when the output value has some structure
> > to it. Even getting a datum of a primitive type reads
> > as ad-hoc without that definition.
> >
> > Define struct hv_output_get_vp_registers to enable using
> > the GetVpRegisters hypercall. Make provisions for all
> > supported architectures. No functional changes.
> >
> > Signed-off-by: Roman Kisel <romank@linux.microsoft.com>
> > ---
> > include/hyperv/hvgdk_mini.h | 41 +++++++++++++++++++++++++++++++++++++
> > 1 file changed, 41 insertions(+)
> >
> > diff --git a/include/hyperv/hvgdk_mini.h b/include/hyperv/hvgdk_mini.h
> > index db3d1aaf7330..4fffca9e16df 100644
> > --- a/include/hyperv/hvgdk_mini.h
> > +++ b/include/hyperv/hvgdk_mini.h
> > @@ -1068,6 +1068,35 @@ union hv_dispatch_suspend_register {
> > } __packed;
> > };
> >
> > +union hv_arm64_pending_interruption_register {
> > + u64 as_uint64;
> > + struct {
> > + u64 interruption_pending : 1;
> > + u64 interruption_type: 1;
> > + u64 reserved : 30;
> > + u64 error_code : 32;
> > + } __packed;
> > +};
> > +
> > +union hv_arm64_interrupt_state_register {
> > + u64 as_uint64;
> > + struct {
> > + u64 interrupt_shadow : 1;
> > + u64 reserved : 63;
> > + } __packed;
> > +};
> > +
> > +union hv_arm64_pending_synthetic_exception_event {
> > + u64 as_uint64[2];
> > + struct {
> > + u8 event_pending : 1;
> > + u8 event_type : 3;
> > + u8 reserved : 4;
> > + u8 rsvd[3];
> > + u64 context;
> > + } __packed;
> > +};
> > +
>
> You've omitted the exception_type field.
> This is how it should be:
>
> union hv_arm64_pending_synthetic_exception_event {
> u64 as_uint64[2];
> struct {
> u8 event_pending : 1;
> u8 event_type : 3;
> u8 reserved : 4;
> u8 rsvd[3];
> u32 exception_type;
> u64 context;
> } __packed;
> };
>
I can fix this when I commit the change . This patch will be folded into
your old one anyway.
Thanks,
Wei.
On 1/8/2025 9:50 PM, Wei Liu wrote: > On Wed, Jan 08, 2025 at 03:25:22PM -0800, Nuno Das Neves wrote: >> On 1/8/2025 2:21 PM, Roman Kisel wrote: [...] >> > > I can fix this when I commit the change . This patch will be folded into > your old one anyway. > Nuno, thank you very much for spotting that! Wei, appreciate that! Didn't mean to create more work for you, sorry about that. > Thanks, > Wei. -- Thank you, Roman
On Thu, Jan 09, 2025 at 09:25:58AM -0800, Roman Kisel wrote: > > > On 1/8/2025 9:50 PM, Wei Liu wrote: > > On Wed, Jan 08, 2025 at 03:25:22PM -0800, Nuno Das Neves wrote: > > > On 1/8/2025 2:21 PM, Roman Kisel wrote: > > [...] > > > > > > > > I can fix this when I commit the change . This patch will be folded into > > your old one anyway. > > > Nuno, thank you very much for spotting that! Wei, appreciate that! > Didn't mean to create more work for you, sorry about that. No problem at all. I'm happy to help. Wei. > > > Thanks, > > Wei. > > -- > Thank you, > Roman > >
© 2016 - 2026 Red Hat, Inc.