#ifndef _HYPERV_SPEC_H_
#define _HYPERV_SPEC_H_
#include <SupportDefs.h>
#define HV_PAGE_SIZE 4096
#define HV_PAGE_MASK (HV_PAGE_SIZE - 1)
#define HV_PAGE_SHIFT 12
#define HV_PAGE_ALIGN(x) (((x) + (HV_PAGE_SIZE - 1)) & ~(HV_PAGE_SIZE - 1))
#define HV_BYTES_TO_PAGES(x) (HV_PAGE_ALIGN(x) >> HV_PAGE_SHIFT)
#define HV_BYTES_TO_SPAN_PAGES(a, l) ((((l) - 1) >> HV_PAGE_SHIFT) \
+ (((((l) - 1) & HV_PAGE_MASK) + ((a) & HV_PAGE_MASK)) >> HV_PAGE_SHIFT) + 1);
#define HV_MS_TO_US(x) ((x) * 1000LL)
#define HV_STATIC_ASSERT(cond, msg) static_assert(cond, msg)
#define MAKE_VMBUS_VERSION(maj, min) ((((maj) << 16) & 0xFFFF0000) | ((min) & 0x0000FFFF))
#define GET_VMBUS_VERSION_MAJOR(ver) (((ver) >> 16) & 0xFFFF)
#define GET_VMBUS_VERSION_MINOR(ver) ((ver) & 0xFFFF)
#define VMBUS_VERSION_WS2008 MAKE_VMBUS_VERSION(0, 13)
#define VMBUS_VERSION_WS2008R2 MAKE_VMBUS_VERSION(1, 1)
#define VMBUS_VERSION_WIN8_WS2012 MAKE_VMBUS_VERSION(2, 4)
#define VMBUS_VERSION_WIN81_WS2012R2 MAKE_VMBUS_VERSION(3, 0)
#define VMBUS_VERSION_WIN10_RS1_WS2016 MAKE_VMBUS_VERSION(4, 0)
#define VMBUS_VERSION_WIN10_RS3 MAKE_VMBUS_VERSION(4, 1)
#define VMBUS_VERSION_WIN10_V5 MAKE_VMBUS_VERSION(5, 0)
#define VMBUS_VERSION_WIN10_RS4 MAKE_VMBUS_VERSION(5, 1)
#define VMBUS_VERSION_WIN10_RS5_WS2019 MAKE_VMBUS_VERSION(5, 2)
#define VMBUS_VERSION_WS2022 MAKE_VMBUS_VERSION(5, 3)
#define VMBUS_TYPE_AVMA "3375baf4-9e15-4b30-b765-67acb10d607b"
#define VMBUS_TYPE_BALLOON "525074dc-8985-46e2-8057-a307dc18a502"
#define VMBUS_TYPE_DISPLAY "da0a7802-e377-4aac-8e77-0558eb1073f8"
#define VMBUS_TYPE_FIBRECHANNEL "2f9bcc4a-0069-4af3-b76b-6fd0be528cda"
#define VMBUS_TYPE_FILECOPY "34d14be3-dee4-41c8-9ae7-6b174977c192"
#define VMBUS_TYPE_HEARTBEAT "57164f39-9115-4e78-ab55-382f3bd5422d"
#define VMBUS_TYPE_IDE "32412632-86cb-44a2-9b5c-50d1417354f5"
#define VMBUS_TYPE_INPUT "cfa8b69e-5b4a-4cc0-b98b-8ba1a1f3f95a"
#define VMBUS_TYPE_KEYBOARD "f912ad6d-2b17-48ea-bd65-f927a61c7684"
#define VMBUS_TYPE_KVP "a9a0f4e7-5a45-4d96-b827-8a841e8c03e6"
#define VMBUS_TYPE_NETWORK "f8615163-df3e-46c5-913f-f2d2f965ed0e"
#define VMBUS_TYPE_PCI "44c4f61d-4444-4400-9d52-802e27ede19f"
#define VMBUS_TYPE_RDCONTROL "f8e65716-3cb3-4a06-9a60-1889c5cccab5"
#define VMBUS_TYPE_RDMA "8c2eaf3d-32a7-4b09-ab99-bd1f1c86b501"
#define VMBUS_TYPE_RDVIRT "276aacf4-ac15-426c-98dd-7521ad3f01fe"
#define VMBUS_TYPE_SCSI "ba6163d9-04a1-4d29-b605-72e2ffb1dc7f"
#define VMBUS_TYPE_SHUTDOWN "0e0b6031-5213-4934-818b-38d90ced39db"
#define VMBUS_TYPE_TIMESYNC "9527e630-d0ae-497b-adce-e80ab0175caf"
#define VMBUS_TYPE_VSS "35fa2e29-ea23-4236-96ae-3a6ebacba440"
typedef struct {
uint32 data1;
uint16 data2;
uint16 data3;
uint8 data4[8];
} _PACKED vmbus_guid_t;
enum {
VMBUS_PKTTYPE_INVALID = 0,
VMBUS_PKTTYPE_SYNCH = 1,
VMBUS_PKTTYPE_ADD_TRANSFER_PAGESET = 2,
VMBUS_PKTTYPE_REMOVE_TRANSFER_PAGESET = 3,
VMBUS_PKTTYPE_CREATE_GPADL = 4,
VMBUS_PKTTYPE_FREE_GPADL = 5,
VMBUS_PKTTYPE_DATA_INBAND = 6,
VMBUS_PKTTYPE_DATA_USING_TRANSFER_PAGES = 7,
VMBUS_PKTTYPE_DATA_USING_GPADL = 8,
VMBUS_PKTTYPE_DATA_USING_GPA_DIRECT = 9,
VMBUS_PKTTYPE_CANCEL_REQUEST = 10,
VMBUS_PKTTYPE_COMPLETION = 11,
VMBUS_PKTTYPE_DATA_USING_ADDT_PKT = 12,
VMBUS_PKTTYPE_ADDT_DATA = 13,
VMBUS_PKTTYPE_MAX
};
#define VMBUS_PKT_FLAGS_RESPONSE_REQUIRED (1 << 0)
#define VMBUS_PKT_SIZE_SHIFT 3
#define VMBUS_PKT_ALIGN(x) (((x) + (sizeof(uint64) - 1)) &~ (sizeof(uint64) - 1))
typedef struct {
uint16 type;
uint16 header_length;
uint16 total_length;
uint16 flags;
uint64 transaction_id;
} _PACKED vmbus_pkt_header;
typedef struct {
uint32 length;
uint32 offset;
} _PACKED vmbus_transfer_range;
typedef struct {
vmbus_pkt_header header;
uint16 transfer_pageset_id;
uint8 sender_owns_sets;
uint8 reserved;
uint32 range_count;
vmbus_transfer_range ranges[];
} _PACKED vmbus_pkt_transfer_header;
typedef struct {
uint32 length;
uint32 offset;
uint64 page_nums[];
} _PACKED vmbus_gpa_range;
typedef struct {
vmbus_pkt_header header;
uint32 reserved;
uint32 range_count;
vmbus_gpa_range ranges[];
} _PACKED vmbus_pkt_gpa_header;
#endif