On 12/26/2024 1:31 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 <rom...@linux.microsoft.com>
> ---
>  include/hyperv/hvgdk_mini.h | 58 +++++++++++++++++++++++++++++++++++--
>  1 file changed, 56 insertions(+), 2 deletions(-)
> 
>       struct {
> @@ -1091,6 +1130,8 @@ union hv_x64_pending_interruption_register {
>       } __packed;
>  };
>  
> +#endif
> +
>  union hv_register_value {
>       struct hv_u128 reg128;
>       u64 reg64;
> @@ -1098,13 +1139,26 @@ union hv_register_value {
>       u16 reg16;
>       u8 reg8;
>  
> -     struct hv_x64_segment_register segment;
> -     struct hv_x64_table_register table;
>       union hv_explicit_suspend_register explicit_suspend;
>       union hv_intercept_suspend_register intercept_suspend;
>       union hv_dispatch_suspend_register dispatch_suspend;
> +#if defined(CONFIG_X86)
> +     struct hv_x64_segment_register segment;
> +     struct hv_x64_table_register table;
>       union hv_x64_interrupt_state_register interrupt_state;
>       union hv_x64_pending_interruption_register pending_interruption;
> +#elif defined(CONFIG_ARM64)
> +     union hv_arm64_pending_interruption_register pending_interruption;
> +     union hv_arm64_interrupt_state_register interrupt_state;
> +     union hv_arm64_pending_synthetic_exception_event 
> pending_synthetic_exception_event;
> +#else
> +     #error "This architecture is not supported"
> +#endif
> +};

I don't love the #error for unsupported architectures when Kconfig takes
care of that for us, but I suppose it's for completeness since the arm64
members have to be conditioned on CONFIG_ARM64?

> +
> +/* NOTE: Linux helper struct - NOT from Hyper-V code */
> +struct hv_output_get_vp_registers {
> +     DECLARE_FLEX_ARRAY(union hv_register_value, values);
>  };

I'm not super familiar with DECLARE_FLEX_ARRAY() but it appears this
needs to be wrapped in an anonymous struct at the least per this comment
for the definition of DECLARE_FLEX_ARRAY()

> * In order to have a flexible array member [...] alone in a
> * struct, it needs to be wrapped in an anonymous struct with at least 1
> * named member, but that member can be empty.

Nuno, since you seem to be more familiar, can you provide some guidance?

Thanks,
Easwar

Reply via email to