提交 5b423efe 编写于 作者: A Andrey Smetanin 提交者: Paolo Bonzini

drivers/hv: Move struct hv_message into UAPI Hyper-V x86 header

This struct is required for Hyper-V SynIC timers implementation inside KVM
and for upcoming Hyper-V VMBus support by userspace(QEMU). So place it into
Hyper-V UAPI header.
Signed-off-by: NAndrey Smetanin <asmetanin@virtuozzo.com>
Acked-by: NK. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: NRoman Kagan <rkagan@virtuozzo.com>
CC: Gleb Natapov <gleb@kernel.org>
CC: Paolo Bonzini <pbonzini@redhat.com>
CC: "K. Y. Srinivasan" <kys@microsoft.com>
CC: Haiyang Zhang <haiyangz@microsoft.com>
CC: Vitaly Kuznetsov <vkuznets@redhat.com>
CC: Roman Kagan <rkagan@virtuozzo.com>
CC: Denis V. Lunev <den@openvz.org>
CC: qemu-devel@nongnu.org
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
上级 4f39bcfd
...@@ -271,4 +271,80 @@ typedef struct _HV_REFERENCE_TSC_PAGE { ...@@ -271,4 +271,80 @@ typedef struct _HV_REFERENCE_TSC_PAGE {
#define HV_SYNIC_STIMER_COUNT (4) #define HV_SYNIC_STIMER_COUNT (4)
/* Define synthetic interrupt controller message constants. */
#define HV_MESSAGE_SIZE (256)
#define HV_MESSAGE_PAYLOAD_BYTE_COUNT (240)
#define HV_MESSAGE_PAYLOAD_QWORD_COUNT (30)
/* Define hypervisor message types. */
enum hv_message_type {
HVMSG_NONE = 0x00000000,
/* Memory access messages. */
HVMSG_UNMAPPED_GPA = 0x80000000,
HVMSG_GPA_INTERCEPT = 0x80000001,
/* Timer notification messages. */
HVMSG_TIMER_EXPIRED = 0x80000010,
/* Error messages. */
HVMSG_INVALID_VP_REGISTER_VALUE = 0x80000020,
HVMSG_UNRECOVERABLE_EXCEPTION = 0x80000021,
HVMSG_UNSUPPORTED_FEATURE = 0x80000022,
/* Trace buffer complete messages. */
HVMSG_EVENTLOG_BUFFERCOMPLETE = 0x80000040,
/* Platform-specific processor intercept messages. */
HVMSG_X64_IOPORT_INTERCEPT = 0x80010000,
HVMSG_X64_MSR_INTERCEPT = 0x80010001,
HVMSG_X64_CPUID_INTERCEPT = 0x80010002,
HVMSG_X64_EXCEPTION_INTERCEPT = 0x80010003,
HVMSG_X64_APIC_EOI = 0x80010004,
HVMSG_X64_LEGACY_FP_ERROR = 0x80010005
};
/* Define synthetic interrupt controller message flags. */
union hv_message_flags {
__u8 asu8;
struct {
__u8 msg_pending:1;
__u8 reserved:7;
};
};
/* Define port identifier type. */
union hv_port_id {
__u32 asu32;
struct {
__u32 id:24;
__u32 reserved:8;
} u;
};
/* Define synthetic interrupt controller message header. */
struct hv_message_header {
__u32 message_type;
__u8 payload_size;
union hv_message_flags message_flags;
__u8 reserved[2];
union {
__u64 sender;
union hv_port_id port;
};
};
/* Define synthetic interrupt controller message format. */
struct hv_message {
struct hv_message_header header;
union {
__u64 payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
} u;
};
/* Define the synthetic interrupt message page layout. */
struct hv_message_page {
struct hv_message sint_message[HV_SYNIC_SINT_COUNT];
};
#endif #endif
...@@ -63,10 +63,6 @@ enum hv_cpuid_function { ...@@ -63,10 +63,6 @@ enum hv_cpuid_function {
/* Define version of the synthetic interrupt controller. */ /* Define version of the synthetic interrupt controller. */
#define HV_SYNIC_VERSION (1) #define HV_SYNIC_VERSION (1)
/* Define synthetic interrupt controller message constants. */
#define HV_MESSAGE_SIZE (256)
#define HV_MESSAGE_PAYLOAD_BYTE_COUNT (240)
#define HV_MESSAGE_PAYLOAD_QWORD_COUNT (30)
#define HV_ANY_VP (0xFFFFFFFF) #define HV_ANY_VP (0xFFFFFFFF)
/* Define synthetic interrupt controller flag constants. */ /* Define synthetic interrupt controller flag constants. */
...@@ -74,46 +70,9 @@ enum hv_cpuid_function { ...@@ -74,46 +70,9 @@ enum hv_cpuid_function {
#define HV_EVENT_FLAGS_BYTE_COUNT (256) #define HV_EVENT_FLAGS_BYTE_COUNT (256)
#define HV_EVENT_FLAGS_DWORD_COUNT (256 / sizeof(u32)) #define HV_EVENT_FLAGS_DWORD_COUNT (256 / sizeof(u32))
/* Define hypervisor message types. */
enum hv_message_type {
HVMSG_NONE = 0x00000000,
/* Memory access messages. */
HVMSG_UNMAPPED_GPA = 0x80000000,
HVMSG_GPA_INTERCEPT = 0x80000001,
/* Timer notification messages. */
HVMSG_TIMER_EXPIRED = 0x80000010,
/* Error messages. */
HVMSG_INVALID_VP_REGISTER_VALUE = 0x80000020,
HVMSG_UNRECOVERABLE_EXCEPTION = 0x80000021,
HVMSG_UNSUPPORTED_FEATURE = 0x80000022,
/* Trace buffer complete messages. */
HVMSG_EVENTLOG_BUFFERCOMPLETE = 0x80000040,
/* Platform-specific processor intercept messages. */
HVMSG_X64_IOPORT_INTERCEPT = 0x80010000,
HVMSG_X64_MSR_INTERCEPT = 0x80010001,
HVMSG_X64_CPUID_INTERCEPT = 0x80010002,
HVMSG_X64_EXCEPTION_INTERCEPT = 0x80010003,
HVMSG_X64_APIC_EOI = 0x80010004,
HVMSG_X64_LEGACY_FP_ERROR = 0x80010005
};
/* Define invalid partition identifier. */ /* Define invalid partition identifier. */
#define HV_PARTITION_ID_INVALID ((u64)0x0) #define HV_PARTITION_ID_INVALID ((u64)0x0)
/* Define port identifier type. */
union hv_port_id {
u32 asu32;
struct {
u32 id:24;
u32 reserved:8;
} u ;
};
/* Define port type. */ /* Define port type. */
enum hv_port_type { enum hv_port_type {
HVPORT_MSG = 1, HVPORT_MSG = 1,
...@@ -161,27 +120,6 @@ struct hv_connection_info { ...@@ -161,27 +120,6 @@ struct hv_connection_info {
}; };
}; };
/* Define synthetic interrupt controller message flags. */
union hv_message_flags {
u8 asu8;
struct {
u8 msg_pending:1;
u8 reserved:7;
};
};
/* Define synthetic interrupt controller message header. */
struct hv_message_header {
u32 message_type;
u8 payload_size;
union hv_message_flags message_flags;
u8 reserved[2];
union {
u64 sender;
union hv_port_id port;
};
};
/* /*
* Timer configuration register. * Timer configuration register.
*/ */
...@@ -207,22 +145,9 @@ struct hv_timer_message_payload { ...@@ -207,22 +145,9 @@ struct hv_timer_message_payload {
u64 delivery_time; /* When the message was delivered */ u64 delivery_time; /* When the message was delivered */
}; };
/* Define synthetic interrupt controller message format. */
struct hv_message {
struct hv_message_header header;
union {
u64 payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
} u ;
};
/* Define the number of message buffers associated with each port. */ /* Define the number of message buffers associated with each port. */
#define HV_PORT_MESSAGE_BUFFER_COUNT (16) #define HV_PORT_MESSAGE_BUFFER_COUNT (16)
/* Define the synthetic interrupt message page layout. */
struct hv_message_page {
struct hv_message sint_message[HV_SYNIC_SINT_COUNT];
};
/* Define the synthetic interrupt controller event flags format. */ /* Define the synthetic interrupt controller event flags format. */
union hv_synic_event_flags { union hv_synic_event_flags {
u8 flags8[HV_EVENT_FLAGS_BYTE_COUNT]; u8 flags8[HV_EVENT_FLAGS_BYTE_COUNT];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册