include/hw/hyperv/hvgdk_mini.h | 37 ++++++++++++++++++++++------------ include/hw/hyperv/hvhdk.h | 14 +++++++------ 2 files changed, 32 insertions(+), 19 deletions(-)
The uapi definitions are marked with __packed hints in the kernel
headers, since we want to keep the contract of the Microsoft Hypervisor
ABI explicit, we should also added them in our vendored files, with a
few notable exceptions where the attribute is a noop.
Signed-off-by: Magnus Kulke <magnuskulke@linux.microsoft.com>
---
include/hw/hyperv/hvgdk_mini.h | 37 ++++++++++++++++++++++------------
include/hw/hyperv/hvhdk.h | 14 +++++++------
2 files changed, 32 insertions(+), 19 deletions(-)
diff --git a/include/hw/hyperv/hvgdk_mini.h b/include/hw/hyperv/hvgdk_mini.h
index cb52cc9de2..7d7b2e9b36 100644
--- a/include/hw/hyperv/hvgdk_mini.h
+++ b/include/hw/hyperv/hvgdk_mini.h
@@ -7,6 +7,8 @@
#ifndef HW_HYPERV_HVGDK_MINI_H
#define HW_HYPERV_HVGDK_MINI_H
+#include "qemu/compiler.h"
+
#define MSHV_IOCTL 0xB8
typedef enum hv_register_name {
@@ -211,7 +213,7 @@ enum hv_intercept_type {
struct hv_u128 {
uint64_t low_part;
uint64_t high_part;
-};
+} QEMU_PACKED;
union hv_x64_xmm_control_status_register {
struct hv_u128 as_uint128;
@@ -326,13 +328,13 @@ typedef struct hv_x64_segment_register {
};
uint16_t attributes;
};
-} hv_x64_segment_register;
+} QEMU_PACKED hv_x64_segment_register;
typedef struct hv_x64_table_register {
uint16_t pad[3];
uint16_t limit;
uint64_t base;
-} hv_x64_table_register;
+} QEMU_PACKED hv_x64_table_register;
union hv_x64_fp_control_status_register {
struct hv_u128 as_uint128;
@@ -416,6 +418,10 @@ typedef union hv_register_value {
union hv_x64_register_sev_control sev_control;
} hv_register_value;
+/*
+ * This struct is __packed in the kernel. Since all members are naturally
+ * aligned, we can omit QEMU_PACKED to avoid address-of-packed-member warnings.
+ */
typedef struct hv_register_assoc {
uint32_t name; /* enum hv_register_name */
uint32_t reserved1;
@@ -439,7 +445,7 @@ typedef struct hv_input_get_vp_registers {
uint8_t rsvd_z8;
uint16_t rsvd_z16;
uint32_t names[];
-} hv_input_get_vp_registers;
+} QEMU_PACKED hv_input_get_vp_registers;
typedef struct hv_input_set_vp_registers {
uint64_t partition_id;
@@ -448,7 +454,7 @@ typedef struct hv_input_set_vp_registers {
uint8_t rsvd_z8;
uint16_t rsvd_z16;
struct hv_register_assoc elements[];
-} hv_input_set_vp_registers;
+} QEMU_PACKED hv_input_set_vp_registers;
union hv_interrupt_control {
uint64_t as_uint64;
@@ -468,7 +474,7 @@ struct hv_input_assert_virtual_interrupt {
uint8_t target_vtl;
uint8_t rsvd_z0;
uint16_t rsvd_z1;
-};
+} QEMU_PACKED;
/* /dev/mshv */
#define MSHV_CREATE_PARTITION _IOW(MSHV_IOCTL, 0x00, struct mshv_create_partition)
@@ -487,6 +493,11 @@ struct hv_input_assert_virtual_interrupt {
********************************
*/
+/*
+ * This struct is __packed in the kernel, but since all members are naturally
+ * aligned, so we can omit QEMU_PACKED to avoid address-of-packed-member
+ * warnings.
+ */
struct hv_local_interrupt_controller_state {
/* HV_X64_INTERRUPT_CONTROLLER_STATE */
uint32_t apic_id;
@@ -644,7 +655,7 @@ struct hv_x64_intercept_message_header {
struct hv_x64_segment_register cs_segment;
uint64_t rip;
uint64_t rflags;
-};
+} QEMU_PACKED;
union hv_x64_io_port_access_info {
uint8_t as_uint8;
@@ -669,7 +680,7 @@ typedef struct hv_x64_io_port_intercept_message {
uint64_t rcx;
uint64_t rsi;
uint64_t rdi;
-} hv_x64_io_port_intercept_message;
+} QEMU_PACKED hv_x64_io_port_intercept_message;
union hv_x64_memory_access_info {
uint8_t as_uint8;
@@ -692,7 +703,7 @@ struct hv_x64_memory_intercept_message {
uint64_t guest_virtual_address;
uint64_t guest_physical_address;
uint8_t instruction_bytes[16];
-};
+} QEMU_PACKED;
union hv_message_flags {
uint8_t asu8;
@@ -711,14 +722,14 @@ struct hv_message_header {
uint64_t sender;
union hv_port_id port;
};
-};
+} QEMU_PACKED;
struct hv_message {
struct hv_message_header header;
union {
uint64_t payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
} u;
-};
+} QEMU_PACKED;
/* From github.com/rust-vmm/mshv-bindings/src/x86_64/regs.rs */
@@ -731,13 +742,13 @@ struct hv_cpuid_entry {
uint32_t ecx;
uint32_t edx;
uint32_t padding[3];
-};
+} QEMU_PACKED;
struct hv_cpuid {
uint32_t nent;
uint32_t padding;
struct hv_cpuid_entry entries[0];
-};
+} QEMU_PACKED;
#define IA32_MSR_TSC 0x00000010
#define IA32_MSR_EFER 0xC0000080
diff --git a/include/hw/hyperv/hvhdk.h b/include/hw/hyperv/hvhdk.h
index 866c8211bf..bf2f8cbc27 100644
--- a/include/hw/hyperv/hvhdk.h
+++ b/include/hw/hyperv/hvhdk.h
@@ -9,6 +9,8 @@
#ifndef HW_HYPERV_HVHDK_H
#define HW_HYPERV_HVHDK_H
+#include "qemu/compiler.h"
+
#define HV_PARTITION_SYNTHETIC_PROCESSOR_FEATURES_BANKS 1
struct hv_input_set_partition_property {
@@ -16,7 +18,7 @@ struct hv_input_set_partition_property {
uint32_t property_code; /* enum hv_partition_property_code */
uint32_t padding;
uint64_t property_value;
-};
+} QEMU_PACKED;
union hv_partition_synthetic_processor_features {
uint64_t as_uint64[HV_PARTITION_SYNTHETIC_PROCESSOR_FEATURES_BANKS];
@@ -201,12 +203,12 @@ typedef struct hv_input_translate_virtual_address {
uint32_t padding;
uint64_t control_flags;
uint64_t gva_page;
-} hv_input_translate_virtual_address;
+} QEMU_PACKED hv_input_translate_virtual_address;
typedef struct hv_output_translate_virtual_address {
union hv_translate_gva_result translation_result;
uint64_t gpa_page;
-} hv_output_translate_virtual_address;
+} QEMU_PACKED hv_output_translate_virtual_address;
typedef struct hv_register_x64_cpuid_result_parameters {
struct {
@@ -226,13 +228,13 @@ typedef struct hv_register_x64_cpuid_result_parameters {
uint32_t edx;
uint32_t edx_mask;
} result;
-} hv_register_x64_cpuid_result_parameters;
+} QEMU_PACKED hv_register_x64_cpuid_result_parameters;
typedef struct hv_register_x64_msr_result_parameters {
uint32_t msr_index;
uint32_t access_type;
uint32_t action; /* enum hv_unimplemented_msr_action */
-} hv_register_x64_msr_result_parameters;
+} QEMU_PACKED hv_register_x64_msr_result_parameters;
union hv_register_intercept_result_parameters {
struct hv_register_x64_cpuid_result_parameters cpuid;
@@ -244,6 +246,6 @@ typedef struct hv_input_register_intercept_result {
uint32_t vp_index;
uint32_t intercept_type; /* enum hv_intercept_type */
union hv_register_intercept_result_parameters parameters;
-} hv_input_register_intercept_result;
+} QEMU_PACKED hv_input_register_intercept_result;
#endif /* HW_HYPERV_HVHDK_H */
--
2.34.1
On Mon, 23 Mar 2026 at 12:06, Magnus Kulke <magnuskulke@linux.microsoft.com> wrote: > > The uapi definitions are marked with __packed hints in the kernel > headers, since we want to keep the contract of the Microsoft Hypervisor > ABI explicit, we should also added them in our vendored files, with a > few notable exceptions where the attribute is a noop. > > Signed-off-by: Magnus Kulke <magnuskulke@linux.microsoft.com> > --- > include/hw/hyperv/hvgdk_mini.h | 37 ++++++++++++++++++++++------------ > include/hw/hyperv/hvhdk.h | 14 +++++++------ > 2 files changed, 32 insertions(+), 19 deletions(-) > > diff --git a/include/hw/hyperv/hvgdk_mini.h b/include/hw/hyperv/hvgdk_mini.h > index cb52cc9de2..7d7b2e9b36 100644 > --- a/include/hw/hyperv/hvgdk_mini.h > +++ b/include/hw/hyperv/hvgdk_mini.h > @@ -7,6 +7,8 @@ > #ifndef HW_HYPERV_HVGDK_MINI_H > #define HW_HYPERV_HVGDK_MINI_H > > +#include "qemu/compiler.h" osdep.h includes compiler.h, so it is always present for all C files; you don't need to explicitly include it. thanks -- PMM
On 23/3/26 13:39, Peter Maydell wrote: > On Mon, 23 Mar 2026 at 12:06, Magnus Kulke > <magnuskulke@linux.microsoft.com> wrote: >> >> The uapi definitions are marked with __packed hints in the kernel >> headers, since we want to keep the contract of the Microsoft Hypervisor >> ABI explicit, we should also added them in our vendored files, with a >> few notable exceptions where the attribute is a noop. >> >> Signed-off-by: Magnus Kulke <magnuskulke@linux.microsoft.com> >> --- >> include/hw/hyperv/hvgdk_mini.h | 37 ++++++++++++++++++++++------------ >> include/hw/hyperv/hvhdk.h | 14 +++++++------ >> 2 files changed, 32 insertions(+), 19 deletions(-) >> >> diff --git a/include/hw/hyperv/hvgdk_mini.h b/include/hw/hyperv/hvgdk_mini.h >> index cb52cc9de2..7d7b2e9b36 100644 >> --- a/include/hw/hyperv/hvgdk_mini.h >> +++ b/include/hw/hyperv/hvgdk_mini.h >> @@ -7,6 +7,8 @@ >> #ifndef HW_HYPERV_HVGDK_MINI_H >> #define HW_HYPERV_HVGDK_MINI_H >> >> +#include "qemu/compiler.h" > > osdep.h includes compiler.h, so it is always present for all C > files; you don't need to explicitly include it. Taken care of while queuing, thanks.
On 23/3/26 13:06, Magnus Kulke wrote: > The uapi definitions are marked with __packed hints in the kernel > headers, since we want to keep the contract of the Microsoft Hypervisor > ABI explicit, we should also added them in our vendored files, with a > few notable exceptions where the attribute is a noop. > > Signed-off-by: Magnus Kulke <magnuskulke@linux.microsoft.com> > --- > include/hw/hyperv/hvgdk_mini.h | 37 ++++++++++++++++++++++------------ > include/hw/hyperv/hvhdk.h | 14 +++++++------ > 2 files changed, 32 insertions(+), 19 deletions(-) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
© 2016 - 2026 Red Hat, Inc.