 973b1fbd86
			
		
	
	
		973b1fbd86
		
	
	
	
	
		
			
			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>
		
			
				
	
	
		
			223 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			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
 |