mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-05 07:26:48 +07:00
Staging: hv: add the Hyper-V api header files
These are the header files for the API to talk to the Hyper-V core. Signed-off-by: Hank Janssen <hjanssen@microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
578f2938a4
commit
565e7dc81d
312
drivers/staging/hv/include/ChannelMessages.h
Normal file
312
drivers/staging/hv/include/ChannelMessages.h
Normal file
@ -0,0 +1,312 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <VmbusPacketFormat.h>
|
||||
|
||||
#define C_ASSERT(x)
|
||||
typedef UINT32 NTSTATUS;
|
||||
|
||||
#pragma pack(push,1)
|
||||
|
||||
//
|
||||
// Version 1 messages
|
||||
//
|
||||
|
||||
typedef enum _VMBUS_CHANNEL_MESSAGE_TYPE
|
||||
{
|
||||
ChannelMessageInvalid = 0,
|
||||
ChannelMessageOfferChannel = 1,
|
||||
ChannelMessageRescindChannelOffer = 2,
|
||||
ChannelMessageRequestOffers = 3,
|
||||
ChannelMessageAllOffersDelivered = 4,
|
||||
ChannelMessageOpenChannel = 5,
|
||||
ChannelMessageOpenChannelResult = 6,
|
||||
ChannelMessageCloseChannel = 7,
|
||||
ChannelMessageGpadlHeader = 8,
|
||||
ChannelMessageGpadlBody = 9,
|
||||
ChannelMessageGpadlCreated = 10,
|
||||
ChannelMessageGpadlTeardown = 11,
|
||||
ChannelMessageGpadlTorndown = 12,
|
||||
ChannelMessageRelIdReleased = 13,
|
||||
ChannelMessageInitiateContact = 14,
|
||||
ChannelMessageVersionResponse = 15,
|
||||
ChannelMessageUnload = 16,
|
||||
#ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD
|
||||
ChannelMessageViewRangeAdd = 17,
|
||||
ChannelMessageViewRangeRemove = 18,
|
||||
#endif
|
||||
ChannelMessageCount
|
||||
} VMBUS_CHANNEL_MESSAGE_TYPE, *PVMBUS_CHANNEL_MESSAGE_TYPE;
|
||||
|
||||
// begin_wpp config
|
||||
// CUSTOM_TYPE(ChannelMessageType, ItemEnum(_VMBUS_CHANNEL_MESSAGE_TYPE));
|
||||
// end_wpp
|
||||
|
||||
typedef struct _VMBUS_CHANNEL_MESSAGE_HEADER
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_TYPE MessageType;
|
||||
UINT32 Padding;
|
||||
} VMBUS_CHANNEL_MESSAGE_HEADER, *PVMBUS_CHANNEL_MESSAGE_HEADER;
|
||||
|
||||
// Query VMBus Version parameters
|
||||
typedef struct _VMBUS_CHANNEL_QUERY_VMBUS_VERSION
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
UINT32 Version;
|
||||
} VMBUS_CHANNEL_QUERY_VMBUS_VERSION, *PVMBUS_CHANNEL_QUERY_VMBUS_VERSION;
|
||||
|
||||
// VMBus Version Supported parameters
|
||||
typedef struct _VMBUS_CHANNEL_VERSION_SUPPORTED
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
BOOLEAN VersionSupported;
|
||||
} VMBUS_CHANNEL_VERSION_SUPPORTED, *PVMBUS_CHANNEL_VERSION_SUPPORTED;
|
||||
|
||||
// Offer Channel parameters
|
||||
typedef struct _VMBUS_CHANNEL_OFFER_CHANNEL
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
VMBUS_CHANNEL_OFFER Offer;
|
||||
UINT32 ChildRelId;
|
||||
UINT8 MonitorId;
|
||||
BOOLEAN MonitorAllocated;
|
||||
} VMBUS_CHANNEL_OFFER_CHANNEL, *PVMBUS_CHANNEL_OFFER_CHANNEL;
|
||||
|
||||
//
|
||||
// Make sure VMBUS_CHANNEL_OFFER_CHANNEL fits into Synic message.
|
||||
//
|
||||
C_ASSERT(sizeof(VMBUS_CHANNEL_OFFER_CHANNEL) <= MAXIMUM_SYNIC_MESSAGE_BYTES);
|
||||
|
||||
// Rescind Offer parameters
|
||||
typedef struct _VMBUS_CHANNEL_RESCIND_OFFER
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
UINT32 ChildRelId;
|
||||
} VMBUS_CHANNEL_RESCIND_OFFER, *PVMBUS_CHANNEL_RESCIND_OFFER;
|
||||
|
||||
// Request Offer -- no parameters, SynIC message contains the partition ID
|
||||
// Set Snoop -- no parameters, SynIC message contains the partition ID
|
||||
// Clear Snoop -- no parameters, SynIC message contains the partition ID
|
||||
// All Offers Delivered -- no parameters, SynIC message contains the partition ID
|
||||
// Flush Client -- no parameters, SynIC message contains the partition ID
|
||||
|
||||
// Open Channel parameters
|
||||
typedef struct _VMBUS_CHANNEL_OPEN_CHANNEL
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
|
||||
//
|
||||
// Identifies the specific VMBus channel that is being opened.
|
||||
//
|
||||
UINT32 ChildRelId;
|
||||
|
||||
//
|
||||
// ID making a particular open request at a channel offer unique.
|
||||
//
|
||||
UINT32 OpenId;
|
||||
|
||||
//
|
||||
// GPADL for the channel's ring buffer.
|
||||
//
|
||||
GPADL_HANDLE RingBufferGpadlHandle;
|
||||
|
||||
//
|
||||
// GPADL for the channel's server context save area.
|
||||
//
|
||||
GPADL_HANDLE ServerContextAreaGpadlHandle;
|
||||
|
||||
//
|
||||
// The upstream ring buffer begins at offset zero in the memory described
|
||||
// by RingBufferGpadlHandle. The downstream ring buffer follows it at this
|
||||
// offset (in pages).
|
||||
//
|
||||
UINT32 DownstreamRingBufferPageOffset;
|
||||
|
||||
//
|
||||
// User-specific data to be passed along to the server endpoint.
|
||||
//
|
||||
UCHAR UserData[MAX_USER_DEFINED_BYTES];
|
||||
|
||||
} VMBUS_CHANNEL_OPEN_CHANNEL, *PVMBUS_CHANNEL_OPEN_CHANNEL;
|
||||
|
||||
// Reopen Channel parameters;
|
||||
typedef VMBUS_CHANNEL_OPEN_CHANNEL VMBUS_CHANNEL_REOPEN_CHANNEL, *PVMBUS_CHANNEL_REOPEN_CHANNEL;
|
||||
|
||||
// Open Channel Result parameters
|
||||
typedef struct _VMBUS_CHANNEL_OPEN_RESULT
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
UINT32 ChildRelId;
|
||||
UINT32 OpenId;
|
||||
NTSTATUS Status;
|
||||
} VMBUS_CHANNEL_OPEN_RESULT, *PVMBUS_CHANNEL_OPEN_RESULT;
|
||||
|
||||
// Close channel parameters;
|
||||
typedef struct _VMBUS_CHANNEL_CLOSE_CHANNEL
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
UINT32 ChildRelId;
|
||||
} VMBUS_CHANNEL_CLOSE_CHANNEL, *PVMBUS_CHANNEL_CLOSE_CHANNEL;
|
||||
|
||||
// Channel Message GPADL
|
||||
#define GPADL_TYPE_RING_BUFFER 1
|
||||
#define GPADL_TYPE_SERVER_SAVE_AREA 2
|
||||
#define GPADL_TYPE_TRANSACTION 8
|
||||
|
||||
//
|
||||
// The number of PFNs in a GPADL message is defined by the number of pages
|
||||
// that would be spanned by ByteCount and ByteOffset. If the implied number
|
||||
// of PFNs won't fit in this packet, there will be a follow-up packet that
|
||||
// contains more.
|
||||
//
|
||||
|
||||
typedef struct _VMBUS_CHANNEL_GPADL_HEADER
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
UINT32 ChildRelId;
|
||||
UINT32 Gpadl;
|
||||
UINT16 RangeBufLen;
|
||||
UINT16 RangeCount;
|
||||
GPA_RANGE Range[0];
|
||||
} VMBUS_CHANNEL_GPADL_HEADER, *PVMBUS_CHANNEL_GPADL_HEADER;
|
||||
|
||||
|
||||
//
|
||||
// This is the followup packet that contains more PFNs.
|
||||
//
|
||||
|
||||
typedef struct _VMBUS_CHANNEL_GPADL_BODY
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
UINT32 MessageNumber;
|
||||
UINT32 Gpadl;
|
||||
UINT64 Pfn[0];
|
||||
} VMBUS_CHANNEL_GPADL_BODY, *PVMBUS_CHANNEL_GPADL_BODY;
|
||||
|
||||
|
||||
typedef struct _VMBUS_CHANNEL_GPADL_CREATED
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
UINT32 ChildRelId;
|
||||
UINT32 Gpadl;
|
||||
UINT32 CreationStatus;
|
||||
} VMBUS_CHANNEL_GPADL_CREATED, *PVMBUS_CHANNEL_GPADL_CREATED;
|
||||
|
||||
typedef struct _VMBUS_CHANNEL_GPADL_TEARDOWN
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
UINT32 ChildRelId;
|
||||
UINT32 Gpadl;
|
||||
} VMBUS_CHANNEL_GPADL_TEARDOWN, *PVMBUS_CHANNEL_GPADL_TEARDOWN;
|
||||
|
||||
typedef struct _VMBUS_CHANNEL_GPADL_TORNDOWN
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
UINT32 Gpadl;
|
||||
} VMBUS_CHANNEL_GPADL_TORNDOWN, *PVMBUS_CHANNEL_GPADL_TORNDOWN;
|
||||
|
||||
#ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD
|
||||
typedef struct _VMBUS_CHANNEL_VIEW_RANGE_ADD
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
PHYSICAL_ADDRESS ViewRangeBase;
|
||||
UINT64 ViewRangeLength;
|
||||
UINT32 ChildRelId;
|
||||
} VMBUS_CHANNEL_VIEW_RANGE_ADD, *PVMBUS_CHANNEL_VIEW_RANGE_ADD;
|
||||
|
||||
typedef struct _VMBUS_CHANNEL_VIEW_RANGE_REMOVE
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
PHYSICAL_ADDRESS ViewRangeBase;
|
||||
UINT32 ChildRelId;
|
||||
} VMBUS_CHANNEL_VIEW_RANGE_REMOVE, *PVMBUS_CHANNEL_VIEW_RANGE_REMOVE;
|
||||
#endif
|
||||
|
||||
typedef struct _VMBUS_CHANNEL_RELID_RELEASED
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
UINT32 ChildRelId;
|
||||
} VMBUS_CHANNEL_RELID_RELEASED, *PVMBUS_CHANNEL_RELID_RELEASED;
|
||||
|
||||
typedef struct _VMBUS_CHANNEL_INITIATE_CONTACT
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
UINT32 VMBusVersionRequested;
|
||||
UINT32 Padding2;
|
||||
UINT64 InterruptPage;
|
||||
UINT64 MonitorPage1;
|
||||
UINT64 MonitorPage2;
|
||||
} VMBUS_CHANNEL_INITIATE_CONTACT, *PVMBUS_CHANNEL_INITIATE_CONTACT;
|
||||
|
||||
typedef struct _VMBUS_CHANNEL_VERSION_RESPONSE
|
||||
{
|
||||
VMBUS_CHANNEL_MESSAGE_HEADER Header;
|
||||
BOOLEAN VersionSupported;
|
||||
} VMBUS_CHANNEL_VERSION_RESPONSE, *PVMBUS_CHANNEL_VERSION_RESPONSE;
|
||||
|
||||
typedef VMBUS_CHANNEL_MESSAGE_HEADER VMBUS_CHANNEL_UNLOAD, *PVMBUS_CHANNEL_UNLOAD;
|
||||
|
||||
//
|
||||
// Kind of a table to use the preprocessor to get us the right type for a
|
||||
// specified message ID. Used with ChAllocateSendMessage()
|
||||
//
|
||||
#define ChannelMessageQueryVmbusVersion_TYPE VMBUS_CHANNEL_MESSAGE_HEADER
|
||||
#define ChannelMessageVmbusVersionSupported_TYPE VMBUS_CHANNEL_VERSION_SUPPORTED
|
||||
#define ChannelMessageOfferChannel_TYPE VMBUS_CHANNEL_OFFER_CHANNEL
|
||||
#define ChannelMessageRescindChannelOffer_TYPE VMBUS_CHANNEL_RESCIND_OFFER
|
||||
#define ChannelMessageRequestOffers_TYPE VMBUS_CHANNEL_MESSAGE_HEADER
|
||||
#define ChannelMessageAllOffersDelivered_TYPE VMBUS_CHANNEL_MESSAGE_HEADER
|
||||
#define ChannelMessageOpenChannel_TYPE VMBUS_CHANNEL_OPEN_CHANNEL
|
||||
#define ChannelMessageOpenChannelResult_TYPE VMBUS_CHANNEL_OPEN_RESULT
|
||||
#define ChannelMessageCloseChannel_TYPE VMBUS_CHANNEL_CLOSE_CHANNEL
|
||||
#define ChannelMessageAllGpadlsUnmapped_TYPE VMBUS_CHANNEL_CLOSE_CHANNEL
|
||||
#define ChannelMessageGpadlHeader_TYPE VMBUS_CHANNEL_GPADL_HEADER
|
||||
#define ChannelMessageGpadlBody_TYPE VMBUS_CHANNEL_GPADL_BODY
|
||||
#define ChannelMessageGpadlCreated_TYPE VMBUS_CHANNEL_GPADL_CREATED
|
||||
#define ChannelMessageGpadlTeardown_TYPE VMBUS_CHANNEL_GPADL_TEARDOWN
|
||||
#define ChannelMessageGpadlTorndown_TYPE VMBUS_CHANNEL_GPADL_TORNDOWN
|
||||
#define ChannelMessageViewRangeAdd_TYPE VMBUS_CHANNEL_VIEW_RANGE_ADD
|
||||
#define ChannelMessageViewRangeRemove_TYPE VMBUS_CHANNEL_VIEW_RANGE_REMOVE
|
||||
#define ChannelMessageRelIdReleased_TYPE VMBUS_CHANNEL_RELID_RELEASED
|
||||
#define ChannelMessageInitiateContact_TYPE VMBUS_CHANNEL_INITIATE_CONTACT
|
||||
#define ChannelMessageVersionResponse_TYPE VMBUS_CHANNEL_VERSION_RESPONSE
|
||||
#define ChannelMessageUnload_TYPE VMBUS_CHANNEL_UNLOAD
|
||||
|
||||
//
|
||||
// Preprocessor wrapper to ChAllocateSendMessageSize() converting the return
|
||||
// value to the correct pointer and calculate the needed size.
|
||||
//
|
||||
// Argument:
|
||||
//
|
||||
// Id - the numberic ID (type VMBUS_CHANNEL_MESSAGE_TYPE) of the message to
|
||||
// send.
|
||||
//
|
||||
#define ChAllocateSendMessage(Id, Fn, Context) \
|
||||
(Id##_TYPE*)ChAllocateSendMessageSized(sizeof(Id##_TYPE), Id, Fn, Context)
|
||||
|
||||
|
||||
#pragma pack(pop)
|
||||
|
32
drivers/staging/hv/include/HvHalApi.h
Normal file
32
drivers/staging/hv/include/HvHalApi.h
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
//
|
||||
// Time in the hypervisor is measured in 100 nanosecond units
|
||||
//
|
||||
typedef UINT64 HV_NANO100_TIME, *PHV_NANO100_TIME;
|
||||
typedef UINT64 HV_NANO100_DURATION, *PHV_NANO100_DURATION;
|
60
drivers/staging/hv/include/HvHcApi.h
Normal file
60
drivers/staging/hv/include/HvHcApi.h
Normal file
@ -0,0 +1,60 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
//
|
||||
// Declare the various hypercall operations.
|
||||
//
|
||||
typedef enum _HV_CALL_CODE
|
||||
{
|
||||
|
||||
HvCallPostMessage = 0x005c,
|
||||
HvCallSignalEvent = 0x005d,
|
||||
|
||||
} HV_CALL_CODE, *PHV_CALL_CODE;
|
||||
//
|
||||
// Definition of the HvPostMessage hypercall input structure.
|
||||
//
|
||||
|
||||
typedef struct _HV_INPUT_POST_MESSAGE
|
||||
{
|
||||
HV_CONNECTION_ID ConnectionId;
|
||||
UINT32 Reserved;
|
||||
HV_MESSAGE_TYPE MessageType;
|
||||
UINT32 PayloadSize;
|
||||
UINT64 Payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
|
||||
} HV_INPUT_POST_MESSAGE, *PHV_INPUT_POST_MESSAGE;
|
||||
|
||||
|
||||
//
|
||||
// Definition of the HvSignalEvent hypercall input structure.
|
||||
//
|
||||
|
||||
typedef struct _HV_INPUT_SIGNAL_EVENT
|
||||
{
|
||||
HV_CONNECTION_ID ConnectionId;
|
||||
UINT16 FlagNumber;
|
||||
UINT16 RsvdZ;
|
||||
} HV_INPUT_SIGNAL_EVENT, *PHV_INPUT_SIGNAL_EVENT;
|
86
drivers/staging/hv/include/HvPtApi.h
Normal file
86
drivers/staging/hv/include/HvPtApi.h
Normal file
@ -0,0 +1,86 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
//
|
||||
// Versioning definitions used for guests reporting themselves to the
|
||||
// hypervisor, and visa versa.
|
||||
// ==================================================================
|
||||
//
|
||||
|
||||
//
|
||||
// Version info reported by guest OS's
|
||||
//
|
||||
typedef enum _HV_GUEST_OS_VENDOR
|
||||
{
|
||||
HvGuestOsVendorMicrosoft = 0x0001
|
||||
|
||||
} HV_GUEST_OS_VENDOR, *PHV_GUEST_OS_VENDOR;
|
||||
|
||||
typedef enum _HV_GUEST_OS_MICROSOFT_IDS
|
||||
{
|
||||
HvGuestOsMicrosoftUndefined = 0x00,
|
||||
HvGuestOsMicrosoftMSDOS = 0x01,
|
||||
HvGuestOsMicrosoftWindows3x = 0x02,
|
||||
HvGuestOsMicrosoftWindows9x = 0x03,
|
||||
HvGuestOsMicrosoftWindowsNT = 0x04,
|
||||
HvGuestOsMicrosoftWindowsCE = 0x05
|
||||
|
||||
} HV_GUEST_OS_MICROSOFT_IDS, *PHV_GUEST_OS_MICROSOFT_IDS;
|
||||
|
||||
//
|
||||
// Declare the MSR used to identify the guest OS.
|
||||
//
|
||||
#define HV_X64_MSR_GUEST_OS_ID 0x40000000
|
||||
|
||||
typedef union _HV_X64_MSR_GUEST_OS_ID_CONTENTS
|
||||
{
|
||||
UINT64 AsUINT64;
|
||||
struct
|
||||
{
|
||||
UINT64 BuildNumber : 16;
|
||||
UINT64 ServiceVersion : 8; // Service Pack, etc.
|
||||
UINT64 MinorVersion : 8;
|
||||
UINT64 MajorVersion : 8;
|
||||
UINT64 OsId : 8; // HV_GUEST_OS_MICROSOFT_IDS (If Vendor=MS)
|
||||
UINT64 VendorId : 16; // HV_GUEST_OS_VENDOR
|
||||
};
|
||||
} HV_X64_MSR_GUEST_OS_ID_CONTENTS, *PHV_X64_MSR_GUEST_OS_ID_CONTENTS;
|
||||
|
||||
//
|
||||
// Declare the MSR used to setup pages used to communicate with the hypervisor.
|
||||
//
|
||||
#define HV_X64_MSR_HYPERCALL 0x40000001
|
||||
|
||||
typedef union _HV_X64_MSR_HYPERCALL_CONTENTS
|
||||
{
|
||||
UINT64 AsUINT64;
|
||||
struct
|
||||
{
|
||||
UINT64 Enable : 1;
|
||||
UINT64 Reserved : 11;
|
||||
UINT64 GuestPhysicalAddress : 52;
|
||||
};
|
||||
} HV_X64_MSR_HYPERCALL_CONTENTS, *PHV_X64_MSR_HYPERCALL_CONTENTS;
|
718
drivers/staging/hv/include/HvStatus.h
Normal file
718
drivers/staging/hv/include/HvStatus.h
Normal file
@ -0,0 +1,718 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
// begin_hvgdk
|
||||
//
|
||||
// Status codes for hypervisor operations.
|
||||
//
|
||||
typedef UINT16 HV_STATUS, *PHV_STATUS;
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_SUCCESS
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The specified hypercall succeeded
|
||||
//
|
||||
#define HV_STATUS_SUCCESS ((HV_STATUS)0x0000)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INVALID_HYPERCALL_CODE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The hypervisor does not support the operation because the specified hypercall code is not supported.
|
||||
//
|
||||
#define HV_STATUS_INVALID_HYPERCALL_CODE ((HV_STATUS)0x0002)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INVALID_HYPERCALL_INPUT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The hypervisor does not support the operation because the encoding for the hypercall input register is not supported.
|
||||
//
|
||||
#define HV_STATUS_INVALID_HYPERCALL_INPUT ((HV_STATUS)0x0003)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INVALID_ALIGNMENT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The hypervisor could not perform the operation beacuse a parameter has an invalid alignment.
|
||||
//
|
||||
#define HV_STATUS_INVALID_ALIGNMENT ((HV_STATUS)0x0004)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INVALID_PARAMETER
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The hypervisor could not perform the operation beacuse an invalid parameter was specified.
|
||||
//
|
||||
#define HV_STATUS_INVALID_PARAMETER ((HV_STATUS)0x0005)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_ACCESS_DENIED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// Access to the specified object was denied.
|
||||
//
|
||||
#define HV_STATUS_ACCESS_DENIED ((HV_STATUS)0x0006)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INVALID_PARTITION_STATE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The hypervisor could not perform the operation because the partition is entering or in an invalid state.
|
||||
//
|
||||
#define HV_STATUS_INVALID_PARTITION_STATE ((HV_STATUS)0x0007)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_OPERATION_DENIED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The operation is not allowed in the current state.
|
||||
//
|
||||
#define HV_STATUS_OPERATION_DENIED ((HV_STATUS)0x0008)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_UNKNOWN_PROPERTY
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The hypervisor does not recognize the specified partition property.
|
||||
//
|
||||
#define HV_STATUS_UNKNOWN_PROPERTY ((HV_STATUS)0x0009)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The specified value of a partition property is out of range or violates an invariant.
|
||||
//
|
||||
#define HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE ((HV_STATUS)0x000A)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INSUFFICIENT_MEMORY
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// There is not enough memory in the hypervisor pool to complete the operation.
|
||||
//
|
||||
#define HV_STATUS_INSUFFICIENT_MEMORY ((HV_STATUS)0x000B)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_PARTITION_TOO_DEEP
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The maximum partition depth has been exceeded for the partition hierarchy.
|
||||
//
|
||||
#define HV_STATUS_PARTITION_TOO_DEEP ((HV_STATUS)0x000C)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INVALID_PARTITION_ID
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// A partition with the specified partition Id does not exist.
|
||||
//
|
||||
#define HV_STATUS_INVALID_PARTITION_ID ((HV_STATUS)0x000D)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INVALID_VP_INDEX
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The hypervisor could not perform the operation because the specified VP index is invalid.
|
||||
//
|
||||
#define HV_STATUS_INVALID_VP_INDEX ((HV_STATUS)0x000E)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_NOT_FOUND
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The iteration is complete; no addition items in the iteration could be found.
|
||||
//
|
||||
#define HV_STATUS_NOT_FOUND ((HV_STATUS)0x0010)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INVALID_PORT_ID
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The hypervisor could not perform the operation because the specified port identifier is invalid.
|
||||
//
|
||||
#define HV_STATUS_INVALID_PORT_ID ((HV_STATUS)0x0011)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INVALID_CONNECTION_ID
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The hypervisor could not perform the operation because the specified connection identifier is invalid.
|
||||
//
|
||||
#define HV_STATUS_INVALID_CONNECTION_ID ((HV_STATUS)0x0012)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INSUFFICIENT_BUFFERS
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// You did not supply enough message buffers to send a message.
|
||||
//
|
||||
#define HV_STATUS_INSUFFICIENT_BUFFERS ((HV_STATUS)0x0013)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_NOT_ACKNOWLEDGED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The previous virtual interrupt has not been acknowledged.
|
||||
//
|
||||
#define HV_STATUS_NOT_ACKNOWLEDGED ((HV_STATUS)0x0014)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INVALID_VP_STATE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// A virtual processor is not in the correct state for the performance of the indicated operation.
|
||||
//
|
||||
#define HV_STATUS_INVALID_VP_STATE ((HV_STATUS)0x0015)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_ACKNOWLEDGED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The previous virtual interrupt has already been acknowledged.
|
||||
//
|
||||
#define HV_STATUS_ACKNOWLEDGED ((HV_STATUS)0x0016)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INVALID_SAVE_RESTORE_STATE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The indicated partition is not in a valid state for saving or restoring.
|
||||
//
|
||||
#define HV_STATUS_INVALID_SAVE_RESTORE_STATE ((HV_STATUS)0x0017)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INVALID_SYNIC_STATE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The hypervisor could not complete the operation because a required feature of the synthetic interrupt controller (SynIC) was disabled.
|
||||
//
|
||||
#define HV_STATUS_INVALID_SYNIC_STATE ((HV_STATUS)0x0018)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_OBJECT_IN_USE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The hypervisor could not perform the operation because the object or value was either already in use or being used for a purpose that would not permit completing the operation.
|
||||
//
|
||||
#define HV_STATUS_OBJECT_IN_USE ((HV_STATUS)0x0019)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INVALID_PROXIMITY_DOMAIN_INFO
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The proximity domain information is invalid.
|
||||
//
|
||||
#define HV_STATUS_INVALID_PROXIMITY_DOMAIN_INFO ((HV_STATUS)0x001A)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_NO_DATA
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// An attempt to retrieve debugging data failed because none was available.
|
||||
//
|
||||
#define HV_STATUS_NO_DATA ((HV_STATUS)0x001B)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INACTIVE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The physical connection being used for debuggging has not recorded any receive activity since the last operation.
|
||||
//
|
||||
#define HV_STATUS_INACTIVE ((HV_STATUS)0x001C)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_NO_RESOURCES
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// There are not enough resources to complete the operation.
|
||||
//
|
||||
#define HV_STATUS_NO_RESOURCES ((HV_STATUS)0x001D)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_FEATURE_UNAVAILABLE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// A hypervisor feature is not available to the user.
|
||||
//
|
||||
#define HV_STATUS_FEATURE_UNAVAILABLE ((HV_STATUS)0x001E)
|
||||
|
||||
// end_hvgdk
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_UNSUCCESSFUL
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// {Operation Failed}
|
||||
// The requested operation was unsuccessful.
|
||||
//
|
||||
#define HV_STATUS_UNSUCCESSFUL ((HV_STATUS)0x1001)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INSUFFICIENT_BUFFER
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The specified buffer was too small to contain all of the requested data.
|
||||
//
|
||||
#define HV_STATUS_INSUFFICIENT_BUFFER ((HV_STATUS)0x1002)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_GPA_NOT_PRESENT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The guest physical address is not currently associated with a system physical address.
|
||||
//
|
||||
#define HV_STATUS_GPA_NOT_PRESENT ((HV_STATUS)0x1003)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_GUEST_PAGE_FAULT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The operation would have resulted in a page fault in the guest.
|
||||
//
|
||||
#define HV_STATUS_GUEST_PAGE_FAULT ((HV_STATUS)0x1004)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_RUNDOWN_DISABLED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The operation cannot proceed as the rundown object was marked disabled.
|
||||
//
|
||||
#define HV_STATUS_RUNDOWN_DISABLED ((HV_STATUS)0x1005)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_KEY_ALREADY_EXISTS
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The entry cannot be added as another entry with the same key already exists.
|
||||
//
|
||||
#define HV_STATUS_KEY_ALREADY_EXISTS ((HV_STATUS)0x1006)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_GPA_INTERCEPT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The operation resulted an intercept on a region of guest physical memory.
|
||||
//
|
||||
#define HV_STATUS_GPA_INTERCEPT ((HV_STATUS)0x1007)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_GUEST_GENERAL_PROTECTION_FAULT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The operation would have resulted in a general protection fault in the guest.
|
||||
//
|
||||
#define HV_STATUS_GUEST_GENERAL_PROTECTION_FAULT ((HV_STATUS)0x1008)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_GUEST_STACK_FAULT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The operation would have resulted in a stack fault in the guest.
|
||||
//
|
||||
#define HV_STATUS_GUEST_STACK_FAULT ((HV_STATUS)0x1009)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_GUEST_INVALID_OPCODE_FAULT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The operation would have resulted in an invalid opcode fault in the guest.
|
||||
//
|
||||
#define HV_STATUS_GUEST_INVALID_OPCODE_FAULT ((HV_STATUS)0x100A)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_FINALIZE_INCOMPLETE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The partition is not completely finalized.
|
||||
//
|
||||
#define HV_STATUS_FINALIZE_INCOMPLETE ((HV_STATUS)0x100B)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_GUEST_MACHINE_CHECK_ABORT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The operation would have resulted in an machine check abort in the guest.
|
||||
//
|
||||
#define HV_STATUS_GUEST_MACHINE_CHECK_ABORT ((HV_STATUS)0x100C)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_ILLEGAL_OVERLAY_ACCESS
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// An illegal access was attempted to an overlay page.
|
||||
//
|
||||
#define HV_STATUS_ILLEGAL_OVERLAY_ACCESS ((HV_STATUS)0x100D)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INSUFFICIENT_SYSTEM_VA
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// There is not enough system VA space available to satisfy the request,
|
||||
//
|
||||
#define HV_STATUS_INSUFFICIENT_SYSTEM_VA ((HV_STATUS)0x100E)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_VIRTUAL_ADDRESS_NOT_MAPPED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The passed virtual address was not mapped in the hypervisor address space.
|
||||
//
|
||||
#define HV_STATUS_VIRTUAL_ADDRESS_NOT_MAPPED ((HV_STATUS)0x100F)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_NOT_IMPLEMENTED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The requested operation is not implemented in this version of the hypervisor.
|
||||
//
|
||||
#define HV_STATUS_NOT_IMPLEMENTED ((HV_STATUS)0x1010)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_VMX_INSTRUCTION_FAILED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The requested VMX instruction failed to complete succesfully.
|
||||
//
|
||||
#define HV_STATUS_VMX_INSTRUCTION_FAILED ((HV_STATUS)0x1011)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_VMX_INSTRUCTION_FAILED_WITH_STATUS
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The requested VMX instruction failed to complete succesfully indicating status.
|
||||
//
|
||||
#define HV_STATUS_VMX_INSTRUCTION_FAILED_WITH_STATUS ((HV_STATUS)0x1012)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_MSR_ACCESS_FAILED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The requested access to the model specific register failed.
|
||||
//
|
||||
#define HV_STATUS_MSR_ACCESS_FAILED ((HV_STATUS)0x1013)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_CR_ACCESS_FAILED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The requested access to the control register failed.
|
||||
//
|
||||
#define HV_STATUS_CR_ACCESS_FAILED ((HV_STATUS)0x1014)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_TIMEOUT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The specified timeout expired before the operation completed.
|
||||
//
|
||||
#define HV_STATUS_TIMEOUT ((HV_STATUS)0x1016)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_MSR_INTERCEPT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The requested access to the model specific register generated an intercept.
|
||||
//
|
||||
#define HV_STATUS_MSR_INTERCEPT ((HV_STATUS)0x1017)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_CPUID_INTERCEPT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The CPUID instruction generated an intercept.
|
||||
//
|
||||
#define HV_STATUS_CPUID_INTERCEPT ((HV_STATUS)0x1018)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_REPEAT_INSTRUCTION
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The current instruction should be repeated and the instruction pointer not advanced.
|
||||
//
|
||||
#define HV_STATUS_REPEAT_INSTRUCTION ((HV_STATUS)0x1019)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_PAGE_PROTECTION_VIOLATION
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The current instruction should be repeated and the instruction pointer not advanced.
|
||||
//
|
||||
#define HV_STATUS_PAGE_PROTECTION_VIOLATION ((HV_STATUS)0x101A)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_PAGE_TABLE_INVALID
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The current instruction should be repeated and the instruction pointer not advanced.
|
||||
//
|
||||
#define HV_STATUS_PAGE_TABLE_INVALID ((HV_STATUS)0x101B)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_PAGE_NOT_PRESENT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The current instruction should be repeated and the instruction pointer not advanced.
|
||||
//
|
||||
#define HV_STATUS_PAGE_NOT_PRESENT ((HV_STATUS)0x101C)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_IO_INTERCEPT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The requested access to the I/O port generated an intercept.
|
||||
//
|
||||
#define HV_STATUS_IO_INTERCEPT ((HV_STATUS)0x101D)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_NOTHING_TO_DO
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// There is nothing to do.
|
||||
//
|
||||
#define HV_STATUS_NOTHING_TO_DO ((HV_STATUS)0x101E)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_THREAD_TERMINATING
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The requested thread is terminating.
|
||||
//
|
||||
#define HV_STATUS_THREAD_TERMINATING ((HV_STATUS)0x101F)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_SECTION_ALREADY_CONSTRUCTED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The specified section was already constructed.
|
||||
//
|
||||
#define HV_STATUS_SECTION_ALREADY_CONSTRUCTED ((HV_STATUS)0x1020)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_SECTION_NOT_ALREADY_CONSTRUCTED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The specified section was not already constructed.
|
||||
//
|
||||
#define HV_STATUS_SECTION_NOT_ALREADY_CONSTRUCTED ((HV_STATUS)0x1021)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_PAGE_ALREADY_COMMITTED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The specified virtual address was already backed by physical memory.
|
||||
//
|
||||
#define HV_STATUS_PAGE_ALREADY_COMMITTED ((HV_STATUS)0x1022)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_PAGE_NOT_ALREADY_COMMITTED
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The specified virtual address was not already backed by physical memory.
|
||||
//
|
||||
#define HV_STATUS_PAGE_NOT_ALREADY_COMMITTED ((HV_STATUS)0x1023)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_COMMITTED_PAGES_REMAIN
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// Committed pages remain in the section.
|
||||
//
|
||||
#define HV_STATUS_COMMITTED_PAGES_REMAIN ((HV_STATUS)0x1024)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_NO_REMAINING_COMMITTED_PAGES
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// No additional committed pages beyond the specified page exist in the section.
|
||||
//
|
||||
#define HV_STATUS_NO_REMAINING_COMMITTED_PAGES ((HV_STATUS)0x1025)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INSUFFICIENT_COMPARTMENT_VA
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The VA space of the compartment is exhausted.
|
||||
//
|
||||
#define HV_STATUS_INSUFFICIENT_COMPARTMENT_VA ((HV_STATUS)0x1026)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_DEREF_SPA_LIST_FULL
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The SPA dereference list is full, and there are additional entries
|
||||
// to be added to it.
|
||||
//
|
||||
#define HV_STATUS_DEREF_SPA_LIST_FULL ((HV_STATUS)0x1027)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_GPA_OUT_OF_RANGE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The supplied GPA is out of range.
|
||||
//
|
||||
#define HV_STATUS_GPA_OUT_OF_RANGE ((HV_STATUS)0x1027)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_NONVOLATILE_XMM_STALE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The XMM register that was being accessed is stale.
|
||||
//
|
||||
#define HV_STATUS_NONVOLATILE_XMM_STALE ((HV_STATUS)0x1028)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_UNSUPPORTED_PROCESSOR
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The hypervisor does not support the processors in this system.
|
||||
//
|
||||
#define HV_STATUS_UNSUPPORTED_PROCESSOR ((HV_STATUS)0x1029)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_INSUFFICIENT_CROM_SPACE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// Insufficient space existed for copying over the CROM contents.
|
||||
//
|
||||
#define HV_STATUS_INSUFFICIENT_CROM_SPACE ((HV_STATUS)0x2000)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_BAD_CROM_FORMAT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The contents of the CROM failed validation attempts.
|
||||
//
|
||||
#define HV_STATUS_BAD_CROM_FORMAT ((HV_STATUS)0x2001)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_UNSUPPORTED_CROM_FORMAT
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The contents of the CROM contain contents the parser doesn't support.
|
||||
//
|
||||
#define HV_STATUS_UNSUPPORTED_CROM_FORMAT ((HV_STATUS)0x2002)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_UNSUPPORTED_CONTROLLER
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The register format of the OHCI controller specified for debugging is not supported.
|
||||
//
|
||||
#define HV_STATUS_UNSUPPORTED_CONTROLLER ((HV_STATUS)0x2003)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_CROM_TOO_LARGE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The CROM contents were to large to copy over.
|
||||
//
|
||||
#define HV_STATUS_CROM_TOO_LARGE ((HV_STATUS)0x2004)
|
||||
|
||||
//
|
||||
// MessageId: HV_STATUS_CONTROLLER_IN_USE
|
||||
//
|
||||
// MessageText:
|
||||
//
|
||||
// The OHCI controller specified for debugging cannot be used as it is already in use.
|
||||
//
|
||||
#define HV_STATUS_CONTROLLER_IN_USE ((HV_STATUS)0x2005)
|
||||
|
490
drivers/staging/hv/include/HvSynicApi.h
Normal file
490
drivers/staging/hv/include/HvSynicApi.h
Normal file
@ -0,0 +1,490 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
//
|
||||
// Define the virtual APIC registers
|
||||
//
|
||||
#define HV_X64_MSR_EOI (0x40000070)
|
||||
#define HV_X64_MSR_ICR (0x40000071)
|
||||
#define HV_X64_MSR_TPR (0x40000072)
|
||||
#define HV_X64_MSR_APIC_ASSIST_PAGE (0x40000073)
|
||||
|
||||
//
|
||||
// Define version of the synthetic interrupt controller.
|
||||
//
|
||||
|
||||
#define HV_SYNIC_VERSION (1)
|
||||
|
||||
|
||||
//
|
||||
// Define synthetic interrupt controller model specific registers.
|
||||
//
|
||||
|
||||
#define HV_X64_MSR_SCONTROL (0x40000080)
|
||||
#define HV_X64_MSR_SVERSION (0x40000081)
|
||||
#define HV_X64_MSR_SIEFP (0x40000082)
|
||||
#define HV_X64_MSR_SIMP (0x40000083)
|
||||
#define HV_X64_MSR_EOM (0x40000084)
|
||||
#define HV_X64_MSR_SINT0 (0x40000090)
|
||||
#define HV_X64_MSR_SINT1 (0x40000091)
|
||||
#define HV_X64_MSR_SINT2 (0x40000092)
|
||||
#define HV_X64_MSR_SINT3 (0x40000093)
|
||||
#define HV_X64_MSR_SINT4 (0x40000094)
|
||||
#define HV_X64_MSR_SINT5 (0x40000095)
|
||||
#define HV_X64_MSR_SINT6 (0x40000096)
|
||||
#define HV_X64_MSR_SINT7 (0x40000097)
|
||||
#define HV_X64_MSR_SINT8 (0x40000098)
|
||||
#define HV_X64_MSR_SINT9 (0x40000099)
|
||||
#define HV_X64_MSR_SINT10 (0x4000009A)
|
||||
#define HV_X64_MSR_SINT11 (0x4000009B)
|
||||
#define HV_X64_MSR_SINT12 (0x4000009C)
|
||||
#define HV_X64_MSR_SINT13 (0x4000009D)
|
||||
#define HV_X64_MSR_SINT14 (0x4000009E)
|
||||
#define HV_X64_MSR_SINT15 (0x4000009F)
|
||||
|
||||
//
|
||||
// Define the expected SynIC version.
|
||||
//
|
||||
#define HV_SYNIC_VERSION_1 (0x1)
|
||||
|
||||
//
|
||||
// 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 synthetic interrupt controller flag constants.
|
||||
//
|
||||
|
||||
#define HV_EVENT_FLAGS_COUNT (256 * 8)
|
||||
#define HV_EVENT_FLAGS_BYTE_COUNT (256)
|
||||
#define HV_EVENT_FLAGS_DWORD_COUNT (256 / sizeof(UINT32))
|
||||
|
||||
//
|
||||
// Define hypervisor message types.
|
||||
//
|
||||
typedef enum _HV_MESSAGE_TYPE
|
||||
{
|
||||
HvMessageTypeNone = 0x00000000,
|
||||
|
||||
//
|
||||
// Memory access messages.
|
||||
//
|
||||
HvMessageTypeUnmappedGpa = 0x80000000,
|
||||
HvMessageTypeGpaIntercept = 0x80000001,
|
||||
|
||||
//
|
||||
// Timer notification messages.
|
||||
//
|
||||
HvMessageTimerExpired = 0x80000010,
|
||||
|
||||
//
|
||||
// Error messages.
|
||||
//
|
||||
HvMessageTypeInvalidVpRegisterValue = 0x80000020,
|
||||
HvMessageTypeUnrecoverableException = 0x80000021,
|
||||
HvMessageTypeUnsupportedFeature = 0x80000022,
|
||||
|
||||
//
|
||||
// Trace buffer complete messages.
|
||||
//
|
||||
HvMessageTypeEventLogBufferComplete = 0x80000040,
|
||||
|
||||
//
|
||||
// Platform-specific processor intercept messages.
|
||||
//
|
||||
HvMessageTypeX64IoPortIntercept = 0x80010000,
|
||||
HvMessageTypeX64MsrIntercept = 0x80010001,
|
||||
HvMessageTypeX64CpuidIntercept = 0x80010002,
|
||||
HvMessageTypeX64ExceptionIntercept = 0x80010003,
|
||||
HvMessageTypeX64ApicEoi = 0x80010004,
|
||||
HvMessageTypeX64LegacyFpError = 0x80010005
|
||||
|
||||
} HV_MESSAGE_TYPE, *PHV_MESSAGE_TYPE;
|
||||
|
||||
//
|
||||
// Define the number of synthetic interrupt sources.
|
||||
//
|
||||
|
||||
#define HV_SYNIC_SINT_COUNT (16)
|
||||
#define HV_SYNIC_STIMER_COUNT (4)
|
||||
|
||||
//
|
||||
// Define the synthetic interrupt source index type.
|
||||
//
|
||||
|
||||
typedef UINT32 HV_SYNIC_SINT_INDEX, *PHV_SYNIC_SINT_INDEX;
|
||||
|
||||
//
|
||||
// Define partition identifier type.
|
||||
//
|
||||
|
||||
typedef UINT64 HV_PARTITION_ID, *PHV_PARTITION_ID;
|
||||
|
||||
//
|
||||
// Define invalid partition identifier.
|
||||
//
|
||||
#define HV_PARTITION_ID_INVALID ((HV_PARTITION_ID) 0x0)
|
||||
|
||||
//
|
||||
// Define connection identifier type.
|
||||
//
|
||||
|
||||
typedef union _HV_CONNECTION_ID
|
||||
{
|
||||
UINT32 AsUINT32;
|
||||
|
||||
struct
|
||||
{
|
||||
UINT32 Id:24;
|
||||
UINT32 Reserved:8;
|
||||
} u;
|
||||
|
||||
} HV_CONNECTION_ID, *PHV_CONNECTION_ID;
|
||||
|
||||
//
|
||||
// Define port identifier type.
|
||||
//
|
||||
|
||||
typedef union _HV_PORT_ID
|
||||
{
|
||||
UINT32 AsUINT32;
|
||||
|
||||
struct
|
||||
{
|
||||
UINT32 Id:24;
|
||||
UINT32 Reserved:8;
|
||||
} u ;
|
||||
|
||||
} HV_PORT_ID, *PHV_PORT_ID;
|
||||
|
||||
//
|
||||
// Define port type.
|
||||
//
|
||||
|
||||
typedef enum _HV_PORT_TYPE
|
||||
{
|
||||
HvPortTypeMessage = 1,
|
||||
HvPortTypeEvent = 2,
|
||||
HvPortTypeMonitor = 3
|
||||
} HV_PORT_TYPE, *PHV_PORT_TYPE;
|
||||
|
||||
//
|
||||
// Define port information structure.
|
||||
//
|
||||
|
||||
typedef struct _HV_PORT_INFO
|
||||
{
|
||||
HV_PORT_TYPE PortType;
|
||||
UINT32 Padding;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
HV_SYNIC_SINT_INDEX TargetSint;
|
||||
HV_VP_INDEX TargetVp;
|
||||
UINT64 RsvdZ;
|
||||
} MessagePortInfo;
|
||||
|
||||
struct
|
||||
{
|
||||
HV_SYNIC_SINT_INDEX TargetSint;
|
||||
HV_VP_INDEX TargetVp;
|
||||
UINT16 BaseFlagNumber;
|
||||
UINT16 FlagCount;
|
||||
UINT32 RsvdZ;
|
||||
} EventPortInfo;
|
||||
|
||||
struct
|
||||
{
|
||||
HV_GPA MonitorAddress;
|
||||
UINT64 RsvdZ;
|
||||
} MonitorPortInfo;
|
||||
};
|
||||
} HV_PORT_INFO, *PHV_PORT_INFO;
|
||||
|
||||
typedef const HV_PORT_INFO *PCHV_PORT_INFO;
|
||||
|
||||
typedef struct _HV_CONNECTION_INFO
|
||||
{
|
||||
HV_PORT_TYPE PortType;
|
||||
UINT32 Padding;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
UINT64 RsvdZ;
|
||||
} MessageConnectionInfo;
|
||||
|
||||
struct
|
||||
{
|
||||
UINT64 RsvdZ;
|
||||
} EventConnectionInfo;
|
||||
|
||||
struct
|
||||
{
|
||||
HV_GPA MonitorAddress;
|
||||
} MonitorConnectionInfo;
|
||||
};
|
||||
} HV_CONNECTION_INFO, *PHV_CONNECTION_INFO;
|
||||
|
||||
typedef const HV_CONNECTION_INFO *PCHV_CONNECTION_INFO;
|
||||
|
||||
//
|
||||
// Define synthetic interrupt controller message flags.
|
||||
//
|
||||
|
||||
typedef union _HV_MESSAGE_FLAGS
|
||||
{
|
||||
UINT8 AsUINT8;
|
||||
struct
|
||||
{
|
||||
UINT8 MessagePending:1;
|
||||
UINT8 Reserved:7;
|
||||
};
|
||||
} HV_MESSAGE_FLAGS, *PHV_MESSAGE_FLAGS;
|
||||
|
||||
|
||||
//
|
||||
// Define synthetic interrupt controller message header.
|
||||
//
|
||||
|
||||
typedef struct _HV_MESSAGE_HEADER
|
||||
{
|
||||
HV_MESSAGE_TYPE MessageType;
|
||||
UINT8 PayloadSize;
|
||||
HV_MESSAGE_FLAGS MessageFlags;
|
||||
UINT8 Reserved[2];
|
||||
union
|
||||
{
|
||||
HV_PARTITION_ID Sender;
|
||||
HV_PORT_ID Port;
|
||||
};
|
||||
|
||||
} HV_MESSAGE_HEADER, *PHV_MESSAGE_HEADER;
|
||||
|
||||
//
|
||||
// Define timer message payload structure.
|
||||
//
|
||||
typedef struct _HV_TIMER_MESSAGE_PAYLOAD
|
||||
{
|
||||
UINT32 TimerIndex;
|
||||
UINT32 Reserved;
|
||||
HV_NANO100_TIME ExpirationTime; // When the timer expired
|
||||
HV_NANO100_TIME DeliveryTime; // When the message was delivered
|
||||
} HV_TIMER_MESSAGE_PAYLOAD, *PHV_TIMER_MESSAGE_PAYLOAD;
|
||||
|
||||
//
|
||||
// Define synthetic interrupt controller message format.
|
||||
//
|
||||
|
||||
typedef struct _HV_MESSAGE
|
||||
{
|
||||
HV_MESSAGE_HEADER Header;
|
||||
union
|
||||
{
|
||||
UINT64 Payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
|
||||
} u ;
|
||||
} HV_MESSAGE, *PHV_MESSAGE;
|
||||
|
||||
//
|
||||
// Define the number of message buffers associated with each port.
|
||||
//
|
||||
|
||||
#define HV_PORT_MESSAGE_BUFFER_COUNT (16)
|
||||
|
||||
//
|
||||
// Define the synthetic interrupt message page layout.
|
||||
//
|
||||
|
||||
typedef struct _HV_MESSAGE_PAGE
|
||||
{
|
||||
volatile HV_MESSAGE SintMessage[HV_SYNIC_SINT_COUNT];
|
||||
} HV_MESSAGE_PAGE, *PHV_MESSAGE_PAGE;
|
||||
|
||||
|
||||
//
|
||||
// Define the synthetic interrupt controller event flags format.
|
||||
//
|
||||
|
||||
typedef union _HV_SYNIC_EVENT_FLAGS
|
||||
{
|
||||
UINT8 Flags8[HV_EVENT_FLAGS_BYTE_COUNT];
|
||||
UINT32 Flags32[HV_EVENT_FLAGS_DWORD_COUNT];
|
||||
} HV_SYNIC_EVENT_FLAGS, *PHV_SYNIC_EVENT_FLAGS;
|
||||
|
||||
|
||||
//
|
||||
// Define the synthetic interrupt flags page layout.
|
||||
//
|
||||
|
||||
typedef struct _HV_SYNIC_EVENT_FLAGS_PAGE
|
||||
{
|
||||
volatile HV_SYNIC_EVENT_FLAGS SintEventFlags[HV_SYNIC_SINT_COUNT];
|
||||
} HV_SYNIC_EVENT_FLAGS_PAGE, *PHV_SYNIC_EVENT_FLAGS_PAGE;
|
||||
|
||||
|
||||
//
|
||||
// Define SynIC control register.
|
||||
//
|
||||
typedef union _HV_SYNIC_SCONTROL
|
||||
{
|
||||
UINT64 AsUINT64;
|
||||
struct
|
||||
{
|
||||
UINT64 Enable:1;
|
||||
UINT64 Reserved:63;
|
||||
};
|
||||
} HV_SYNIC_SCONTROL, *PHV_SYNIC_SCONTROL;
|
||||
|
||||
//
|
||||
// Define synthetic interrupt source.
|
||||
//
|
||||
|
||||
typedef union _HV_SYNIC_SINT
|
||||
{
|
||||
UINT64 AsUINT64;
|
||||
struct
|
||||
{
|
||||
UINT64 Vector :8;
|
||||
UINT64 Reserved1 :8;
|
||||
UINT64 Masked :1;
|
||||
UINT64 AutoEoi :1;
|
||||
UINT64 Reserved2 :46;
|
||||
};
|
||||
} HV_SYNIC_SINT, *PHV_SYNIC_SINT;
|
||||
|
||||
//
|
||||
// Define the format of the SIMP register
|
||||
//
|
||||
|
||||
typedef union _HV_SYNIC_SIMP
|
||||
{
|
||||
UINT64 AsUINT64;
|
||||
struct
|
||||
{
|
||||
UINT64 SimpEnabled : 1;
|
||||
UINT64 Preserved : 11;
|
||||
UINT64 BaseSimpGpa : 52;
|
||||
};
|
||||
} HV_SYNIC_SIMP, *PHV_SYNIC_SIMP;
|
||||
|
||||
//
|
||||
// Define the format of the SIEFP register
|
||||
//
|
||||
|
||||
typedef union _HV_SYNIC_SIEFP
|
||||
{
|
||||
UINT64 AsUINT64;
|
||||
struct
|
||||
{
|
||||
UINT64 SiefpEnabled : 1;
|
||||
UINT64 Preserved : 11;
|
||||
UINT64 BaseSiefpGpa : 52;
|
||||
};
|
||||
} HV_SYNIC_SIEFP, *PHV_SYNIC_SIEFP;
|
||||
|
||||
//
|
||||
// Definitions for the monitored notification facility
|
||||
//
|
||||
|
||||
typedef union _HV_MONITOR_TRIGGER_GROUP
|
||||
{
|
||||
UINT64 AsUINT64;
|
||||
|
||||
struct
|
||||
{
|
||||
UINT32 Pending;
|
||||
UINT32 Armed;
|
||||
};
|
||||
|
||||
} HV_MONITOR_TRIGGER_GROUP, *PHV_MONITOR_TRIGGER_GROUP;
|
||||
|
||||
typedef struct _HV_MONITOR_PARAMETER
|
||||
{
|
||||
HV_CONNECTION_ID ConnectionId;
|
||||
UINT16 FlagNumber;
|
||||
UINT16 RsvdZ;
|
||||
} HV_MONITOR_PARAMETER, *PHV_MONITOR_PARAMETER;
|
||||
|
||||
typedef union _HV_MONITOR_TRIGGER_STATE
|
||||
{
|
||||
UINT32 AsUINT32;
|
||||
|
||||
struct
|
||||
{
|
||||
UINT32 GroupEnable : 4;
|
||||
UINT32 RsvdZ : 28;
|
||||
};
|
||||
|
||||
} HV_MONITOR_TRIGGER_STATE, *PHV_MONITOR_TRIGGER_STATE;
|
||||
|
||||
//
|
||||
// HV_MONITOR_PAGE Layout
|
||||
// ------------------------------------------------------
|
||||
// | 0 | TriggerState (4 bytes) | Rsvd1 (4 bytes) |
|
||||
// | 8 | TriggerGroup[0] |
|
||||
// | 10 | TriggerGroup[1] |
|
||||
// | 18 | TriggerGroup[2] |
|
||||
// | 20 | TriggerGroup[3] |
|
||||
// | 28 | Rsvd2[0] |
|
||||
// | 30 | Rsvd2[1] |
|
||||
// | 38 | Rsvd2[2] |
|
||||
// | 40 | NextCheckTime[0][0] | NextCheckTime[0][1] |
|
||||
// | ... |
|
||||
// | 240 | Latency[0][0..3] |
|
||||
// | 340 | Rsvz3[0] |
|
||||
// | 440 | Parameter[0][0] |
|
||||
// | 448 | Parameter[0][1] |
|
||||
// | ... |
|
||||
// | 840 | Rsvd4[0] |
|
||||
// ------------------------------------------------------
|
||||
|
||||
typedef struct _HV_MONITOR_PAGE
|
||||
{
|
||||
HV_MONITOR_TRIGGER_STATE TriggerState;
|
||||
UINT32 RsvdZ1;
|
||||
|
||||
HV_MONITOR_TRIGGER_GROUP TriggerGroup[4];
|
||||
UINT64 RsvdZ2[3];
|
||||
|
||||
INT32 NextCheckTime[4][32];
|
||||
|
||||
UINT16 Latency[4][32];
|
||||
UINT64 RsvdZ3[32];
|
||||
|
||||
HV_MONITOR_PARAMETER Parameter[4][32];
|
||||
|
||||
UINT8 RsvdZ4[1984];
|
||||
|
||||
} HV_MONITOR_PAGE, *PHV_MONITOR_PAGE;
|
||||
|
||||
typedef volatile HV_MONITOR_PAGE* PVHV_MONITOR_PAGE;
|
31
drivers/staging/hv/include/HvTypes.h
Normal file
31
drivers/staging/hv/include/HvTypes.h
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
typedef UINT64 HV_GPA, *PHV_GPA;
|
||||
|
||||
#define HV_X64_PAGE_SIZE (4096)
|
||||
#define HV_PAGE_SIZE HV_X64_PAGE_SIZE
|
||||
|
51
drivers/staging/hv/include/HvVpApi.h
Normal file
51
drivers/staging/hv/include/HvVpApi.h
Normal file
@ -0,0 +1,51 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
//
|
||||
// Virtual Processor Indices
|
||||
//
|
||||
typedef UINT32 HV_VP_INDEX, *PHV_VP_INDEX;
|
||||
|
||||
//
|
||||
// The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent
|
||||
// is set by CPUID(HvCpuIdFunctionVersionAndFeatures).
|
||||
// ==========================================================================
|
||||
//
|
||||
|
||||
typedef enum _HV_CPUID_FUNCTION
|
||||
{
|
||||
HvCpuIdFunctionVersionAndFeatures = 0x00000001,
|
||||
HvCpuIdFunctionHvVendorAndMaxFunction = 0x40000000,
|
||||
HvCpuIdFunctionHvInterface = 0x40000001,
|
||||
|
||||
//
|
||||
// The remaining functions depend on the value of HvCpuIdFunctionInterface
|
||||
//
|
||||
HvCpuIdFunctionMsHvVersion = 0x40000002,
|
||||
HvCpuIdFunctionMsHvFeatures = 0x40000003,
|
||||
HvCpuIdFunctionMsHvEnlightenmentInformation = 0x40000004,
|
||||
HvCpuIdFunctionMsHvImplementationLimits = 0x40000005
|
||||
|
||||
} HV_CPUID_FUNCTION, *PHV_CPUID_FUNCTION;
|
269
drivers/staging/hv/include/List.h
Normal file
269
drivers/staging/hv/include/List.h
Normal file
@ -0,0 +1,269 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _LIST_H_
|
||||
#define _LIST_H_
|
||||
|
||||
#include "osd.h"
|
||||
/*
|
||||
*
|
||||
* Doubly-linked list manipulation routines. Implemented as macros
|
||||
* but logically these are procedures.
|
||||
*
|
||||
*/
|
||||
|
||||
typedef DLIST_ENTRY LIST_ENTRY;
|
||||
typedef DLIST_ENTRY *PLIST_ENTRY;
|
||||
|
||||
//typedef struct LIST_ENTRY {
|
||||
// struct LIST_ENTRY * volatile Flink;
|
||||
// struct LIST_ENTRY * volatile Blink;
|
||||
//} LIST_ENTRY, *PLIST_ENTRY;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* VOID
|
||||
* InitializeListHead(
|
||||
* PLIST_ENTRY ListHead
|
||||
* );
|
||||
*/
|
||||
#define INITIALIZE_LIST_HEAD InitializeListHead
|
||||
|
||||
#define InitializeListHead(ListHead) (\
|
||||
(ListHead)->Flink = (ListHead)->Blink = (ListHead))
|
||||
|
||||
|
||||
/*
|
||||
* BOOLEAN
|
||||
* IsListEmpty(
|
||||
* PLIST_ENTRY ListHead
|
||||
* );
|
||||
*/
|
||||
#define IS_LIST_EMPTY IsListEmpty
|
||||
|
||||
#define IsListEmpty(ListHead) \
|
||||
((ListHead)->Flink == (ListHead))
|
||||
|
||||
|
||||
/*
|
||||
* PLIST_ENTRY
|
||||
* NextListEntry(
|
||||
* PLIST_ENTRY Entry
|
||||
* );
|
||||
*/
|
||||
#define NEXT_LIST_ENTRY NextListEntry
|
||||
|
||||
#define NextListEntry(Entry) \
|
||||
(Entry)->Flink
|
||||
|
||||
|
||||
/*
|
||||
* PLIST_ENTRY
|
||||
* PrevListEntry(
|
||||
* PLIST_ENTRY Entry
|
||||
* );
|
||||
*/
|
||||
#define PREV_LIST_ENTRY PrevListEntry
|
||||
|
||||
#define PrevListEntry(Entry) \
|
||||
(Entry)->Blink
|
||||
|
||||
|
||||
/*
|
||||
* PLIST_ENTRY
|
||||
* TopListEntry(
|
||||
* PLIST_ENTRY ListHead
|
||||
* );
|
||||
*/
|
||||
#define TOP_LIST_ENTRY TopListEntry
|
||||
|
||||
#define TopListEntry(ListHead) \
|
||||
(ListHead)->Flink
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* PLIST_ENTRY
|
||||
* RemoveHeadList(
|
||||
* PLIST_ENTRY ListHead
|
||||
* );
|
||||
*/
|
||||
|
||||
#define REMOVE_HEAD_LIST RemoveHeadList
|
||||
|
||||
#define RemoveHeadList(ListHead) \
|
||||
(ListHead)->Flink;\
|
||||
{RemoveEntryList((ListHead)->Flink)}
|
||||
|
||||
|
||||
/*
|
||||
* PLIST_ENTRY
|
||||
* RemoveTailList(
|
||||
* PLIST_ENTRY ListHead
|
||||
* );
|
||||
*/
|
||||
#define REMOVE_TAIL_LIST RemoveTailList
|
||||
|
||||
#define RemoveTailList(ListHead) \
|
||||
(ListHead)->Blink;\
|
||||
{RemoveEntryList((ListHead)->Blink)}
|
||||
|
||||
|
||||
/*
|
||||
* VOID
|
||||
* RemoveEntryList(
|
||||
* PLIST_ENTRY Entry
|
||||
* );
|
||||
*/
|
||||
#define REMOVE_ENTRY_LIST RemoveEntryList
|
||||
|
||||
#define RemoveEntryList(Entry) {\
|
||||
PLIST_ENTRY _EX_Flink = (Entry)->Flink;\
|
||||
PLIST_ENTRY _EX_Blink = (Entry)->Blink;\
|
||||
_EX_Blink->Flink = _EX_Flink;\
|
||||
_EX_Flink->Blink = _EX_Blink;\
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* VOID
|
||||
* AttachList(
|
||||
* PLIST_ENTRY ListHead,
|
||||
* PLIST_ENTRY ListEntry
|
||||
* );
|
||||
*/
|
||||
#define ATTACH_LIST AttachList
|
||||
|
||||
#define AttachList(ListHead,ListEntry) {\
|
||||
PLIST_ENTRY _EX_ListHead = (ListHead);\
|
||||
PLIST_ENTRY _EX_Blink = (ListHead)->Blink;\
|
||||
(ListEntry)->Blink->Flink = _EX_ListHead;\
|
||||
_EX_Blink->Flink = (ListEntry);\
|
||||
_EX_ListHead->Blink = (ListEntry)->Blink;\
|
||||
(ListEntry)->Blink = _EX_Blink;\
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* VOID
|
||||
* InsertTailList(
|
||||
* PLIST_ENTRY ListHead,
|
||||
* PLIST_ENTRY Entry
|
||||
* );
|
||||
*/
|
||||
|
||||
#define INSERT_TAIL_LIST InsertTailList
|
||||
|
||||
#define InsertTailList(ListHead,Entry) {\
|
||||
PLIST_ENTRY _EX_ListHead = (ListHead);\
|
||||
PLIST_ENTRY _EX_Blink = (ListHead)->Blink;\
|
||||
(Entry)->Flink = _EX_ListHead;\
|
||||
(Entry)->Blink = _EX_Blink;\
|
||||
_EX_Blink->Flink = (Entry);\
|
||||
_EX_ListHead->Blink = (Entry);\
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* VOID
|
||||
* InsertHeadList(
|
||||
* PLIST_ENTRY ListHead,
|
||||
* PLIST_ENTRY Entry
|
||||
* );
|
||||
*/
|
||||
#define INSERT_HEAD_LIST InsertHeadList
|
||||
|
||||
#define InsertHeadList(ListHead,Entry) {\
|
||||
PLIST_ENTRY _EX_ListHead = (ListHead);\
|
||||
PLIST_ENTRY _EX_Flink = (ListHead)->Flink;\
|
||||
(Entry)->Flink = _EX_Flink;\
|
||||
(Entry)->Blink = _EX_ListHead;\
|
||||
_EX_Flink->Blink = (Entry);\
|
||||
_EX_ListHead->Flink = (Entry);\
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* VOID
|
||||
* IterateListEntries(
|
||||
* PLIST_ENTRY anchor,
|
||||
* PLIST_ENTRY index,
|
||||
* PLIST_ENTRY listp
|
||||
* );
|
||||
*/
|
||||
|
||||
#define ITERATE_LIST_ENTRIES IterateListEntries
|
||||
|
||||
#define IterateListEntries(anchor, index, listp) \
|
||||
(anchor) = (LIST_ENTRY *)(listp); \
|
||||
for((index) = (anchor)->Flink; (index) != (anchor); (index) = (index)->Flink)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* PSINGLE_LIST_ENTRY
|
||||
* PopEntryList(
|
||||
* PSINGLE_LIST_ENTRY ListHead
|
||||
* );
|
||||
*/
|
||||
|
||||
#define POP_ENTRY_LIST PopEntryList
|
||||
|
||||
#define PopEntryList(ListHead) \
|
||||
(ListHead)->Next;\
|
||||
{\
|
||||
PSINGLE_LIST_ENTRY FirstEntry;\
|
||||
FirstEntry = (ListHead)->Next;\
|
||||
if (FirstEntry != NULL) { \
|
||||
(ListHead)->Next = FirstEntry->Next;\
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* VOID
|
||||
* PushEntryList(
|
||||
* PSINGLE_LIST_ENTRY ListHead,
|
||||
* PSINGLE_LIST_ENTRY Entry
|
||||
* );
|
||||
*/
|
||||
|
||||
#define PUSH_ENTRY_LIST PushEntryList
|
||||
|
||||
#define PushEntryList(ListHead,Entry) \
|
||||
(Entry)->Next = (ListHead)->Next; \
|
||||
(ListHead)->Next = (Entry)
|
||||
|
||||
#ifndef CONTAINING_RECORD
|
||||
#define CONTAINING_RECORD(address, type, field) ((type *)( \
|
||||
(PCHAR)(address) - \
|
||||
(PCHAR)(&((type *)0)->field)))
|
||||
#endif /* CONTAINING_RECORD */
|
||||
|
||||
#endif /* _LIST_H_ */
|
||||
|
||||
/* EOF */
|
131
drivers/staging/hv/include/VmbusChannelInterface.h
Normal file
131
drivers/staging/hv/include/VmbusChannelInterface.h
Normal file
@ -0,0 +1,131 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
// allow nameless unions
|
||||
//#pragma warning(disable : 4201)
|
||||
|
||||
//
|
||||
// A revision number of vmbus that is used for ensuring both ends on a
|
||||
// partition are using compatible versions.
|
||||
//
|
||||
#define VMBUS_REVISION_NUMBER 13
|
||||
|
||||
//
|
||||
// Make maximum size of pipe payload of 16K
|
||||
//
|
||||
#define MAX_PIPE_DATA_PAYLOAD (sizeof(BYTE) * 16384)
|
||||
|
||||
//
|
||||
// Define PipeMode values.
|
||||
//
|
||||
#define VMBUS_PIPE_TYPE_BYTE 0x00000000
|
||||
#define VMBUS_PIPE_TYPE_MESSAGE 0x00000004
|
||||
|
||||
//
|
||||
// The size of the user defined data buffer for non-pipe offers.
|
||||
//
|
||||
#define MAX_USER_DEFINED_BYTES 120
|
||||
|
||||
//
|
||||
// The size of the user defined data buffer for pipe offers.
|
||||
//
|
||||
#define MAX_PIPE_USER_DEFINED_BYTES 116
|
||||
|
||||
|
||||
//
|
||||
// At the center of the Channel Management library is
|
||||
// the Channel Offer. This struct contains the
|
||||
// fundamental information about an offer.
|
||||
//
|
||||
#pragma pack(push,1)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
||||
GUID InterfaceType;
|
||||
GUID InterfaceInstance;
|
||||
UINT64 InterruptLatencyIn100nsUnits;
|
||||
UINT32 InterfaceRevision;
|
||||
UINT32 ServerContextAreaSize; // in bytes
|
||||
UINT16 ChannelFlags;
|
||||
UINT16 MmioMegabytes; // in bytes * 1024 * 1024
|
||||
|
||||
union
|
||||
{
|
||||
//
|
||||
// Non-pipes: The user has MAX_USER_DEFINED_BYTES bytes.
|
||||
//
|
||||
struct
|
||||
{
|
||||
UCHAR UserDefined[MAX_USER_DEFINED_BYTES];
|
||||
} Standard;
|
||||
|
||||
//
|
||||
// Pipes: The following sructure is an integrated pipe protocol, which
|
||||
// is implemented on top of standard user-defined data. Pipe clients
|
||||
// have MAX_PIPE_USER_DEFINED_BYTES left for their own use.
|
||||
//
|
||||
struct
|
||||
{
|
||||
UINT32 PipeMode;
|
||||
UCHAR UserDefined[MAX_PIPE_USER_DEFINED_BYTES];
|
||||
} Pipe;
|
||||
} u;
|
||||
UINT32 Padding;
|
||||
} VMBUS_CHANNEL_OFFER, *PVMBUS_CHANNEL_OFFER;
|
||||
#pragma pack(pop)
|
||||
|
||||
|
||||
//
|
||||
// Verify the MAX_PIPE_USER_DEFINED_BYTES value.
|
||||
//
|
||||
//C_ASSERT(MAX_PIPE_USER_DEFINED_BYTES ==
|
||||
// MAX_USER_DEFINED_BYTES -
|
||||
// (FIELD_OFFSET(VMBUS_CHANNEL_OFFER, u.Pipe.UserDefined) -
|
||||
// FIELD_OFFSET(VMBUS_CHANNEL_OFFER, u.Standard.UserDefined)));
|
||||
//
|
||||
|
||||
typedef UINT32 GPADL_HANDLE;
|
||||
|
||||
//
|
||||
// Server Flags
|
||||
//
|
||||
|
||||
#define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 1
|
||||
#define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES 2
|
||||
#define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS 4
|
||||
#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
|
||||
|
||||
//
|
||||
// TEMPTEMP -- move this next define to devioctl.h some day
|
||||
//
|
||||
|
||||
#ifndef FILE_DEVICE_VMBUS
|
||||
#define FILE_DEVICE_VMBUS 0x0000003E
|
||||
#endif
|
||||
|
322
drivers/staging/hv/include/VmbusPacketFormat.h
Normal file
322
drivers/staging/hv/include/VmbusPacketFormat.h
Normal file
@ -0,0 +1,322 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
//#ifndef PAGE_SIZE
|
||||
//#if defined(_IA64_)
|
||||
//#error This does not work for IA64
|
||||
//#else
|
||||
//#define PAGE_SIZE 0x1000
|
||||
//#endif
|
||||
//#endif
|
||||
|
||||
// allow nameless unions
|
||||
//#pragma warning(disable : 4201)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
volatile UINT32 In; // Offset in bytes from the ring base
|
||||
volatile UINT32 Out; // Offset in bytes from the ring base
|
||||
};
|
||||
volatile LONGLONG InOut;
|
||||
};
|
||||
|
||||
//
|
||||
// If the receiving endpoint sets this to some non-zero value, the sending
|
||||
// endpoint should not send any interrupts.
|
||||
//
|
||||
|
||||
volatile UINT32 InterruptMask;
|
||||
|
||||
} VMRCB, *PVMRCB;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
VMRCB Control;
|
||||
};
|
||||
|
||||
UINT8 Reserved[PAGE_SIZE];
|
||||
};
|
||||
|
||||
//
|
||||
// Beginning of the ring data. Note: It must be guaranteed that
|
||||
// this data does not share a page with the control structure.
|
||||
//
|
||||
UINT8 Data[1];
|
||||
} VMRING, *PVMRING;
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UINT16 Type;
|
||||
UINT16 DataOffset8;
|
||||
UINT16 Length8;
|
||||
UINT16 Flags;
|
||||
UINT64 TransactionId;
|
||||
} VMPACKET_DESCRIPTOR, *PVMPACKET_DESCRIPTOR;
|
||||
|
||||
typedef UINT32 PREVIOUS_PACKET_OFFSET, *PPREVIOUS_PACKET_OFFSET;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
PREVIOUS_PACKET_OFFSET PreviousPacketStartOffset;
|
||||
VMPACKET_DESCRIPTOR Descriptor;
|
||||
} VMPACKET_HEADER, *PVMPACKET_HEADER;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UINT32 ByteCount;
|
||||
UINT32 ByteOffset;
|
||||
} VMTRANSFER_PAGE_RANGE, *PVMTRANSFER_PAGE_RANGE;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
typedef struct _VMTRANSFER_PAGE_PACKET_HEADER : VMPACKET_DESCRIPTOR {
|
||||
|
||||
#else
|
||||
|
||||
typedef struct VMTRANSFER_PAGE_PACKET_HEADER {
|
||||
|
||||
VMPACKET_DESCRIPTOR d;
|
||||
|
||||
#endif
|
||||
|
||||
UINT16 TransferPageSetId;
|
||||
BOOLEAN SenderOwnsSet;
|
||||
UINT8 Reserved;
|
||||
UINT32 RangeCount;
|
||||
VMTRANSFER_PAGE_RANGE Ranges[1];
|
||||
|
||||
} VMTRANSFER_PAGE_PACKET_HEADER, *PVMTRANSFER_PAGE_PACKET_HEADER;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
typedef struct _VMGPADL_PACKET_HEADER : VMPACKET_DESCRIPTOR {
|
||||
|
||||
#else
|
||||
|
||||
typedef struct _VMGPADL_PACKET_HEADER {
|
||||
|
||||
VMPACKET_DESCRIPTOR d;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
UINT32 Gpadl;
|
||||
UINT32 Reserved;
|
||||
|
||||
} VMGPADL_PACKET_HEADER, *PVMGPADL_PACKET_HEADER;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
typedef struct _VMADD_REMOVE_TRANSFER_PAGE_SET : VMPACKET_DESCRIPTOR {
|
||||
|
||||
#else
|
||||
|
||||
typedef struct _VMADD_REMOVE_TRANSFER_PAGE_SET {
|
||||
|
||||
VMPACKET_DESCRIPTOR d;
|
||||
|
||||
#endif
|
||||
|
||||
UINT32 Gpadl;
|
||||
UINT16 TransferPageSetId;
|
||||
UINT16 Reserved;
|
||||
|
||||
} VMADD_REMOVE_TRANSFER_PAGE_SET, *PVMADD_REMOVE_TRANSFER_PAGE_SET;
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
//
|
||||
// This structure defines a range in guest physical space that can be made
|
||||
// to look virtually contiguous.
|
||||
//
|
||||
|
||||
typedef struct _GPA_RANGE {
|
||||
|
||||
UINT32 ByteCount;
|
||||
UINT32 ByteOffset;
|
||||
UINT64 PfnArray[0];
|
||||
|
||||
} GPA_RANGE, *PGPA_RANGE;
|
||||
|
||||
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
//
|
||||
// This is the format for an Establish Gpadl packet, which contains a handle
|
||||
// by which this GPADL will be known and a set of GPA ranges associated with
|
||||
// it. This can be converted to a MDL by the guest OS. If there are multiple
|
||||
// GPA ranges, then the resulting MDL will be "chained," representing multiple
|
||||
// VA ranges.
|
||||
//
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
typedef struct _VMESTABLISH_GPADL : VMPACKET_DESCRIPTOR {
|
||||
|
||||
#else
|
||||
|
||||
typedef struct _VMESTABLISH_GPADL {
|
||||
|
||||
VMPACKET_DESCRIPTOR d;
|
||||
|
||||
#endif
|
||||
|
||||
UINT32 Gpadl;
|
||||
UINT32 RangeCount;
|
||||
GPA_RANGE Range[1];
|
||||
|
||||
} VMESTABLISH_GPADL, *PVMESTABLISH_GPADL;
|
||||
|
||||
|
||||
//
|
||||
// This is the format for a Teardown Gpadl packet, which indicates that the
|
||||
// GPADL handle in the Establish Gpadl packet will never be referenced again.
|
||||
//
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
typedef struct _VMTEARDOWN_GPADL : VMPACKET_DESCRIPTOR {
|
||||
|
||||
#else
|
||||
|
||||
typedef struct _VMTEARDOWN_GPADL {
|
||||
|
||||
VMPACKET_DESCRIPTOR d;
|
||||
|
||||
#endif
|
||||
|
||||
UINT32 Gpadl;
|
||||
UINT32 Reserved; // for alignment to a 8-byte boundary
|
||||
} VMTEARDOWN_GPADL, *PVMTEARDOWN_GPADL;
|
||||
|
||||
|
||||
//
|
||||
// This is the format for a GPA-Direct packet, which contains a set of GPA
|
||||
// ranges, in addition to commands and/or data.
|
||||
//
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
typedef struct _VMDATA_GPA_DIRECT : VMPACKET_DESCRIPTOR {
|
||||
|
||||
#else
|
||||
|
||||
typedef struct _VMDATA_GPA_DIRECT {
|
||||
|
||||
VMPACKET_DESCRIPTOR d;
|
||||
|
||||
#endif
|
||||
|
||||
UINT32 Reserved;
|
||||
UINT32 RangeCount;
|
||||
GPA_RANGE Range[1];
|
||||
|
||||
} VMDATA_GPA_DIRECT, *PVMDATA_GPA_DIRECT;
|
||||
|
||||
|
||||
|
||||
//
|
||||
// This is the format for a Additional Data Packet.
|
||||
//
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
typedef struct _VMADDITIONAL_DATA : VMPACKET_DESCRIPTOR {
|
||||
|
||||
#else
|
||||
|
||||
typedef struct _VMADDITIONAL_DATA {
|
||||
|
||||
VMPACKET_DESCRIPTOR d;
|
||||
|
||||
#endif
|
||||
|
||||
UINT64 TotalBytes;
|
||||
UINT32 ByteOffset;
|
||||
UINT32 ByteCount;
|
||||
UCHAR Data[1];
|
||||
|
||||
} VMADDITIONAL_DATA, *PVMADDITIONAL_DATA;
|
||||
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
typedef union {
|
||||
VMPACKET_DESCRIPTOR SimpleHeader;
|
||||
VMTRANSFER_PAGE_PACKET_HEADER TransferPageHeader;
|
||||
VMGPADL_PACKET_HEADER GpadlHeader;
|
||||
VMADD_REMOVE_TRANSFER_PAGE_SET AddRemoveTransferPageHeader;
|
||||
VMESTABLISH_GPADL EstablishGpadlHeader;
|
||||
VMTEARDOWN_GPADL TeardownGpadlHeader;
|
||||
VMDATA_GPA_DIRECT DataGpaDirectHeader;
|
||||
} VMPACKET_LARGEST_POSSIBLE_HEADER, *PVMPACKET_LARGEST_POSSIBLE_HEADER;
|
||||
|
||||
#define VMPACKET_DATA_START_ADDRESS(__packet) \
|
||||
(PVOID)(((PUCHAR)__packet) + ((PVMPACKET_DESCRIPTOR)__packet)->DataOffset8 * 8)
|
||||
|
||||
#define VMPACKET_DATA_LENGTH(__packet) \
|
||||
((((PVMPACKET_DESCRIPTOR)__packet)->Length8 - ((PVMPACKET_DESCRIPTOR)__packet)->DataOffset8) * 8)
|
||||
|
||||
#define VMPACKET_TRANSFER_MODE(__packet) ((PVMPACKET_DESCRIPTOR)__packet)->Type
|
||||
|
||||
typedef enum {
|
||||
VmbusServerEndpoint = 0,
|
||||
VmbusClientEndpoint,
|
||||
VmbusEndpointMaximum
|
||||
} ENDPOINT_TYPE, *PENDPOINT_TYPE;
|
||||
|
||||
typedef enum {
|
||||
VmbusPacketTypeInvalid = 0x0,
|
||||
VmbusPacketTypeSynch = 0x1,
|
||||
VmbusPacketTypeAddTransferPageSet = 0x2,
|
||||
VmbusPacketTypeRemoveTransferPageSet = 0x3,
|
||||
VmbusPacketTypeEstablishGpadl = 0x4,
|
||||
VmbusPacketTypeTearDownGpadl = 0x5,
|
||||
VmbusPacketTypeDataInBand = 0x6,
|
||||
VmbusPacketTypeDataUsingTransferPages = 0x7,
|
||||
VmbusPacketTypeDataUsingGpadl = 0x8,
|
||||
VmbusPacketTypeDataUsingGpaDirect = 0x9,
|
||||
VmbusPacketTypeCancelRequest = 0xa,
|
||||
VmbusPacketTypeCompletion = 0xb,
|
||||
VmbusPacketTypeDataUsingAdditionalPackets = 0xc,
|
||||
VmbusPacketTypeAdditionalData = 0xd
|
||||
} VMBUS_PACKET_TYPE, *PVMBUS_PACKET_TYPE;
|
||||
|
||||
#define VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED 1
|
||||
|
||||
|
306
drivers/staging/hv/include/nvspprotocol.h
Normal file
306
drivers/staging/hv/include/nvspprotocol.h
Normal file
@ -0,0 +1,306 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <VmbusChannelInterface.h>
|
||||
|
||||
#define NVSP_INVALID_PROTOCOL_VERSION ((UINT32)0xFFFFFFFF)
|
||||
|
||||
#define NVSP_PROTOCOL_VERSION_1 2
|
||||
#define NVSP_MIN_PROTOCOL_VERSION NVSP_PROTOCOL_VERSION_1
|
||||
#define NVSP_MAX_PROTOCOL_VERSION NVSP_PROTOCOL_VERSION_1
|
||||
|
||||
typedef enum _NVSP_MESSAGE_TYPE
|
||||
{
|
||||
NvspMessageTypeNone = 0,
|
||||
|
||||
//
|
||||
// Init Messages
|
||||
//
|
||||
NvspMessageTypeInit = 1,
|
||||
NvspMessageTypeInitComplete = 2,
|
||||
|
||||
NvspVersionMessageStart = 100,
|
||||
|
||||
//
|
||||
// Version 1 Messages
|
||||
//
|
||||
NvspMessage1TypeSendNdisVersion = NvspVersionMessageStart,
|
||||
|
||||
NvspMessage1TypeSendReceiveBuffer,
|
||||
NvspMessage1TypeSendReceiveBufferComplete,
|
||||
NvspMessage1TypeRevokeReceiveBuffer,
|
||||
|
||||
NvspMessage1TypeSendSendBuffer,
|
||||
NvspMessage1TypeSendSendBufferComplete,
|
||||
NvspMessage1TypeRevokeSendBuffer,
|
||||
|
||||
NvspMessage1TypeSendRNDISPacket,
|
||||
NvspMessage1TypeSendRNDISPacketComplete,
|
||||
|
||||
//
|
||||
// This should be set to the number of messages for the version
|
||||
// with the maximum number of messages.
|
||||
//
|
||||
NvspNumMessagePerVersion = 9,
|
||||
|
||||
} NVSP_MESSAGE_TYPE, *PNVSP_MESSAGE_TYPE;
|
||||
|
||||
typedef enum _NVSP_STATUS
|
||||
{
|
||||
NvspStatusNone = 0,
|
||||
NvspStatusSuccess,
|
||||
NvspStatusFailure,
|
||||
NvspStatusProtocolVersionRangeTooNew,
|
||||
NvspStatusProtocolVersionRangeTooOld,
|
||||
NvspStatusInvalidRndisPacket,
|
||||
NvspStatusBusy,
|
||||
NvspStatusMax,
|
||||
} NVSP_STATUS, *PNVSP_STATUS;
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
typedef struct _NVSP_MESSAGE_HEADER
|
||||
{
|
||||
UINT32 MessageType;
|
||||
} NVSP_MESSAGE_HEADER, *PNVSP_MESSAGE_HEADER;
|
||||
|
||||
//
|
||||
// Init Messages
|
||||
//
|
||||
|
||||
//
|
||||
// This message is used by the VSC to initialize the channel
|
||||
// after the channels has been opened. This message should
|
||||
// never include anything other then versioning (i.e. this
|
||||
// message will be the same for ever).
|
||||
//
|
||||
typedef struct _NVSP_MESSAGE_INIT
|
||||
{
|
||||
UINT32 MinProtocolVersion;
|
||||
UINT32 MaxProtocolVersion;
|
||||
} NVSP_MESSAGE_INIT, *PNVSP_MESSAGE_INIT;
|
||||
|
||||
//
|
||||
// This message is used by the VSP to complete the initialization
|
||||
// of the channel. This message should never include anything other
|
||||
// then versioning (i.e. this message will be the same for ever).
|
||||
//
|
||||
typedef struct _NVSP_MESSAGE_INIT_COMPLETE
|
||||
{
|
||||
UINT32 NegotiatedProtocolVersion;
|
||||
UINT32 MaximumMdlChainLength;
|
||||
UINT32 Status;
|
||||
} NVSP_MESSAGE_INIT_COMPLETE, *PNVSP_MESSAGE_INIT_COMPLETE;
|
||||
|
||||
typedef union _NVSP_MESSAGE_INIT_UBER
|
||||
{
|
||||
NVSP_MESSAGE_INIT Init;
|
||||
NVSP_MESSAGE_INIT_COMPLETE InitComplete;
|
||||
} NVSP_MESSAGE_INIT_UBER;
|
||||
|
||||
//
|
||||
// Version 1 Messages
|
||||
//
|
||||
|
||||
//
|
||||
// This message is used by the VSC to send the NDIS version
|
||||
// to the VSP. The VSP can use this information when handling
|
||||
// OIDs sent by the VSC.
|
||||
//
|
||||
typedef struct _NVSP_1_MESSAGE_SEND_NDIS_VERSION
|
||||
{
|
||||
UINT32 NdisMajorVersion;
|
||||
UINT32 NdisMinorVersion;
|
||||
} NVSP_1_MESSAGE_SEND_NDIS_VERSION, *PNVSP_1_MESSAGE_SEND_NDIS_VERSION;
|
||||
|
||||
//
|
||||
// This message is used by the VSC to send a receive buffer
|
||||
// to the VSP. The VSP can then use the receive buffer to
|
||||
// send data to the VSC.
|
||||
//
|
||||
typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER
|
||||
{
|
||||
GPADL_HANDLE GpadlHandle;
|
||||
UINT16 Id;
|
||||
} NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER;
|
||||
|
||||
typedef struct _NVSP_1_RECEIVE_BUFFER_SECTION
|
||||
{
|
||||
UINT32 Offset;
|
||||
UINT32 SubAllocationSize;
|
||||
UINT32 NumSubAllocations;
|
||||
UINT32 EndOffset;
|
||||
} NVSP_1_RECEIVE_BUFFER_SECTION, *PNVSP_1_RECEIVE_BUFFER_SECTION;
|
||||
|
||||
//
|
||||
// This message is used by the VSP to acknowledge a receive
|
||||
// buffer send by the VSC. This message must be sent by the
|
||||
// VSP before the VSP uses the receive buffer.
|
||||
//
|
||||
typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE
|
||||
{
|
||||
UINT32 Status;
|
||||
UINT32 NumSections;
|
||||
|
||||
//
|
||||
// The receive buffer is split into two parts, a large
|
||||
// suballocation section and a small suballocation
|
||||
// section. These sections are then suballocated by a
|
||||
// certain size.
|
||||
//
|
||||
// For example, the following break up of the receive
|
||||
// buffer has 6 large suballocations and 10 small
|
||||
// suballocations.
|
||||
//
|
||||
// | Large Section | | Small Section |
|
||||
// ------------------------------------------------------------
|
||||
// | | | | | | | | | | | | | | | | | |
|
||||
// | |
|
||||
// LargeOffset SmallOffset
|
||||
//
|
||||
NVSP_1_RECEIVE_BUFFER_SECTION Sections[1];
|
||||
|
||||
} NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE;
|
||||
|
||||
//
|
||||
// This message is sent by the VSC to revoke the receive buffer.
|
||||
// After the VSP completes this transaction, the vsp should never
|
||||
// use the receive buffer again.
|
||||
//
|
||||
typedef struct _NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER
|
||||
{
|
||||
UINT16 Id;
|
||||
} NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER;
|
||||
|
||||
//
|
||||
// This message is used by the VSC to send a send buffer
|
||||
// to the VSP. The VSC can then use the send buffer to
|
||||
// send data to the VSP.
|
||||
//
|
||||
typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER
|
||||
{
|
||||
GPADL_HANDLE GpadlHandle;
|
||||
UINT16 Id;
|
||||
} NVSP_1_MESSAGE_SEND_SEND_BUFFER, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER;
|
||||
|
||||
//
|
||||
// This message is used by the VSP to acknowledge a send
|
||||
// buffer sent by the VSC. This message must be sent by the
|
||||
// VSP before the VSP uses the sent buffer.
|
||||
//
|
||||
typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE
|
||||
{
|
||||
UINT32 Status;
|
||||
|
||||
//
|
||||
// The VSC gets to choose the size of the send buffer and
|
||||
// the VSP gets to choose the sections size of the buffer.
|
||||
// This was done to enable dynamic reconfigurations when
|
||||
// the cost of GPA-direct buffers decreases.
|
||||
//
|
||||
UINT32 SectionSize;
|
||||
} NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE;
|
||||
|
||||
//
|
||||
// This message is sent by the VSC to revoke the send buffer.
|
||||
// After the VSP completes this transaction, the vsp should never
|
||||
// use the send buffer again.
|
||||
//
|
||||
typedef struct _NVSP_1_MESSAGE_REVOKE_SEND_BUFFER
|
||||
{
|
||||
UINT16 Id;
|
||||
} NVSP_1_MESSAGE_REVOKE_SEND_BUFFER, *PNVSP_1_MESSAGE_REVOKE_SEND_BUFFER;
|
||||
|
||||
//
|
||||
// This message is used by both the VSP and the VSC to send
|
||||
// a RNDIS message to the opposite channel endpoint.
|
||||
//
|
||||
typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET
|
||||
{
|
||||
//
|
||||
// This field is specified by RNIDS. They assume there's
|
||||
// two different channels of communication. However,
|
||||
// the Network VSP only has one. Therefore, the channel
|
||||
// travels with the RNDIS packet.
|
||||
//
|
||||
UINT32 ChannelType;
|
||||
|
||||
//
|
||||
// This field is used to send part or all of the data
|
||||
// through a send buffer. This values specifies an
|
||||
// index into the send buffer. If the index is
|
||||
// 0xFFFFFFFF, then the send buffer is not being used
|
||||
// and all of the data was sent through other VMBus
|
||||
// mechanisms.
|
||||
//
|
||||
UINT32 SendBufferSectionIndex;
|
||||
UINT32 SendBufferSectionSize;
|
||||
} NVSP_1_MESSAGE_SEND_RNDIS_PACKET, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET;
|
||||
|
||||
//
|
||||
// This message is used by both the VSP and the VSC to complete
|
||||
// a RNDIS message to the opposite channel endpoint. At this
|
||||
// point, the initiator of this message cannot use any resources
|
||||
// associated with the original RNDIS packet.
|
||||
//
|
||||
typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE
|
||||
{
|
||||
UINT32 Status;
|
||||
} NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE;
|
||||
|
||||
typedef union _NVSP_MESSAGE_1_UBER
|
||||
{
|
||||
NVSP_1_MESSAGE_SEND_NDIS_VERSION SendNdisVersion;
|
||||
|
||||
NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER SendReceiveBuffer;
|
||||
NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE SendReceiveBufferComplete;
|
||||
NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER RevokeReceiveBuffer;
|
||||
|
||||
NVSP_1_MESSAGE_SEND_SEND_BUFFER SendSendBuffer;
|
||||
NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE SendSendBufferComplete;
|
||||
NVSP_1_MESSAGE_REVOKE_SEND_BUFFER RevokeSendBuffer;
|
||||
|
||||
NVSP_1_MESSAGE_SEND_RNDIS_PACKET SendRNDISPacket;
|
||||
NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE SendRNDISPacketComplete;
|
||||
} NVSP_1_MESSAGE_UBER;
|
||||
|
||||
typedef union _NVSP_ALL_MESSAGES
|
||||
{
|
||||
NVSP_MESSAGE_INIT_UBER InitMessages;
|
||||
NVSP_1_MESSAGE_UBER Version1Messages;
|
||||
|
||||
} NVSP_ALL_MESSAGES;
|
||||
|
||||
//
|
||||
// ALL Messages
|
||||
//
|
||||
typedef struct _NVSP_MESSAGE
|
||||
{
|
||||
NVSP_MESSAGE_HEADER Header;
|
||||
NVSP_ALL_MESSAGES Messages;
|
||||
} NVSP_MESSAGE, *PNVSP_MESSAGE;
|
||||
|
||||
#pragma pack(pop)
|
836
drivers/staging/hv/include/rndis.h
Normal file
836
drivers/staging/hv/include/rndis.h
Normal file
@ -0,0 +1,836 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _RNDIS_H_
|
||||
#define _RNDIS_H_
|
||||
|
||||
//
|
||||
// Basic types
|
||||
//
|
||||
typedef UINT32 RNDIS_REQUEST_ID;
|
||||
typedef UINT32 RNDIS_HANDLE;
|
||||
typedef UINT32 RNDIS_STATUS;
|
||||
typedef UINT32 RNDIS_REQUEST_TYPE;
|
||||
typedef UINT32 RNDIS_OID;
|
||||
typedef UINT32 RNDIS_CLASS_ID;
|
||||
typedef UINT32 RNDIS_MEDIUM;
|
||||
typedef UINT32 *PRNDIS_REQUEST_ID;
|
||||
typedef UINT32 *PRNDIS_HANDLE;
|
||||
typedef UINT32 *PRNDIS_STATUS;
|
||||
typedef UINT32 *PRNDIS_REQUEST_TYPE;
|
||||
typedef UINT32 *PRNDIS_OID;
|
||||
typedef UINT32 *PRNDIS_CLASS_ID;
|
||||
typedef UINT32 *PRNDIS_MEDIUM;
|
||||
typedef UINT32 RNDIS_AF;
|
||||
|
||||
//
|
||||
// Status codes
|
||||
//
|
||||
|
||||
#ifndef STATUS_SUCCESS
|
||||
#define STATUS_SUCCESS (0x00000000L)
|
||||
#endif
|
||||
|
||||
#ifndef STATUS_UNSUCCESSFUL
|
||||
#define STATUS_UNSUCCESSFUL (0xC0000001L)
|
||||
#endif
|
||||
|
||||
#ifndef STATUS_PENDING
|
||||
#define STATUS_PENDING (0x00000103L)
|
||||
#endif
|
||||
|
||||
#ifndef STATUS_INSUFFICIENT_RESOURCES
|
||||
#define STATUS_INSUFFICIENT_RESOURCES (0xC000009AL)
|
||||
#endif
|
||||
|
||||
#ifndef STATUS_BUFFER_OVERFLOW
|
||||
#define STATUS_BUFFER_OVERFLOW (0x80000005L)
|
||||
#endif
|
||||
|
||||
#ifndef STATUS_NOT_SUPPORTED
|
||||
#define STATUS_NOT_SUPPORTED (0xC00000BBL)
|
||||
#endif
|
||||
|
||||
#define RNDIS_STATUS_SUCCESS ((RNDIS_STATUS)STATUS_SUCCESS)
|
||||
#define RNDIS_STATUS_PENDING ((RNDIS_STATUS)STATUS_PENDING)
|
||||
#define RNDIS_STATUS_NOT_RECOGNIZED ((RNDIS_STATUS)0x00010001L)
|
||||
#define RNDIS_STATUS_NOT_COPIED ((RNDIS_STATUS)0x00010002L)
|
||||
#define RNDIS_STATUS_NOT_ACCEPTED ((RNDIS_STATUS)0x00010003L)
|
||||
#define RNDIS_STATUS_CALL_ACTIVE ((RNDIS_STATUS)0x00010007L)
|
||||
|
||||
#define RNDIS_STATUS_ONLINE ((RNDIS_STATUS)0x40010003L)
|
||||
#define RNDIS_STATUS_RESET_START ((RNDIS_STATUS)0x40010004L)
|
||||
#define RNDIS_STATUS_RESET_END ((RNDIS_STATUS)0x40010005L)
|
||||
#define RNDIS_STATUS_RING_STATUS ((RNDIS_STATUS)0x40010006L)
|
||||
#define RNDIS_STATUS_CLOSED ((RNDIS_STATUS)0x40010007L)
|
||||
#define RNDIS_STATUS_WAN_LINE_UP ((RNDIS_STATUS)0x40010008L)
|
||||
#define RNDIS_STATUS_WAN_LINE_DOWN ((RNDIS_STATUS)0x40010009L)
|
||||
#define RNDIS_STATUS_WAN_FRAGMENT ((RNDIS_STATUS)0x4001000AL)
|
||||
#define RNDIS_STATUS_MEDIA_CONNECT ((RNDIS_STATUS)0x4001000BL)
|
||||
#define RNDIS_STATUS_MEDIA_DISCONNECT ((RNDIS_STATUS)0x4001000CL)
|
||||
#define RNDIS_STATUS_HARDWARE_LINE_UP ((RNDIS_STATUS)0x4001000DL)
|
||||
#define RNDIS_STATUS_HARDWARE_LINE_DOWN ((RNDIS_STATUS)0x4001000EL)
|
||||
#define RNDIS_STATUS_INTERFACE_UP ((RNDIS_STATUS)0x4001000FL)
|
||||
#define RNDIS_STATUS_INTERFACE_DOWN ((RNDIS_STATUS)0x40010010L)
|
||||
#define RNDIS_STATUS_MEDIA_BUSY ((RNDIS_STATUS)0x40010011L)
|
||||
#define RNDIS_STATUS_MEDIA_SPECIFIC_INDICATION ((RNDIS_STATUS)0x40010012L)
|
||||
#define RNDIS_STATUS_WW_INDICATION RNDIS_STATUS_MEDIA_SPECIFIC_INDICATION
|
||||
#define RNDIS_STATUS_LINK_SPEED_CHANGE ((RNDIS_STATUS)0x40010013L)
|
||||
|
||||
#define RNDIS_STATUS_NOT_RESETTABLE ((RNDIS_STATUS)0x80010001L)
|
||||
#define RNDIS_STATUS_SOFT_ERRORS ((RNDIS_STATUS)0x80010003L)
|
||||
#define RNDIS_STATUS_HARD_ERRORS ((RNDIS_STATUS)0x80010004L)
|
||||
#define RNDIS_STATUS_BUFFER_OVERFLOW ((RNDIS_STATUS)STATUS_BUFFER_OVERFLOW)
|
||||
|
||||
#define RNDIS_STATUS_FAILURE ((RNDIS_STATUS)STATUS_UNSUCCESSFUL)
|
||||
#define RNDIS_STATUS_RESOURCES ((RNDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES)
|
||||
#define RNDIS_STATUS_CLOSING ((RNDIS_STATUS)0xC0010002L)
|
||||
#define RNDIS_STATUS_BAD_VERSION ((RNDIS_STATUS)0xC0010004L)
|
||||
#define RNDIS_STATUS_BAD_CHARACTERISTICS ((RNDIS_STATUS)0xC0010005L)
|
||||
#define RNDIS_STATUS_ADAPTER_NOT_FOUND ((RNDIS_STATUS)0xC0010006L)
|
||||
#define RNDIS_STATUS_OPEN_FAILED ((RNDIS_STATUS)0xC0010007L)
|
||||
#define RNDIS_STATUS_DEVICE_FAILED ((RNDIS_STATUS)0xC0010008L)
|
||||
#define RNDIS_STATUS_MULTICAST_FULL ((RNDIS_STATUS)0xC0010009L)
|
||||
#define RNDIS_STATUS_MULTICAST_EXISTS ((RNDIS_STATUS)0xC001000AL)
|
||||
#define RNDIS_STATUS_MULTICAST_NOT_FOUND ((RNDIS_STATUS)0xC001000BL)
|
||||
#define RNDIS_STATUS_REQUEST_ABORTED ((RNDIS_STATUS)0xC001000CL)
|
||||
#define RNDIS_STATUS_RESET_IN_PROGRESS ((RNDIS_STATUS)0xC001000DL)
|
||||
#define RNDIS_STATUS_CLOSING_INDICATING ((RNDIS_STATUS)0xC001000EL)
|
||||
#define RNDIS_STATUS_NOT_SUPPORTED ((RNDIS_STATUS)STATUS_NOT_SUPPORTED)
|
||||
#define RNDIS_STATUS_INVALID_PACKET ((RNDIS_STATUS)0xC001000FL)
|
||||
#define RNDIS_STATUS_OPEN_LIST_FULL ((RNDIS_STATUS)0xC0010010L)
|
||||
#define RNDIS_STATUS_ADAPTER_NOT_READY ((RNDIS_STATUS)0xC0010011L)
|
||||
#define RNDIS_STATUS_ADAPTER_NOT_OPEN ((RNDIS_STATUS)0xC0010012L)
|
||||
#define RNDIS_STATUS_NOT_INDICATING ((RNDIS_STATUS)0xC0010013L)
|
||||
#define RNDIS_STATUS_INVALID_LENGTH ((RNDIS_STATUS)0xC0010014L)
|
||||
#define RNDIS_STATUS_INVALID_DATA ((RNDIS_STATUS)0xC0010015L)
|
||||
#define RNDIS_STATUS_BUFFER_TOO_SHORT ((RNDIS_STATUS)0xC0010016L)
|
||||
#define RNDIS_STATUS_INVALID_OID ((RNDIS_STATUS)0xC0010017L)
|
||||
#define RNDIS_STATUS_ADAPTER_REMOVED ((RNDIS_STATUS)0xC0010018L)
|
||||
#define RNDIS_STATUS_UNSUPPORTED_MEDIA ((RNDIS_STATUS)0xC0010019L)
|
||||
#define RNDIS_STATUS_GROUP_ADDRESS_IN_USE ((RNDIS_STATUS)0xC001001AL)
|
||||
#define RNDIS_STATUS_FILE_NOT_FOUND ((RNDIS_STATUS)0xC001001BL)
|
||||
#define RNDIS_STATUS_ERROR_READING_FILE ((RNDIS_STATUS)0xC001001CL)
|
||||
#define RNDIS_STATUS_ALREADY_MAPPED ((RNDIS_STATUS)0xC001001DL)
|
||||
#define RNDIS_STATUS_RESOURCE_CONFLICT ((RNDIS_STATUS)0xC001001EL)
|
||||
#define RNDIS_STATUS_NO_CABLE ((RNDIS_STATUS)0xC001001FL)
|
||||
|
||||
#define RNDIS_STATUS_INVALID_SAP ((RNDIS_STATUS)0xC0010020L)
|
||||
#define RNDIS_STATUS_SAP_IN_USE ((RNDIS_STATUS)0xC0010021L)
|
||||
#define RNDIS_STATUS_INVALID_ADDRESS ((RNDIS_STATUS)0xC0010022L)
|
||||
#define RNDIS_STATUS_VC_NOT_ACTIVATED ((RNDIS_STATUS)0xC0010023L)
|
||||
#define RNDIS_STATUS_DEST_OUT_OF_ORDER ((RNDIS_STATUS)0xC0010024L)
|
||||
#define RNDIS_STATUS_VC_NOT_AVAILABLE ((RNDIS_STATUS)0xC0010025L)
|
||||
#define RNDIS_STATUS_CELLRATE_NOT_AVAILABLE ((RNDIS_STATUS)0xC0010026L)
|
||||
#define RNDIS_STATUS_INCOMPATABLE_QOS ((RNDIS_STATUS)0xC0010027L)
|
||||
#define RNDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((RNDIS_STATUS)0xC0010028L)
|
||||
#define RNDIS_STATUS_NO_ROUTE_TO_DESTINATION ((RNDIS_STATUS)0xC0010029L)
|
||||
|
||||
#define RNDIS_STATUS_TOKEN_RING_OPEN_ERROR ((RNDIS_STATUS)0xC0011000L)
|
||||
|
||||
|
||||
//
|
||||
// Object Identifiers used by NdisRequest Query/Set Information
|
||||
//
|
||||
|
||||
//
|
||||
// General Objects
|
||||
//
|
||||
|
||||
#define RNDIS_OID_GEN_SUPPORTED_LIST 0x00010101
|
||||
#define RNDIS_OID_GEN_HARDWARE_STATUS 0x00010102
|
||||
#define RNDIS_OID_GEN_MEDIA_SUPPORTED 0x00010103
|
||||
#define RNDIS_OID_GEN_MEDIA_IN_USE 0x00010104
|
||||
#define RNDIS_OID_GEN_MAXIMUM_LOOKAHEAD 0x00010105
|
||||
#define RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106
|
||||
#define RNDIS_OID_GEN_LINK_SPEED 0x00010107
|
||||
#define RNDIS_OID_GEN_TRANSMIT_BUFFER_SPACE 0x00010108
|
||||
#define RNDIS_OID_GEN_RECEIVE_BUFFER_SPACE 0x00010109
|
||||
#define RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE 0x0001010A
|
||||
#define RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE 0x0001010B
|
||||
#define RNDIS_OID_GEN_VENDOR_ID 0x0001010C
|
||||
#define RNDIS_OID_GEN_VENDOR_DESCRIPTION 0x0001010D
|
||||
#define RNDIS_OID_GEN_CURRENT_PACKET_FILTER 0x0001010E
|
||||
#define RNDIS_OID_GEN_CURRENT_LOOKAHEAD 0x0001010F
|
||||
#define RNDIS_OID_GEN_DRIVER_VERSION 0x00010110
|
||||
#define RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE 0x00010111
|
||||
#define RNDIS_OID_GEN_PROTOCOL_OPTIONS 0x00010112
|
||||
#define RNDIS_OID_GEN_MAC_OPTIONS 0x00010113
|
||||
#define RNDIS_OID_GEN_MEDIA_CONNECT_STATUS 0x00010114
|
||||
#define RNDIS_OID_GEN_MAXIMUM_SEND_PACKETS 0x00010115
|
||||
#define RNDIS_OID_GEN_VENDOR_DRIVER_VERSION 0x00010116
|
||||
#define RNDIS_OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118
|
||||
#define RNDIS_OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119
|
||||
#define RNDIS_OID_GEN_MACHINE_NAME 0x0001021A
|
||||
#define RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER 0x0001021B
|
||||
|
||||
#define RNDIS_OID_GEN_XMIT_OK 0x00020101
|
||||
#define RNDIS_OID_GEN_RCV_OK 0x00020102
|
||||
#define RNDIS_OID_GEN_XMIT_ERROR 0x00020103
|
||||
#define RNDIS_OID_GEN_RCV_ERROR 0x00020104
|
||||
#define RNDIS_OID_GEN_RCV_NO_BUFFER 0x00020105
|
||||
|
||||
#define RNDIS_OID_GEN_DIRECTED_BYTES_XMIT 0x00020201
|
||||
#define RNDIS_OID_GEN_DIRECTED_FRAMES_XMIT 0x00020202
|
||||
#define RNDIS_OID_GEN_MULTICAST_BYTES_XMIT 0x00020203
|
||||
#define RNDIS_OID_GEN_MULTICAST_FRAMES_XMIT 0x00020204
|
||||
#define RNDIS_OID_GEN_BROADCAST_BYTES_XMIT 0x00020205
|
||||
#define RNDIS_OID_GEN_BROADCAST_FRAMES_XMIT 0x00020206
|
||||
#define RNDIS_OID_GEN_DIRECTED_BYTES_RCV 0x00020207
|
||||
#define RNDIS_OID_GEN_DIRECTED_FRAMES_RCV 0x00020208
|
||||
#define RNDIS_OID_GEN_MULTICAST_BYTES_RCV 0x00020209
|
||||
#define RNDIS_OID_GEN_MULTICAST_FRAMES_RCV 0x0002020A
|
||||
#define RNDIS_OID_GEN_BROADCAST_BYTES_RCV 0x0002020B
|
||||
#define RNDIS_OID_GEN_BROADCAST_FRAMES_RCV 0x0002020C
|
||||
|
||||
#define RNDIS_OID_GEN_RCV_CRC_ERROR 0x0002020D
|
||||
#define RNDIS_OID_GEN_TRANSMIT_QUEUE_LENGTH 0x0002020E
|
||||
|
||||
#define RNDIS_OID_GEN_GET_TIME_CAPS 0x0002020F
|
||||
#define RNDIS_OID_GEN_GET_NETCARD_TIME 0x00020210
|
||||
|
||||
//
|
||||
// These are connection-oriented general OIDs.
|
||||
// These replace the above OIDs for connection-oriented media.
|
||||
//
|
||||
#define RNDIS_OID_GEN_CO_SUPPORTED_LIST 0x00010101
|
||||
#define RNDIS_OID_GEN_CO_HARDWARE_STATUS 0x00010102
|
||||
#define RNDIS_OID_GEN_CO_MEDIA_SUPPORTED 0x00010103
|
||||
#define RNDIS_OID_GEN_CO_MEDIA_IN_USE 0x00010104
|
||||
#define RNDIS_OID_GEN_CO_LINK_SPEED 0x00010105
|
||||
#define RNDIS_OID_GEN_CO_VENDOR_ID 0x00010106
|
||||
#define RNDIS_OID_GEN_CO_VENDOR_DESCRIPTION 0x00010107
|
||||
#define RNDIS_OID_GEN_CO_DRIVER_VERSION 0x00010108
|
||||
#define RNDIS_OID_GEN_CO_PROTOCOL_OPTIONS 0x00010109
|
||||
#define RNDIS_OID_GEN_CO_MAC_OPTIONS 0x0001010A
|
||||
#define RNDIS_OID_GEN_CO_MEDIA_CONNECT_STATUS 0x0001010B
|
||||
#define RNDIS_OID_GEN_CO_VENDOR_DRIVER_VERSION 0x0001010C
|
||||
#define RNDIS_OID_GEN_CO_MINIMUM_LINK_SPEED 0x0001010D
|
||||
|
||||
#define RNDIS_OID_GEN_CO_GET_TIME_CAPS 0x00010201
|
||||
#define RNDIS_OID_GEN_CO_GET_NETCARD_TIME 0x00010202
|
||||
|
||||
//
|
||||
// These are connection-oriented statistics OIDs.
|
||||
//
|
||||
#define RNDIS_OID_GEN_CO_XMIT_PDUS_OK 0x00020101
|
||||
#define RNDIS_OID_GEN_CO_RCV_PDUS_OK 0x00020102
|
||||
#define RNDIS_OID_GEN_CO_XMIT_PDUS_ERROR 0x00020103
|
||||
#define RNDIS_OID_GEN_CO_RCV_PDUS_ERROR 0x00020104
|
||||
#define RNDIS_OID_GEN_CO_RCV_PDUS_NO_BUFFER 0x00020105
|
||||
|
||||
|
||||
#define RNDIS_OID_GEN_CO_RCV_CRC_ERROR 0x00020201
|
||||
#define RNDIS_OID_GEN_CO_TRANSMIT_QUEUE_LENGTH 0x00020202
|
||||
#define RNDIS_OID_GEN_CO_BYTES_XMIT 0x00020203
|
||||
#define RNDIS_OID_GEN_CO_BYTES_RCV 0x00020204
|
||||
#define RNDIS_OID_GEN_CO_BYTES_XMIT_OUTSTANDING 0x00020205
|
||||
#define RNDIS_OID_GEN_CO_NETCARD_LOAD 0x00020206
|
||||
|
||||
//
|
||||
// These are objects for Connection-oriented media call-managers.
|
||||
//
|
||||
#define RNDIS_OID_CO_ADD_PVC 0xFF000001
|
||||
#define RNDIS_OID_CO_DELETE_PVC 0xFF000002
|
||||
#define RNDIS_OID_CO_GET_CALL_INFORMATION 0xFF000003
|
||||
#define RNDIS_OID_CO_ADD_ADDRESS 0xFF000004
|
||||
#define RNDIS_OID_CO_DELETE_ADDRESS 0xFF000005
|
||||
#define RNDIS_OID_CO_GET_ADDRESSES 0xFF000006
|
||||
#define RNDIS_OID_CO_ADDRESS_CHANGE 0xFF000007
|
||||
#define RNDIS_OID_CO_SIGNALING_ENABLED 0xFF000008
|
||||
#define RNDIS_OID_CO_SIGNALING_DISABLED 0xFF000009
|
||||
|
||||
|
||||
//
|
||||
// 802.3 Objects (Ethernet)
|
||||
//
|
||||
|
||||
#define RNDIS_OID_802_3_PERMANENT_ADDRESS 0x01010101
|
||||
#define RNDIS_OID_802_3_CURRENT_ADDRESS 0x01010102
|
||||
#define RNDIS_OID_802_3_MULTICAST_LIST 0x01010103
|
||||
#define RNDIS_OID_802_3_MAXIMUM_LIST_SIZE 0x01010104
|
||||
#define RNDIS_OID_802_3_MAC_OPTIONS 0x01010105
|
||||
|
||||
//
|
||||
//
|
||||
#define NDIS_802_3_MAC_OPTION_PRIORITY 0x00000001
|
||||
|
||||
#define RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101
|
||||
#define RNDIS_OID_802_3_XMIT_ONE_COLLISION 0x01020102
|
||||
#define RNDIS_OID_802_3_XMIT_MORE_COLLISIONS 0x01020103
|
||||
|
||||
#define RNDIS_OID_802_3_XMIT_DEFERRED 0x01020201
|
||||
#define RNDIS_OID_802_3_XMIT_MAX_COLLISIONS 0x01020202
|
||||
#define RNDIS_OID_802_3_RCV_OVERRUN 0x01020203
|
||||
#define RNDIS_OID_802_3_XMIT_UNDERRUN 0x01020204
|
||||
#define RNDIS_OID_802_3_XMIT_HEARTBEAT_FAILURE 0x01020205
|
||||
#define RNDIS_OID_802_3_XMIT_TIMES_CRS_LOST 0x01020206
|
||||
#define RNDIS_OID_802_3_XMIT_LATE_COLLISIONS 0x01020207
|
||||
|
||||
|
||||
//
|
||||
// Remote NDIS message types
|
||||
//
|
||||
#define REMOTE_NDIS_PACKET_MSG 0x00000001
|
||||
#define REMOTE_NDIS_INITIALIZE_MSG 0x00000002
|
||||
#define REMOTE_NDIS_HALT_MSG 0x00000003
|
||||
#define REMOTE_NDIS_QUERY_MSG 0x00000004
|
||||
#define REMOTE_NDIS_SET_MSG 0x00000005
|
||||
#define REMOTE_NDIS_RESET_MSG 0x00000006
|
||||
#define REMOTE_NDIS_INDICATE_STATUS_MSG 0x00000007
|
||||
#define REMOTE_NDIS_KEEPALIVE_MSG 0x00000008
|
||||
|
||||
#define REMOTE_CONDIS_MP_CREATE_VC_MSG 0x00008001
|
||||
#define REMOTE_CONDIS_MP_DELETE_VC_MSG 0x00008002
|
||||
#define REMOTE_CONDIS_MP_ACTIVATE_VC_MSG 0x00008005
|
||||
#define REMOTE_CONDIS_MP_DEACTIVATE_VC_MSG 0x00008006
|
||||
#define REMOTE_CONDIS_INDICATE_STATUS_MSG 0x00008007
|
||||
|
||||
|
||||
// Remote NDIS message completion types
|
||||
#define REMOTE_NDIS_INITIALIZE_CMPLT 0x80000002
|
||||
#define REMOTE_NDIS_QUERY_CMPLT 0x80000004
|
||||
#define REMOTE_NDIS_SET_CMPLT 0x80000005
|
||||
#define REMOTE_NDIS_RESET_CMPLT 0x80000006
|
||||
#define REMOTE_NDIS_KEEPALIVE_CMPLT 0x80000008
|
||||
|
||||
#define REMOTE_CONDIS_MP_CREATE_VC_CMPLT 0x80008001
|
||||
#define REMOTE_CONDIS_MP_DELETE_VC_CMPLT 0x80008002
|
||||
#define REMOTE_CONDIS_MP_ACTIVATE_VC_CMPLT 0x80008005
|
||||
#define REMOTE_CONDIS_MP_DEACTIVATE_VC_CMPLT 0x80008006
|
||||
|
||||
//
|
||||
// Reserved message type for private communication between lower-layer
|
||||
// host driver and remote device, if necessary.
|
||||
//
|
||||
#define REMOTE_NDIS_BUS_MSG 0xff000001
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Defines for DeviceFlags in RNDIS_INITIALIZE_COMPLETE
|
||||
//
|
||||
#define RNDIS_DF_CONNECTIONLESS 0x00000001
|
||||
#define RNDIS_DF_CONNECTION_ORIENTED 0x00000002
|
||||
#define RNDIS_DF_RAW_DATA 0x00000004
|
||||
|
||||
//
|
||||
// Remote NDIS medium types.
|
||||
//
|
||||
#define RNdisMedium802_3 0x00000000
|
||||
#define RNdisMedium802_5 0x00000001
|
||||
#define RNdisMediumFddi 0x00000002
|
||||
#define RNdisMediumWan 0x00000003
|
||||
#define RNdisMediumLocalTalk 0x00000004
|
||||
#define RNdisMediumArcnetRaw 0x00000006
|
||||
#define RNdisMediumArcnet878_2 0x00000007
|
||||
#define RNdisMediumAtm 0x00000008
|
||||
#define RNdisMediumWirelessWan 0x00000009
|
||||
#define RNdisMediumIrda 0x0000000a
|
||||
#define RNdisMediumCoWan 0x0000000b
|
||||
#define RNdisMediumMax 0x0000000d // Not a real medium, defined as an upper-bound
|
||||
|
||||
//
|
||||
// Remote NDIS medium connection states.
|
||||
//
|
||||
#define RNdisMediaStateConnected 0x00000000
|
||||
#define RNdisMediaStateDisconnected 0x00000001
|
||||
|
||||
//
|
||||
// Remote NDIS version numbers
|
||||
//
|
||||
#define RNDIS_MAJOR_VERSION 0x00000001
|
||||
#define RNDIS_MINOR_VERSION 0x00000000
|
||||
|
||||
//
|
||||
// NdisInitialize message
|
||||
//
|
||||
typedef struct _RNDIS_INITIALIZE_REQUEST
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
UINT32 MajorVersion;
|
||||
UINT32 MinorVersion;
|
||||
UINT32 MaxTransferSize;
|
||||
} RNDIS_INITIALIZE_REQUEST, *PRNDIS_INITIALIZE_REQUEST;
|
||||
|
||||
|
||||
//
|
||||
// Response to NdisInitialize
|
||||
//
|
||||
typedef struct _RNDIS_INITIALIZE_COMPLETE
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_STATUS Status;
|
||||
UINT32 MajorVersion;
|
||||
UINT32 MinorVersion;
|
||||
UINT32 DeviceFlags;
|
||||
RNDIS_MEDIUM Medium;
|
||||
UINT32 MaxPacketsPerMessage;
|
||||
UINT32 MaxTransferSize;
|
||||
UINT32 PacketAlignmentFactor;
|
||||
UINT32 AFListOffset;
|
||||
UINT32 AFListSize;
|
||||
} RNDIS_INITIALIZE_COMPLETE, *PRNDIS_INITIALIZE_COMPLETE;
|
||||
|
||||
|
||||
//
|
||||
// Call manager devices only: Information about an address family
|
||||
// supported by the device is appended to the response to NdisInitialize.
|
||||
//
|
||||
typedef struct _RNDIS_CO_ADDRESS_FAMILY
|
||||
{
|
||||
RNDIS_AF AddressFamily;
|
||||
UINT32 MajorVersion;
|
||||
UINT32 MinorVersion;
|
||||
} RNDIS_CO_ADDRESS_FAMILY, *PRNDIS_CO_ADDRESS_FAMILY;
|
||||
|
||||
|
||||
//
|
||||
// NdisHalt message
|
||||
//
|
||||
typedef struct _RNDIS_HALT_REQUEST
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
} RNDIS_HALT_REQUEST, *PRNDIS_HALT_REQUEST;
|
||||
|
||||
|
||||
//
|
||||
// NdisQueryRequest message
|
||||
//
|
||||
typedef struct _RNDIS_QUERY_REQUEST
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_OID Oid;
|
||||
UINT32 InformationBufferLength;
|
||||
UINT32 InformationBufferOffset;
|
||||
RNDIS_HANDLE DeviceVcHandle;
|
||||
} RNDIS_QUERY_REQUEST, *PRNDIS_QUERY_REQUEST;
|
||||
|
||||
|
||||
//
|
||||
// Response to NdisQueryRequest
|
||||
//
|
||||
typedef struct _RNDIS_QUERY_COMPLETE
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_STATUS Status;
|
||||
UINT32 InformationBufferLength;
|
||||
UINT32 InformationBufferOffset;
|
||||
} RNDIS_QUERY_COMPLETE, *PRNDIS_QUERY_COMPLETE;
|
||||
|
||||
|
||||
//
|
||||
// NdisSetRequest message
|
||||
//
|
||||
typedef struct _RNDIS_SET_REQUEST
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_OID Oid;
|
||||
UINT32 InformationBufferLength;
|
||||
UINT32 InformationBufferOffset;
|
||||
RNDIS_HANDLE DeviceVcHandle;
|
||||
} RNDIS_SET_REQUEST, *PRNDIS_SET_REQUEST;
|
||||
|
||||
|
||||
//
|
||||
// Response to NdisSetRequest
|
||||
//
|
||||
typedef struct _RNDIS_SET_COMPLETE
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_STATUS Status;
|
||||
} RNDIS_SET_COMPLETE, *PRNDIS_SET_COMPLETE;
|
||||
|
||||
|
||||
//
|
||||
// NdisReset message
|
||||
//
|
||||
typedef struct _RNDIS_RESET_REQUEST
|
||||
{
|
||||
UINT32 Reserved;
|
||||
} RNDIS_RESET_REQUEST, *PRNDIS_RESET_REQUEST;
|
||||
|
||||
//
|
||||
// Response to NdisReset
|
||||
//
|
||||
typedef struct _RNDIS_RESET_COMPLETE
|
||||
{
|
||||
RNDIS_STATUS Status;
|
||||
UINT32 AddressingReset;
|
||||
} RNDIS_RESET_COMPLETE, *PRNDIS_RESET_COMPLETE;
|
||||
|
||||
|
||||
//
|
||||
// NdisMIndicateStatus message
|
||||
//
|
||||
typedef struct _RNDIS_INDICATE_STATUS
|
||||
{
|
||||
RNDIS_STATUS Status;
|
||||
UINT32 StatusBufferLength;
|
||||
UINT32 StatusBufferOffset;
|
||||
} RNDIS_INDICATE_STATUS, *PRNDIS_INDICATE_STATUS;
|
||||
|
||||
|
||||
//
|
||||
// Diagnostic information passed as the status buffer in
|
||||
// RNDIS_INDICATE_STATUS messages signifying error conditions.
|
||||
//
|
||||
typedef struct _RNDIS_DIAGNOSTIC_INFO
|
||||
{
|
||||
RNDIS_STATUS DiagStatus;
|
||||
UINT32 ErrorOffset;
|
||||
} RNDIS_DIAGNOSTIC_INFO, *PRNDIS_DIAGNOSTIC_INFO;
|
||||
|
||||
|
||||
|
||||
//
|
||||
// NdisKeepAlive message
|
||||
//
|
||||
typedef struct _RNDIS_KEEPALIVE_REQUEST
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
} RNDIS_KEEPALIVE_REQUEST, *PRNDIS_KEEPALIVE_REQUEST;
|
||||
|
||||
|
||||
//
|
||||
// Response to NdisKeepAlive
|
||||
//
|
||||
typedef struct _RNDIS_KEEPALIVE_COMPLETE
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_STATUS Status;
|
||||
} RNDIS_KEEPALIVE_COMPLETE, *PRNDIS_KEEPALIVE_COMPLETE;
|
||||
|
||||
|
||||
//
|
||||
// Data message. All Offset fields contain byte offsets from the beginning
|
||||
// of the RNDIS_PACKET structure. All Length fields are in bytes.
|
||||
// VcHandle is set to 0 for connectionless data, otherwise it
|
||||
// contains the VC handle.
|
||||
//
|
||||
typedef struct _RNDIS_PACKET
|
||||
{
|
||||
UINT32 DataOffset;
|
||||
UINT32 DataLength;
|
||||
UINT32 OOBDataOffset;
|
||||
UINT32 OOBDataLength;
|
||||
UINT32 NumOOBDataElements;
|
||||
UINT32 PerPacketInfoOffset;
|
||||
UINT32 PerPacketInfoLength;
|
||||
RNDIS_HANDLE VcHandle;
|
||||
UINT32 Reserved;
|
||||
} RNDIS_PACKET, *PRNDIS_PACKET;
|
||||
|
||||
//
|
||||
// Optional Out of Band data associated with a Data message.
|
||||
//
|
||||
typedef struct _RNDIS_OOBD
|
||||
{
|
||||
UINT32 Size;
|
||||
RNDIS_CLASS_ID Type;
|
||||
UINT32 ClassInformationOffset;
|
||||
} RNDIS_OOBD, *PRNDIS_OOBD;
|
||||
|
||||
//
|
||||
// Packet extension field contents associated with a Data message.
|
||||
//
|
||||
typedef struct _RNDIS_PER_PACKET_INFO
|
||||
{
|
||||
UINT32 Size;
|
||||
UINT32 Type;
|
||||
UINT32 PerPacketInformationOffset;
|
||||
} RNDIS_PER_PACKET_INFO, *PRNDIS_PER_PACKET_INFO;
|
||||
|
||||
|
||||
//
|
||||
// Format of Information buffer passed in a SetRequest for the OID
|
||||
// OID_GEN_RNDIS_CONFIG_PARAMETER.
|
||||
//
|
||||
typedef struct _RNDIS_CONFIG_PARAMETER_INFO
|
||||
{
|
||||
UINT32 ParameterNameOffset;
|
||||
UINT32 ParameterNameLength;
|
||||
UINT32 ParameterType;
|
||||
UINT32 ParameterValueOffset;
|
||||
UINT32 ParameterValueLength;
|
||||
} RNDIS_CONFIG_PARAMETER_INFO, *PRNDIS_CONFIG_PARAMETER_INFO;
|
||||
|
||||
//
|
||||
// Values for ParameterType in RNDIS_CONFIG_PARAMETER_INFO
|
||||
//
|
||||
#define RNDIS_CONFIG_PARAM_TYPE_INTEGER 0
|
||||
#define RNDIS_CONFIG_PARAM_TYPE_STRING 2
|
||||
|
||||
|
||||
//
|
||||
// CONDIS Miniport messages for connection oriented devices
|
||||
// that do not implement a call manager.
|
||||
//
|
||||
|
||||
//
|
||||
// CoNdisMiniportCreateVc message
|
||||
//
|
||||
typedef struct _RCONDIS_MP_CREATE_VC
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_HANDLE NdisVcHandle;
|
||||
} RCONDIS_MP_CREATE_VC, *PRCONDIS_MP_CREATE_VC;
|
||||
|
||||
//
|
||||
// Response to CoNdisMiniportCreateVc
|
||||
//
|
||||
typedef struct _RCONDIS_MP_CREATE_VC_COMPLETE
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_HANDLE DeviceVcHandle;
|
||||
RNDIS_STATUS Status;
|
||||
} RCONDIS_MP_CREATE_VC_COMPLETE, *PRCONDIS_MP_CREATE_VC_COMPLETE;
|
||||
|
||||
|
||||
//
|
||||
// CoNdisMiniportDeleteVc message
|
||||
//
|
||||
typedef struct _RCONDIS_MP_DELETE_VC
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_HANDLE DeviceVcHandle;
|
||||
} RCONDIS_MP_DELETE_VC, *PRCONDIS_MP_DELETE_VC;
|
||||
|
||||
//
|
||||
// Response to CoNdisMiniportDeleteVc
|
||||
//
|
||||
typedef struct _RCONDIS_MP_DELETE_VC_COMPLETE
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_STATUS Status;
|
||||
} RCONDIS_MP_DELETE_VC_COMPLETE, *PRCONDIS_MP_DELETE_VC_COMPLETE;
|
||||
|
||||
|
||||
//
|
||||
// CoNdisMiniportQueryRequest message
|
||||
//
|
||||
typedef struct _RCONDIS_MP_QUERY_REQUEST
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_REQUEST_TYPE RequestType;
|
||||
RNDIS_OID Oid;
|
||||
RNDIS_HANDLE DeviceVcHandle;
|
||||
UINT32 InformationBufferLength;
|
||||
UINT32 InformationBufferOffset;
|
||||
} RCONDIS_MP_QUERY_REQUEST, *PRCONDIS_MP_QUERY_REQUEST;
|
||||
|
||||
|
||||
//
|
||||
// CoNdisMiniportSetRequest message
|
||||
//
|
||||
typedef struct _RCONDIS_MP_SET_REQUEST
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_REQUEST_TYPE RequestType;
|
||||
RNDIS_OID Oid;
|
||||
RNDIS_HANDLE DeviceVcHandle;
|
||||
UINT32 InformationBufferLength;
|
||||
UINT32 InformationBufferOffset;
|
||||
} RCONDIS_MP_SET_REQUEST, *PRCONDIS_MP_SET_REQUEST;
|
||||
|
||||
|
||||
//
|
||||
// CoNdisIndicateStatus message
|
||||
//
|
||||
typedef struct _RCONDIS_INDICATE_STATUS
|
||||
{
|
||||
RNDIS_HANDLE NdisVcHandle;
|
||||
RNDIS_STATUS Status;
|
||||
UINT32 StatusBufferLength;
|
||||
UINT32 StatusBufferOffset;
|
||||
} RCONDIS_INDICATE_STATUS, *PRCONDIS_INDICATE_STATUS;
|
||||
|
||||
|
||||
//
|
||||
// CONDIS Call/VC parameters
|
||||
//
|
||||
|
||||
typedef struct _RCONDIS_SPECIFIC_PARAMETERS
|
||||
{
|
||||
UINT32 ParameterType;
|
||||
UINT32 ParameterLength;
|
||||
UINT32 ParameterOffset;
|
||||
} RCONDIS_SPECIFIC_PARAMETERS, *PRCONDIS_SPECIFIC_PARAMETERS;
|
||||
|
||||
typedef struct _RCONDIS_MEDIA_PARAMETERS
|
||||
{
|
||||
UINT32 Flags;
|
||||
UINT32 Reserved1;
|
||||
UINT32 Reserved2;
|
||||
RCONDIS_SPECIFIC_PARAMETERS MediaSpecific;
|
||||
} RCONDIS_MEDIA_PARAMETERS, *PRCONDIS_MEDIA_PARAMETERS;
|
||||
|
||||
|
||||
typedef struct _RNDIS_FLOWSPEC
|
||||
{
|
||||
UINT32 TokenRate;
|
||||
UINT32 TokenBucketSize;
|
||||
UINT32 PeakBandwidth;
|
||||
UINT32 Latency;
|
||||
UINT32 DelayVariation;
|
||||
UINT32 ServiceType;
|
||||
UINT32 MaxSduSize;
|
||||
UINT32 MinimumPolicedSize;
|
||||
} RNDIS_FLOWSPEC, *PRNDIS_FLOWSPEC;
|
||||
|
||||
typedef struct _RCONDIS_CALL_MANAGER_PARAMETERS
|
||||
{
|
||||
RNDIS_FLOWSPEC Transmit;
|
||||
RNDIS_FLOWSPEC Receive;
|
||||
RCONDIS_SPECIFIC_PARAMETERS CallMgrSpecific;
|
||||
} RCONDIS_CALL_MANAGER_PARAMETERS, *PRCONDIS_CALL_MANAGER_PARAMETERS;
|
||||
|
||||
//
|
||||
// CoNdisMiniportActivateVc message
|
||||
//
|
||||
typedef struct _RCONDIS_MP_ACTIVATE_VC_REQUEST
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
UINT32 Flags;
|
||||
RNDIS_HANDLE DeviceVcHandle;
|
||||
UINT32 MediaParamsOffset;
|
||||
UINT32 MediaParamsLength;
|
||||
UINT32 CallMgrParamsOffset;
|
||||
UINT32 CallMgrParamsLength;
|
||||
} RCONDIS_MP_ACTIVATE_VC_REQUEST, *PRCONDIS_MP_ACTIVATE_VC_REQUEST;
|
||||
|
||||
//
|
||||
// Response to CoNdisMiniportActivateVc
|
||||
//
|
||||
typedef struct _RCONDIS_MP_ACTIVATE_VC_COMPLETE
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_STATUS Status;
|
||||
} RCONDIS_MP_ACTIVATE_VC_COMPLETE, *PRCONDIS_MP_ACTIVATE_VC_COMPLETE;
|
||||
|
||||
|
||||
//
|
||||
// CoNdisMiniportDeactivateVc message
|
||||
//
|
||||
typedef struct _RCONDIS_MP_DEACTIVATE_VC_REQUEST
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
UINT32 Flags;
|
||||
RNDIS_HANDLE DeviceVcHandle;
|
||||
} RCONDIS_MP_DEACTIVATE_VC_REQUEST, *PRCONDIS_MP_DEACTIVATE_VC_REQUEST;
|
||||
|
||||
//
|
||||
// Response to CoNdisMiniportDeactivateVc
|
||||
//
|
||||
typedef struct _RCONDIS_MP_DEACTIVATE_VC_COMPLETE
|
||||
{
|
||||
RNDIS_REQUEST_ID RequestId;
|
||||
RNDIS_STATUS Status;
|
||||
} RCONDIS_MP_DEACTIVATE_VC_COMPLETE, *PRCONDIS_MP_DEACTIVATE_VC_COMPLETE;
|
||||
|
||||
|
||||
//
|
||||
// union with all of the RNDIS messages
|
||||
//
|
||||
typedef union _RNDIS_MESSAGE_CONTAINER
|
||||
{
|
||||
RNDIS_PACKET Packet;
|
||||
RNDIS_INITIALIZE_REQUEST InitializeRequest;
|
||||
RNDIS_HALT_REQUEST HaltRequest;
|
||||
RNDIS_QUERY_REQUEST QueryRequest;
|
||||
RNDIS_SET_REQUEST SetRequest;
|
||||
RNDIS_RESET_REQUEST ResetRequest;
|
||||
RNDIS_KEEPALIVE_REQUEST KeepaliveRequest;
|
||||
RNDIS_INDICATE_STATUS IndicateStatus;
|
||||
RNDIS_INITIALIZE_COMPLETE InitializeComplete;
|
||||
RNDIS_QUERY_COMPLETE QueryComplete;
|
||||
RNDIS_SET_COMPLETE SetComplete;
|
||||
RNDIS_RESET_COMPLETE ResetComplete;
|
||||
RNDIS_KEEPALIVE_COMPLETE KeepaliveComplete;
|
||||
RCONDIS_MP_CREATE_VC CoMiniportCreateVc;
|
||||
RCONDIS_MP_DELETE_VC CoMiniportDeleteVc;
|
||||
RCONDIS_INDICATE_STATUS CoIndicateStatus;
|
||||
RCONDIS_MP_ACTIVATE_VC_REQUEST CoMiniportActivateVc;
|
||||
RCONDIS_MP_DEACTIVATE_VC_REQUEST CoMiniportDeactivateVc;
|
||||
RCONDIS_MP_CREATE_VC_COMPLETE CoMiniportCreateVcComplete;
|
||||
RCONDIS_MP_DELETE_VC_COMPLETE CoMiniportDeleteVcComplete;
|
||||
RCONDIS_MP_ACTIVATE_VC_COMPLETE CoMiniportActivateVcComplete;
|
||||
RCONDIS_MP_DEACTIVATE_VC_COMPLETE CoMiniportDeactivateVcComplete;
|
||||
|
||||
|
||||
} RNDIS_MESSAGE_CONTAINER, *PRNDIS_MESSAGE_CONTAINER;
|
||||
|
||||
//
|
||||
// Remote NDIS message format
|
||||
//
|
||||
typedef __struct_bcount(MessageLength) struct _RNDIS_MESSAGE
|
||||
{
|
||||
UINT32 NdisMessageType;
|
||||
|
||||
//
|
||||
// Total length of this message, from the beginning
|
||||
// of the RNDIS_MESSAGE struct, in bytes.
|
||||
//
|
||||
UINT32 MessageLength;
|
||||
|
||||
// Actual message
|
||||
RNDIS_MESSAGE_CONTAINER Message;
|
||||
|
||||
} RNDIS_MESSAGE, *PRNDIS_MESSAGE;
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Handy macros
|
||||
|
||||
// get the size of an RNDIS message. Pass in the message type,
|
||||
// RNDIS_SET_REQUEST, RNDIS_PACKET for example
|
||||
#define RNDIS_MESSAGE_SIZE(Message) \
|
||||
(sizeof(Message) + (sizeof(RNDIS_MESSAGE) - sizeof(RNDIS_MESSAGE_CONTAINER)))
|
||||
|
||||
// get pointer to info buffer with message pointer
|
||||
#define MESSAGE_TO_INFO_BUFFER(Message) \
|
||||
(((PUCHAR)(Message)) + Message->InformationBufferOffset)
|
||||
|
||||
// get pointer to status buffer with message pointer
|
||||
#define MESSAGE_TO_STATUS_BUFFER(Message) \
|
||||
(((PUCHAR)(Message)) + Message->StatusBufferOffset)
|
||||
|
||||
// get pointer to OOBD buffer with message pointer
|
||||
#define MESSAGE_TO_OOBD_BUFFER(Message) \
|
||||
(((PUCHAR)(Message)) + Message->OOBDataOffset)
|
||||
|
||||
// get pointer to data buffer with message pointer
|
||||
#define MESSAGE_TO_DATA_BUFFER(Message) \
|
||||
(((PUCHAR)(Message)) + Message->PerPacketInfoOffset)
|
||||
|
||||
// get pointer to contained message from NDIS_MESSAGE pointer
|
||||
#define RNDIS_MESSAGE_PTR_TO_MESSAGE_PTR(RndisMessage) \
|
||||
((PVOID) &RndisMessage->Message)
|
||||
|
||||
// get pointer to contained message from NDIS_MESSAGE pointer
|
||||
#define RNDIS_MESSAGE_RAW_PTR_TO_MESSAGE_PTR(RndisMessage) \
|
||||
((PVOID) RndisMessage)
|
||||
|
||||
#endif // _RNDIS_H_
|
309
drivers/staging/hv/include/vstorage.h
Normal file
309
drivers/staging/hv/include/vstorage.h
Normal file
@ -0,0 +1,309 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2009, Microsoft Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
* Place - Suite 330, Boston, MA 02111-1307 USA.
|
||||
*
|
||||
* Authors:
|
||||
* Haiyang Zhang <haiyangz@microsoft.com>
|
||||
* Hank Janssen <hjanssen@microsoft.com>
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
//#include <vmbuspacketformat.h>
|
||||
//#include <ntddscsi.h>
|
||||
|
||||
#define C_ASSERT(x)
|
||||
//
|
||||
// public interface to the server
|
||||
//
|
||||
|
||||
//
|
||||
// Storvsp device interface guid
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// Protocol versions.
|
||||
//
|
||||
|
||||
//
|
||||
// vstorage.w revision number. This is used in the case of a version match,
|
||||
// to alert the user that structure sizes may be mismatched even though the
|
||||
// protocol versions match.
|
||||
//
|
||||
|
||||
#define REVISION_STRING(REVISION_) #REVISION_
|
||||
#define FILL_VMSTOR_REVISION(RESULT_LVALUE_) \
|
||||
{ \
|
||||
char *revisionString = REVISION_STRING($Revision: 6 $) + 11; \
|
||||
RESULT_LVALUE_ = 0; \
|
||||
while (*revisionString >= '0' && *revisionString <= '9') \
|
||||
{ \
|
||||
RESULT_LVALUE_ *= 10; \
|
||||
RESULT_LVALUE_ += *revisionString - '0'; \
|
||||
revisionString++; \
|
||||
} \
|
||||
}
|
||||
|
||||
//
|
||||
// Major/minor macros. Minor version is in LSB, meaning that earlier flat
|
||||
// version numbers will be interpreted as "0.x" (i.e., 1 becomes 0.1).
|
||||
//
|
||||
|
||||
#define VMSTOR_PROTOCOL_MAJOR(VERSION_) (((VERSION_) >> 8) & 0xff)
|
||||
#define VMSTOR_PROTOCOL_MINOR(VERSION_) (((VERSION_) ) & 0xff)
|
||||
#define VMSTOR_PROTOCOL_VERSION(MAJOR_, MINOR_) ((((MAJOR_) & 0xff) << 8) | \
|
||||
(((MINOR_) & 0xff) ))
|
||||
|
||||
//
|
||||
// Invalid version.
|
||||
//
|
||||
|
||||
#define VMSTOR_INVALID_PROTOCOL_VERSION -1
|
||||
|
||||
//
|
||||
// Version history:
|
||||
// V1 Beta 0.1
|
||||
// V1 RC < 2008/1/31 1.0
|
||||
// V1 RC > 2008/1/31 2.0
|
||||
//
|
||||
#define VMSTOR_PROTOCOL_VERSION_CURRENT VMSTOR_PROTOCOL_VERSION(2, 0)
|
||||
|
||||
|
||||
//
|
||||
// This will get replaced with the max transfer length that is possible on
|
||||
// the host adapter.
|
||||
// The max transfer length will be published when we offer a vmbus channel.
|
||||
//
|
||||
|
||||
#define MAX_TRANSFER_LENGTH 0x40000
|
||||
#define DEFAULT_PACKET_SIZE (sizeof(VMDATA_GPA_DIRECT) + \
|
||||
sizeof(VSTOR_PACKET) + \
|
||||
(sizeof(UINT64) * (MAX_TRANSFER_LENGTH / PAGE_SIZE)))
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Packet structure describing virtual storage requests.
|
||||
//
|
||||
|
||||
typedef enum
|
||||
{
|
||||
VStorOperationCompleteIo = 1,
|
||||
VStorOperationRemoveDevice = 2,
|
||||
VStorOperationExecuteSRB = 3,
|
||||
VStorOperationResetLun = 4,
|
||||
VStorOperationResetAdapter = 5,
|
||||
VStorOperationResetBus = 6,
|
||||
VStorOperationBeginInitialization = 7,
|
||||
VStorOperationEndInitialization = 8,
|
||||
VStorOperationQueryProtocolVersion = 9,
|
||||
VStorOperationQueryProperties = 10,
|
||||
VStorOperationMaximum = 10
|
||||
|
||||
} VSTOR_PACKET_OPERATION;
|
||||
|
||||
|
||||
//
|
||||
// Platform neutral description of a scsi request -
|
||||
// this remains the same across the write regardless of 32/64 bit
|
||||
// note: it's patterned off the SCSI_PASS_THROUGH structure
|
||||
//
|
||||
|
||||
|
||||
#pragma pack(push,1)
|
||||
|
||||
|
||||
#define CDB16GENERIC_LENGTH 0x10
|
||||
|
||||
#ifndef SENSE_BUFFER_SIZE
|
||||
#define SENSE_BUFFER_SIZE 0x12
|
||||
#endif
|
||||
C_ASSERT(SENSE_BUFFER_SIZE == 0x12);
|
||||
|
||||
#define MAX_DATA_BUFFER_LENGTH_WITH_PADDING 0x14
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
USHORT Length;
|
||||
UCHAR SrbStatus;
|
||||
UCHAR ScsiStatus;
|
||||
|
||||
UCHAR PortNumber;
|
||||
UCHAR PathId;
|
||||
UCHAR TargetId;
|
||||
UCHAR Lun;
|
||||
|
||||
UCHAR CdbLength;
|
||||
UCHAR SenseInfoLength;
|
||||
UCHAR DataIn;
|
||||
UCHAR Reserved;
|
||||
|
||||
ULONG DataTransferLength;
|
||||
|
||||
union
|
||||
{
|
||||
UCHAR Cdb[CDB16GENERIC_LENGTH];
|
||||
|
||||
UCHAR SenseData[SENSE_BUFFER_SIZE];
|
||||
|
||||
UCHAR ReservedArray[MAX_DATA_BUFFER_LENGTH_WITH_PADDING];
|
||||
};
|
||||
|
||||
} VMSCSI_REQUEST, *PVMSCSI_REQUEST;
|
||||
|
||||
C_ASSERT((sizeof(VMSCSI_REQUEST) % 4) == 0);
|
||||
|
||||
|
||||
//
|
||||
// This structure is sent during the intialization phase to get the different
|
||||
// properties of the channel.
|
||||
//
|
||||
|
||||
typedef struct
|
||||
{
|
||||
USHORT ProtocolVersion;
|
||||
UCHAR PathId;
|
||||
UCHAR TargetId;
|
||||
|
||||
//
|
||||
// Note: port number is only really known on the client side
|
||||
//
|
||||
ULONG PortNumber;
|
||||
|
||||
ULONG Flags;
|
||||
|
||||
ULONG MaxTransferBytes;
|
||||
|
||||
//
|
||||
// This id is unique for each channel and will correspond with
|
||||
// vendor specific data in the inquirydata
|
||||
//
|
||||
|
||||
ULONGLONG UniqueId;
|
||||
|
||||
} VMSTORAGE_CHANNEL_PROPERTIES, *PVMSTORAGE_CHANNEL_PROPERTIES;
|
||||
|
||||
C_ASSERT((sizeof(VMSTORAGE_CHANNEL_PROPERTIES) % 4) == 0);
|
||||
|
||||
|
||||
//
|
||||
// This structure is sent during the storage protocol negotiations.
|
||||
//
|
||||
|
||||
typedef struct
|
||||
{
|
||||
//
|
||||
// Major (MSW) and minor (LSW) version numbers.
|
||||
//
|
||||
|
||||
USHORT MajorMinor;
|
||||
|
||||
|
||||
//
|
||||
// Revision number is auto-incremented whenever this file is changed
|
||||
// (See FILL_VMSTOR_REVISION macro above). Mismatch does not definitely
|
||||
// indicate incompatibility--but it does indicate mismatched builds.
|
||||
//
|
||||
|
||||
USHORT Revision;
|
||||
|
||||
} VMSTORAGE_PROTOCOL_VERSION, *PVMSTORAGE_PROTOCOL_VERSION;
|
||||
|
||||
C_ASSERT((sizeof(VMSTORAGE_PROTOCOL_VERSION) % 4) == 0);
|
||||
|
||||
|
||||
//
|
||||
// Channel Property Flags
|
||||
//
|
||||
|
||||
#define STORAGE_CHANNEL_REMOVABLE_FLAG 0x1
|
||||
#define STORAGE_CHANNEL_EMULATED_IDE_FLAG 0x2
|
||||
|
||||
|
||||
typedef struct _VSTOR_PACKET
|
||||
{
|
||||
//
|
||||
// Requested operation type
|
||||
//
|
||||
|
||||
VSTOR_PACKET_OPERATION Operation;
|
||||
|
||||
//
|
||||
// Flags - see below for values
|
||||
//
|
||||
|
||||
ULONG Flags;
|
||||
|
||||
//
|
||||
// Status of the request returned from the server side.
|
||||
//
|
||||
|
||||
ULONG Status;
|
||||
|
||||
//
|
||||
// Data payload area
|
||||
//
|
||||
|
||||
union
|
||||
{
|
||||
//
|
||||
// Structure used to forward SCSI commands from the client to the server.
|
||||
//
|
||||
|
||||
VMSCSI_REQUEST VmSrb;
|
||||
|
||||
//
|
||||
// Structure used to query channel properties.
|
||||
//
|
||||
|
||||
VMSTORAGE_CHANNEL_PROPERTIES StorageChannelProperties;
|
||||
|
||||
//
|
||||
// Used during version negotiations.
|
||||
//
|
||||
|
||||
VMSTORAGE_PROTOCOL_VERSION Version;
|
||||
};
|
||||
|
||||
} VSTOR_PACKET, *PVSTOR_PACKET;
|
||||
|
||||
C_ASSERT((sizeof(VSTOR_PACKET) % 4) == 0);
|
||||
|
||||
//
|
||||
// Packet flags
|
||||
//
|
||||
|
||||
//
|
||||
// This flag indicates that the server should send back a completion for this
|
||||
// packet.
|
||||
//
|
||||
|
||||
#define REQUEST_COMPLETION_FLAG 0x1
|
||||
|
||||
//
|
||||
// This is the set of flags that the vsc can set in any packets it sends
|
||||
//
|
||||
|
||||
#define VSC_LEGAL_FLAGS (REQUEST_COMPLETION_FLAG)
|
||||
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user