Loading drivers/staging/hv/include/HvSynicApi.h +205 −355 Original line number Diff line number Diff line Loading @@ -21,27 +21,19 @@ * */ #pragma once #ifndef __HVSYNICAPI_H #define __HVSYNICAPI_H /* 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) Loading @@ -64,316 +56,197 @@ #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(u32)) /* Define hypervisor message types. */ typedef enum _HV_MESSAGE_TYPE { 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 u32 HV_SYNIC_SINT_INDEX, *PHV_SYNIC_SINT_INDEX; /* Define partition identifier type. */ typedef u64 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 { typedef union _HV_CONNECTION_ID { u32 Asu32; struct { struct { u32 Id:24; u32 Reserved:8; } u; } HV_CONNECTION_ID, *PHV_CONNECTION_ID; /* Define port identifier type. */ typedef union _HV_PORT_ID { typedef union _HV_PORT_ID { u32 Asu32; struct { struct { u32 Id:24; u32 Reserved:8; } u ; } HV_PORT_ID, *PHV_PORT_ID; /* Define port type. */ typedef enum _HV_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 { typedef struct _HV_PORT_INFO { HV_PORT_TYPE PortType; u32 Padding; union { struct { union { struct { HV_SYNIC_SINT_INDEX TargetSint; u32 TargetVp; u64 RsvdZ; } MessagePortInfo; struct { struct { HV_SYNIC_SINT_INDEX TargetSint; u32 TargetVp; u16 BaseFlagNumber; u16 FlagCount; u32 RsvdZ; } EventPortInfo; struct { struct { u64 MonitorAddress; u64 RsvdZ; } MonitorPortInfo; }; } HV_PORT_INFO, *PHV_PORT_INFO; typedef const HV_PORT_INFO *PCHV_PORT_INFO; typedef struct _HV_CONNECTION_INFO { typedef struct _HV_CONNECTION_INFO { HV_PORT_TYPE PortType; u32 Padding; union { struct { union { struct { u64 RsvdZ; } MessageConnectionInfo; struct { struct { u64 RsvdZ; } EventConnectionInfo; struct { struct { u64 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 { typedef union _HV_MESSAGE_FLAGS { u8 Asu8; struct { struct { u8 MessagePending:1; u8 Reserved:7; }; } HV_MESSAGE_FLAGS, *PHV_MESSAGE_FLAGS; /* Define synthetic interrupt controller message header. */ typedef struct _HV_MESSAGE_HEADER { typedef struct _HV_MESSAGE_HEADER { HV_MESSAGE_TYPE MessageType; u8 PayloadSize; HV_MESSAGE_FLAGS MessageFlags; u8 Reserved[2]; union { 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 { typedef struct _HV_TIMER_MESSAGE_PAYLOAD { u32 TimerIndex; u32 Reserved; u64 ExpirationTime; /* When the timer expired */ u64 DeliveryTime; /* When the message was delivered */ } HV_TIMER_MESSAGE_PAYLOAD, *PHV_TIMER_MESSAGE_PAYLOAD; /* Define synthetic interrupt controller message format. */ typedef struct _HV_MESSAGE { typedef struct _HV_MESSAGE { HV_MESSAGE_HEADER Header; union { union { u64 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 { 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 { typedef union _HV_SYNIC_EVENT_FLAGS { u8 Flags8[HV_EVENT_FLAGS_BYTE_COUNT]; u32 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 { 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 { typedef union _HV_SYNIC_SCONTROL { u64 AsUINT64; struct { struct { u64 Enable:1; u64 Reserved:63; }; } HV_SYNIC_SCONTROL, *PHV_SYNIC_SCONTROL; /* Define synthetic interrupt source. */ typedef union _HV_SYNIC_SINT { typedef union _HV_SYNIC_SINT { u64 AsUINT64; struct { struct { u64 Vector:8; u64 Reserved1:8; u64 Masked:1; Loading @@ -382,15 +255,10 @@ typedef union _HV_SYNIC_SINT }; } HV_SYNIC_SINT, *PHV_SYNIC_SINT; /* Define the format of the SIMP register */ typedef union _HV_SYNIC_SIMP { typedef union _HV_SYNIC_SIMP { u64 AsUINT64; struct { struct { u64 SimpEnabled:1; u64 Preserved:11; u64 BaseSimpGpa:52; Loading @@ -399,55 +267,39 @@ typedef union _HV_SYNIC_SIMP /* Define the format of the SIEFP register */ typedef union _HV_SYNIC_SIEFP { typedef union _HV_SYNIC_SIEFP { u64 AsUINT64; struct { struct { u64 SiefpEnabled:1; u64 Preserved:11; u64 BaseSiefpGpa:52; }; } HV_SYNIC_SIEFP, *PHV_SYNIC_SIEFP; /* Definitions for the monitored notification facility */ typedef union _HV_MONITOR_TRIGGER_GROUP { typedef union _HV_MONITOR_TRIGGER_GROUP { u64 AsUINT64; struct { struct { u32 Pending; u32 Armed; }; } HV_MONITOR_TRIGGER_GROUP, *PHV_MONITOR_TRIGGER_GROUP; typedef struct _HV_MONITOR_PARAMETER { typedef struct _HV_MONITOR_PARAMETER { HV_CONNECTION_ID ConnectionId; u16 FlagNumber; u16 RsvdZ; } HV_MONITOR_PARAMETER, *PHV_MONITOR_PARAMETER; typedef union _HV_MONITOR_TRIGGER_STATE { typedef union _HV_MONITOR_TRIGGER_STATE { u32 Asu32; struct { struct { u32 GroupEnable:4; u32 RsvdZ:28; }; } HV_MONITOR_TRIGGER_STATE, *PHV_MONITOR_TRIGGER_STATE; /* HV_MONITOR_PAGE Layout */ /* ------------------------------------------------------ */ /* | 0 | TriggerState (4 bytes) | Rsvd1 (4 bytes) | */ Loading @@ -467,9 +319,7 @@ typedef union _HV_MONITOR_TRIGGER_STATE /* | ... | */ /* | 840 | Rsvd4[0] | */ /* ------------------------------------------------------ */ typedef struct _HV_MONITOR_PAGE { typedef struct _HV_MONITOR_PAGE { HV_MONITOR_TRIGGER_STATE TriggerState; u32 RsvdZ1; Loading @@ -484,7 +334,7 @@ typedef struct _HV_MONITOR_PAGE HV_MONITOR_PARAMETER Parameter[4][32]; u8 RsvdZ4[1984]; } HV_MONITOR_PAGE, *PHV_MONITOR_PAGE; typedef volatile HV_MONITOR_PAGE* PVHV_MONITOR_PAGE; #endif Loading
drivers/staging/hv/include/HvSynicApi.h +205 −355 Original line number Diff line number Diff line Loading @@ -21,27 +21,19 @@ * */ #pragma once #ifndef __HVSYNICAPI_H #define __HVSYNICAPI_H /* 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) Loading @@ -64,316 +56,197 @@ #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(u32)) /* Define hypervisor message types. */ typedef enum _HV_MESSAGE_TYPE { 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 u32 HV_SYNIC_SINT_INDEX, *PHV_SYNIC_SINT_INDEX; /* Define partition identifier type. */ typedef u64 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 { typedef union _HV_CONNECTION_ID { u32 Asu32; struct { struct { u32 Id:24; u32 Reserved:8; } u; } HV_CONNECTION_ID, *PHV_CONNECTION_ID; /* Define port identifier type. */ typedef union _HV_PORT_ID { typedef union _HV_PORT_ID { u32 Asu32; struct { struct { u32 Id:24; u32 Reserved:8; } u ; } HV_PORT_ID, *PHV_PORT_ID; /* Define port type. */ typedef enum _HV_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 { typedef struct _HV_PORT_INFO { HV_PORT_TYPE PortType; u32 Padding; union { struct { union { struct { HV_SYNIC_SINT_INDEX TargetSint; u32 TargetVp; u64 RsvdZ; } MessagePortInfo; struct { struct { HV_SYNIC_SINT_INDEX TargetSint; u32 TargetVp; u16 BaseFlagNumber; u16 FlagCount; u32 RsvdZ; } EventPortInfo; struct { struct { u64 MonitorAddress; u64 RsvdZ; } MonitorPortInfo; }; } HV_PORT_INFO, *PHV_PORT_INFO; typedef const HV_PORT_INFO *PCHV_PORT_INFO; typedef struct _HV_CONNECTION_INFO { typedef struct _HV_CONNECTION_INFO { HV_PORT_TYPE PortType; u32 Padding; union { struct { union { struct { u64 RsvdZ; } MessageConnectionInfo; struct { struct { u64 RsvdZ; } EventConnectionInfo; struct { struct { u64 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 { typedef union _HV_MESSAGE_FLAGS { u8 Asu8; struct { struct { u8 MessagePending:1; u8 Reserved:7; }; } HV_MESSAGE_FLAGS, *PHV_MESSAGE_FLAGS; /* Define synthetic interrupt controller message header. */ typedef struct _HV_MESSAGE_HEADER { typedef struct _HV_MESSAGE_HEADER { HV_MESSAGE_TYPE MessageType; u8 PayloadSize; HV_MESSAGE_FLAGS MessageFlags; u8 Reserved[2]; union { 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 { typedef struct _HV_TIMER_MESSAGE_PAYLOAD { u32 TimerIndex; u32 Reserved; u64 ExpirationTime; /* When the timer expired */ u64 DeliveryTime; /* When the message was delivered */ } HV_TIMER_MESSAGE_PAYLOAD, *PHV_TIMER_MESSAGE_PAYLOAD; /* Define synthetic interrupt controller message format. */ typedef struct _HV_MESSAGE { typedef struct _HV_MESSAGE { HV_MESSAGE_HEADER Header; union { union { u64 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 { 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 { typedef union _HV_SYNIC_EVENT_FLAGS { u8 Flags8[HV_EVENT_FLAGS_BYTE_COUNT]; u32 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 { 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 { typedef union _HV_SYNIC_SCONTROL { u64 AsUINT64; struct { struct { u64 Enable:1; u64 Reserved:63; }; } HV_SYNIC_SCONTROL, *PHV_SYNIC_SCONTROL; /* Define synthetic interrupt source. */ typedef union _HV_SYNIC_SINT { typedef union _HV_SYNIC_SINT { u64 AsUINT64; struct { struct { u64 Vector:8; u64 Reserved1:8; u64 Masked:1; Loading @@ -382,15 +255,10 @@ typedef union _HV_SYNIC_SINT }; } HV_SYNIC_SINT, *PHV_SYNIC_SINT; /* Define the format of the SIMP register */ typedef union _HV_SYNIC_SIMP { typedef union _HV_SYNIC_SIMP { u64 AsUINT64; struct { struct { u64 SimpEnabled:1; u64 Preserved:11; u64 BaseSimpGpa:52; Loading @@ -399,55 +267,39 @@ typedef union _HV_SYNIC_SIMP /* Define the format of the SIEFP register */ typedef union _HV_SYNIC_SIEFP { typedef union _HV_SYNIC_SIEFP { u64 AsUINT64; struct { struct { u64 SiefpEnabled:1; u64 Preserved:11; u64 BaseSiefpGpa:52; }; } HV_SYNIC_SIEFP, *PHV_SYNIC_SIEFP; /* Definitions for the monitored notification facility */ typedef union _HV_MONITOR_TRIGGER_GROUP { typedef union _HV_MONITOR_TRIGGER_GROUP { u64 AsUINT64; struct { struct { u32 Pending; u32 Armed; }; } HV_MONITOR_TRIGGER_GROUP, *PHV_MONITOR_TRIGGER_GROUP; typedef struct _HV_MONITOR_PARAMETER { typedef struct _HV_MONITOR_PARAMETER { HV_CONNECTION_ID ConnectionId; u16 FlagNumber; u16 RsvdZ; } HV_MONITOR_PARAMETER, *PHV_MONITOR_PARAMETER; typedef union _HV_MONITOR_TRIGGER_STATE { typedef union _HV_MONITOR_TRIGGER_STATE { u32 Asu32; struct { struct { u32 GroupEnable:4; u32 RsvdZ:28; }; } HV_MONITOR_TRIGGER_STATE, *PHV_MONITOR_TRIGGER_STATE; /* HV_MONITOR_PAGE Layout */ /* ------------------------------------------------------ */ /* | 0 | TriggerState (4 bytes) | Rsvd1 (4 bytes) | */ Loading @@ -467,9 +319,7 @@ typedef union _HV_MONITOR_TRIGGER_STATE /* | ... | */ /* | 840 | Rsvd4[0] | */ /* ------------------------------------------------------ */ typedef struct _HV_MONITOR_PAGE { typedef struct _HV_MONITOR_PAGE { HV_MONITOR_TRIGGER_STATE TriggerState; u32 RsvdZ1; Loading @@ -484,7 +334,7 @@ typedef struct _HV_MONITOR_PAGE HV_MONITOR_PARAMETER Parameter[4][32]; u8 RsvdZ4[1984]; } HV_MONITOR_PAGE, *PHV_MONITOR_PAGE; typedef volatile HV_MONITOR_PAGE* PVHV_MONITOR_PAGE; #endif