qemu/include/hw/hyperv/vmbus-proto.h
Jon Doron 973b1fbd86 vmbus: add vmbus protocol definitions
Add a header with data structures and constants used in Hyper-V VMBus
hypervisor <-> guest interactions.

Based on the respective stuff from Linux kernel.

Signed-off-by: Roman Kagan <rkagan@virtuozzo.com>
Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
Signed-off-by: Jon Doron <arilou@gmail.com>
Message-Id: <20200424123444.3481728-3-arilou@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2020-06-10 12:09:39 -04:00

223 lines
6.8 KiB
C

/*
* QEMU Hyper-V VMBus support
*
* Copyright (c) 2017-2018 Virtuozzo International GmbH.
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
*/
#ifndef HW_HYPERV_VMBUS_PROTO_H
#define HW_HYPERV_VMBUS_PROTO_H
#define VMBUS_VERSION_WS2008 ((0 << 16) | (13))
#define VMBUS_VERSION_WIN7 ((1 << 16) | (1))
#define VMBUS_VERSION_WIN8 ((2 << 16) | (4))
#define VMBUS_VERSION_WIN8_1 ((3 << 16) | (0))
#define VMBUS_VERSION_WIN10 ((4 << 16) | (0))
#define VMBUS_VERSION_INVAL -1
#define VMBUS_VERSION_CURRENT VMBUS_VERSION_WIN10
#define VMBUS_MESSAGE_CONNECTION_ID 1
#define VMBUS_EVENT_CONNECTION_ID 2
#define VMBUS_MONITOR_CONNECTION_ID 3
#define VMBUS_SINT 2
#define VMBUS_MSG_INVALID 0
#define VMBUS_MSG_OFFERCHANNEL 1
#define VMBUS_MSG_RESCIND_CHANNELOFFER 2
#define VMBUS_MSG_REQUESTOFFERS 3
#define VMBUS_MSG_ALLOFFERS_DELIVERED 4
#define VMBUS_MSG_OPENCHANNEL 5
#define VMBUS_MSG_OPENCHANNEL_RESULT 6
#define VMBUS_MSG_CLOSECHANNEL 7
#define VMBUS_MSG_GPADL_HEADER 8
#define VMBUS_MSG_GPADL_BODY 9
#define VMBUS_MSG_GPADL_CREATED 10
#define VMBUS_MSG_GPADL_TEARDOWN 11
#define VMBUS_MSG_GPADL_TORNDOWN 12
#define VMBUS_MSG_RELID_RELEASED 13
#define VMBUS_MSG_INITIATE_CONTACT 14
#define VMBUS_MSG_VERSION_RESPONSE 15
#define VMBUS_MSG_UNLOAD 16
#define VMBUS_MSG_UNLOAD_RESPONSE 17
#define VMBUS_MSG_COUNT 18
#define VMBUS_MESSAGE_SIZE_ALIGN sizeof(uint64_t)
#define VMBUS_PACKET_INVALID 0x0
#define VMBUS_PACKET_SYNCH 0x1
#define VMBUS_PACKET_ADD_XFER_PAGESET 0x2
#define VMBUS_PACKET_RM_XFER_PAGESET 0x3
#define VMBUS_PACKET_ESTABLISH_GPADL 0x4
#define VMBUS_PACKET_TEARDOWN_GPADL 0x5
#define VMBUS_PACKET_DATA_INBAND 0x6
#define VMBUS_PACKET_DATA_USING_XFER_PAGES 0x7
#define VMBUS_PACKET_DATA_USING_GPADL 0x8
#define VMBUS_PACKET_DATA_USING_GPA_DIRECT 0x9
#define VMBUS_PACKET_CANCEL_REQUEST 0xa
#define VMBUS_PACKET_COMP 0xb
#define VMBUS_PACKET_DATA_USING_ADDITIONAL_PKT 0xc
#define VMBUS_PACKET_ADDITIONAL_DATA 0xd
#define VMBUS_CHANNEL_USER_DATA_SIZE 120
#define VMBUS_OFFER_MONITOR_ALLOCATED 0x1
#define VMBUS_OFFER_INTERRUPT_DEDICATED 0x1
#define VMBUS_RING_BUFFER_FEAT_PENDING_SZ (1ul << 0)
#define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 0x1
#define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES 0x2
#define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS 0x4
#define VMBUS_CHANNEL_NAMED_PIPE_MODE 0x10
#define VMBUS_CHANNEL_LOOPBACK_OFFER 0x100
#define VMBUS_CHANNEL_PARENT_OFFER 0x200
#define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION 0x400
#define VMBUS_CHANNEL_TLNPI_PROVIDER_OFFER 0x2000
#define VMBUS_PACKET_FLAG_REQUEST_COMPLETION 1
typedef struct vmbus_message_header {
uint32_t message_type;
uint32_t _padding;
} vmbus_message_header;
typedef struct vmbus_message_initiate_contact {
vmbus_message_header header;
uint32_t version_requested;
uint32_t target_vcpu;
uint64_t interrupt_page;
uint64_t monitor_page1;
uint64_t monitor_page2;
} vmbus_message_initiate_contact;
typedef struct vmbus_message_version_response {
vmbus_message_header header;
uint8_t version_supported;
uint8_t status;
} vmbus_message_version_response;
typedef struct vmbus_message_offer_channel {
vmbus_message_header header;
uint8_t type_uuid[16];
uint8_t instance_uuid[16];
uint64_t _reserved1;
uint64_t _reserved2;
uint16_t channel_flags;
uint16_t mmio_size_mb;
uint8_t user_data[VMBUS_CHANNEL_USER_DATA_SIZE];
uint16_t sub_channel_index;
uint16_t _reserved3;
uint32_t child_relid;
uint8_t monitor_id;
uint8_t monitor_flags;
uint16_t interrupt_flags;
uint32_t connection_id;
} vmbus_message_offer_channel;
typedef struct vmbus_message_rescind_channel_offer {
vmbus_message_header header;
uint32_t child_relid;
} vmbus_message_rescind_channel_offer;
typedef struct vmbus_gpa_range {
uint32_t byte_count;
uint32_t byte_offset;
uint64_t pfn_array[];
} vmbus_gpa_range;
typedef struct vmbus_message_gpadl_header {
vmbus_message_header header;
uint32_t child_relid;
uint32_t gpadl_id;
uint16_t range_buflen;
uint16_t rangecount;
vmbus_gpa_range range[];
} QEMU_PACKED vmbus_message_gpadl_header;
typedef struct vmbus_message_gpadl_body {
vmbus_message_header header;
uint32_t message_number;
uint32_t gpadl_id;
uint64_t pfn_array[];
} vmbus_message_gpadl_body;
typedef struct vmbus_message_gpadl_created {
vmbus_message_header header;
uint32_t child_relid;
uint32_t gpadl_id;
uint32_t status;
} vmbus_message_gpadl_created;
typedef struct vmbus_message_gpadl_teardown {
vmbus_message_header header;
uint32_t child_relid;
uint32_t gpadl_id;
} vmbus_message_gpadl_teardown;
typedef struct vmbus_message_gpadl_torndown {
vmbus_message_header header;
uint32_t gpadl_id;
} vmbus_message_gpadl_torndown;
typedef struct vmbus_message_open_channel {
vmbus_message_header header;
uint32_t child_relid;
uint32_t open_id;
uint32_t ring_buffer_gpadl_id;
uint32_t target_vp;
uint32_t ring_buffer_offset;
uint8_t user_data[VMBUS_CHANNEL_USER_DATA_SIZE];
} vmbus_message_open_channel;
typedef struct vmbus_message_open_result {
vmbus_message_header header;
uint32_t child_relid;
uint32_t open_id;
uint32_t status;
} vmbus_message_open_result;
typedef struct vmbus_message_close_channel {
vmbus_message_header header;
uint32_t child_relid;
} vmbus_message_close_channel;
typedef struct vmbus_ring_buffer {
uint32_t write_index;
uint32_t read_index;
uint32_t interrupt_mask;
uint32_t pending_send_sz;
uint32_t _reserved1[12];
uint32_t feature_bits;
} vmbus_ring_buffer;
typedef struct vmbus_packet_hdr {
uint16_t type;
uint16_t offset_qwords;
uint16_t len_qwords;
uint16_t flags;
uint64_t transaction_id;
} vmbus_packet_hdr;
typedef struct vmbus_pkt_gpa_direct {
uint32_t _reserved;
uint32_t rangecount;
vmbus_gpa_range range[];
} vmbus_pkt_gpa_direct;
typedef struct vmbus_xferpg_range {
uint32_t byte_count;
uint32_t byte_offset;
} vmbus_xferpg_range;
typedef struct vmbus_pkt_xferpg {
uint16_t buffer_id;
uint8_t sender_owns_set;
uint8_t _reserved;
uint32_t rangecount;
vmbus_xferpg_range range[];
} vmbus_pkt_xferpg;
#endif