Definition is intended to be used where bigtime_t is accepted and should be signed. Change-Id: I6ebe21c55ae47b0b4f46f0df655942b582759d51 Reviewed-on: https://review.haiku-os.org/c/haiku/+/10482 Reviewed-by: waddlesplash <[email protected]> Tested-by: Commit checker robot <[email protected]>
147 lines
4.6 KiB
C
147 lines
4.6 KiB
C
/*
|
|
* Copyright 2026 John Davis. All rights reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*/
|
|
#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)
|
|
|
|
|
|
// VMBus device types
|
|
#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;
|
|
|
|
|
|
// VMBus packet types
|
|
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))
|
|
|
|
|
|
// VMBus packet header
|
|
typedef struct {
|
|
uint16 type;
|
|
uint16 header_length;
|
|
uint16 total_length;
|
|
uint16 flags;
|
|
uint64 transaction_id;
|
|
} _PACKED vmbus_pkt_header;
|
|
|
|
|
|
// VMBus transfer range
|
|
// Describes a buffer within an existing defined buffer
|
|
typedef struct {
|
|
uint32 length;
|
|
uint32 offset;
|
|
} _PACKED vmbus_transfer_range;
|
|
|
|
|
|
// VMBus transfer ranges packet header
|
|
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;
|
|
|
|
|
|
// VMBus GPA (Guest Physical Address) range
|
|
// Describes a buffer made up of one or more physical pages in the guest
|
|
typedef struct {
|
|
uint32 length;
|
|
uint32 offset;
|
|
uint64 page_nums[];
|
|
} _PACKED vmbus_gpa_range;
|
|
|
|
|
|
// VMBus GPA packet header
|
|
typedef struct {
|
|
vmbus_pkt_header header;
|
|
|
|
uint32 reserved;
|
|
uint32 range_count;
|
|
vmbus_gpa_range ranges[];
|
|
} _PACKED vmbus_pkt_gpa_header;
|
|
|
|
|
|
#endif // _HYPERV_SPEC_H_
|