[PATCH v6 1/5] hyperv: Define struct hv_output_get_vp_registers

Roman Kisel posted 5 patches 1 year ago
[PATCH v6 1/5] hyperv: Define struct hv_output_get_vp_registers
Posted by Roman Kisel 1 year ago
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
Re: [PATCH v6 1/5] hyperv: Define struct hv_output_get_vp_registers
Posted by Nuno Das Neves 1 year ago
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)
Re: [PATCH v6 1/5] hyperv: Define struct hv_output_get_vp_registers
Posted by Wei Liu 1 year ago
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.
Re: [PATCH v6 1/5] hyperv: Define struct hv_output_get_vp_registers
Posted by Roman Kisel 1 year ago

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
Re: [PATCH v6 1/5] hyperv: Define struct hv_output_get_vp_registers
Posted by Wei Liu 1 year ago
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
> 
>