/* * * 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 * Hank Janssen * */ #ifndef __HV_API_H #define __HV_API_H /* Status codes for hypervisor operations. */ /* * HV_STATUS_SUCCESS * The specified hypercall succeeded */ #define HV_STATUS_SUCCESS ((u16)0x0000) /* * HV_STATUS_INVALID_HYPERCALL_CODE * The hypervisor does not support the operation because the specified * hypercall code is not supported. */ #define HV_STATUS_INVALID_HYPERCALL_CODE ((u16)0x0002) /* * HV_STATUS_INVALID_HYPERCALL_INPUT * The hypervisor does not support the operation because the encoding for the * hypercall input register is not supported. */ #define HV_STATUS_INVALID_HYPERCALL_INPUT ((u16)0x0003) /* * HV_STATUS_INVALID_ALIGNMENT * The hypervisor could not perform the operation beacuse a parameter has an * invalid alignment. */ #define HV_STATUS_INVALID_ALIGNMENT ((u16)0x0004) /* * HV_STATUS_INVALID_PARAMETER * The hypervisor could not perform the operation beacuse an invalid parameter * was specified. */ #define HV_STATUS_INVALID_PARAMETER ((u16)0x0005) /* * HV_STATUS_ACCESS_DENIED * Access to the specified object was denied. */ #define HV_STATUS_ACCESS_DENIED ((u16)0x0006) /* * HV_STATUS_INVALID_PARTITION_STATE * The hypervisor could not perform the operation because the partition is * entering or in an invalid state. */ #define HV_STATUS_INVALID_PARTITION_STATE ((u16)0x0007) /* * HV_STATUS_OPERATION_DENIED * The operation is not allowed in the current state. */ #define HV_STATUS_OPERATION_DENIED ((u16)0x0008) /* * HV_STATUS_UNKNOWN_PROPERTY * The hypervisor does not recognize the specified partition property. */ #define HV_STATUS_UNKNOWN_PROPERTY ((u16)0x0009) /* * HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE * The specified value of a partition property is out of range or violates an * invariant. */ #define HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE ((u16)0x000A) /* * HV_STATUS_INSUFFICIENT_MEMORY * There is not enough memory in the hypervisor pool to complete the operation. */ #define HV_STATUS_INSUFFICIENT_MEMORY ((u16)0x000B) /* * HV_STATUS_PARTITION_TOO_DEEP * The maximum partition depth has been exceeded for the partition hierarchy. */ #define HV_STATUS_PARTITION_TOO_DEEP ((u16)0x000C) /* * HV_STATUS_INVALID_PARTITION_ID * A partition with the specified partition Id does not exist. */ #define HV_STATUS_INVALID_PARTITION_ID ((u16)0x000D) /* * HV_STATUS_INVALID_VP_INDEX * The hypervisor could not perform the operation because the specified VP * index is invalid. */ #define HV_STATUS_INVALID_VP_INDEX ((u16)0x000E) /* * HV_STATUS_NOT_FOUND * The iteration is complete; no addition items in the iteration could be * found. */ #define HV_STATUS_NOT_FOUND ((u16)0x0010) /* * HV_STATUS_INVALID_PORT_ID * The hypervisor could not perform the operation because the specified port * identifier is invalid. */ #define HV_STATUS_INVALID_PORT_ID ((u16)0x0011) /* * HV_STATUS_INVALID_CONNECTION_ID * The hypervisor could not perform the operation because the specified * connection identifier is invalid. */ #define HV_STATUS_INVALID_CONNECTION_ID ((u16)0x0012) /* * HV_STATUS_INSUFFICIENT_BUFFERS * You did not supply enough message buffers to send a message. */ #define HV_STATUS_INSUFFICIENT_BUFFERS ((u16)0x0013) /* * HV_STATUS_NOT_ACKNOWLEDGED * The previous virtual interrupt has not been acknowledged. */ #define HV_STATUS_NOT_ACKNOWLEDGED ((u16)0x0014) /* * HV_STATUS_INVALID_VP_STATE * A virtual processor is not in the correct state for the performance of the * indicated operation. */ #define HV_STATUS_INVALID_VP_STATE ((u16)0x0015) /* * HV_STATUS_ACKNOWLEDGED * The previous virtual interrupt has already been acknowledged. */ #define HV_STATUS_ACKNOWLEDGED ((u16)0x0016) /* * HV_STATUS_INVALID_SAVE_RESTORE_STATE * The indicated partition is not in a valid state for saving or restoring. */ #define HV_STATUS_INVALID_SAVE_RESTORE_STATE ((u16)0x0017) /* * HV_STATUS_INVALID_SYNIC_STATE * 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 ((u16)0x0018) /* * HV_STATUS_OBJECT_IN_USE * 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 ((u16)0x0019) /* * HV_STATUS_INVALID_PROXIMITY_DOMAIN_INFO * The proximity domain information is invalid. */ #define HV_STATUS_INVALID_PROXIMITY_DOMAIN_INFO ((u16)0x001A) /* * HV_STATUS_NO_DATA * An attempt to retrieve debugging data failed because none was available. */ #define HV_STATUS_NO_DATA ((u16)0x001B) /* * HV_STATUS_INACTIVE * The physical connection being used for debuggging has not recorded any * receive activity since the last operation. */ #define HV_STATUS_INACTIVE ((u16)0x001C) /* * HV_STATUS_NO_RESOURCES * There are not enough resources to complete the operation. */ #define HV_STATUS_NO_RESOURCES ((u16)0x001D) /* * HV_STATUS_FEATURE_UNAVAILABLE * A hypervisor feature is not available to the user. */ #define HV_STATUS_FEATURE_UNAVAILABLE ((u16)0x001E) /* * HV_STATUS_UNSUCCESSFUL * {Operation Failed} The requested operation was unsuccessful. */ #define HV_STATUS_UNSUCCESSFUL ((u16)0x1001) /* * HV_STATUS_INSUFFICIENT_BUFFER * The specified buffer was too small to contain all of the requested data. */ #define HV_STATUS_INSUFFICIENT_BUFFER ((u16)0x1002) /* * HV_STATUS_GPA_NOT_PRESENT * The guest physical address is not currently associated with a system * physical address. */ #define HV_STATUS_GPA_NOT_PRESENT ((u16)0x1003) /* * HV_STATUS_GUEST_PAGE_FAULT * The operation would have resulted in a page fault in the guest. */ #define HV_STATUS_GUEST_PAGE_FAULT ((u16)0x1004) /* * HV_STATUS_RUNDOWN_DISABLED * The operation cannot proceed as the rundown object was marked disabled. */ #define HV_STATUS_RUNDOWN_DISABLED ((u16)0x1005) /* * HV_STATUS_KEY_ALREADY_EXISTS * The entry cannot be added as another entry with the same key already exists. */ #define HV_STATUS_KEY_ALREADY_EXISTS ((u16)0x1006) /* * HV_STATUS_GPA_INTERCEPT * The operation resulted an intercept on a region of guest physical memory. */ #define HV_STATUS_GPA_INTERCEPT ((u16)0x1007) /* * HV_STATUS_GUEST_GENERAL_PROTECTION_FAULT * The operation would have resulted in a general protection fault in the * guest. */ #define HV_STATUS_GUEST_GENERAL_PROTECTION_FAULT ((u16)0x1008) /* * HV_STATUS_GUEST_STACK_FAULT * The operation would have resulted in a stack fault in the guest. */ #define HV_STATUS_GUEST_STACK_FAULT ((u16)0x1009) /* * HV_STATUS_GUEST_INVALID_OPCODE_FAULT * The operation would have resulted in an invalid opcode fault in the guest. */ #define HV_STATUS_GUEST_INVALID_OPCODE_FAULT ((u16)0x100A) /* * HV_STATUS_FINALIZE_INCOMPLETE * The partition is not completely finalized. */ #define HV_STATUS_FINALIZE_INCOMPLETE ((u16)0x100B) /* * HV_STATUS_GUEST_MACHINE_CHECK_ABORT * The operation would have resulted in an machine check abort in the guest. */ #define HV_STATUS_GUEST_MACHINE_CHECK_ABORT ((u16)0x100C) /* * HV_STATUS_ILLEGAL_OVERLAY_ACCESS * An illegal access was attempted to an overlay page. */ #define HV_STATUS_ILLEGAL_OVERLAY_ACCESS ((u16)0x100D) /* * HV_STATUS_INSUFFICIENT_SYSTEM_VA * There is not enough system VA space available to satisfy the request, */ #define HV_STATUS_INSUFFICIENT_SYSTEM_VA ((u16)0x100E) /* * HV_STATUS_VIRTUAL_ADDRESS_NOT_MAPPED * The passed virtual address was not mapped in the hypervisor address space. */ #define HV_STATUS_VIRTUAL_ADDRESS_NOT_MAPPED ((u16)0x100F) /* * HV_STATUS_NOT_IMPLEMENTED * The requested operation is not implemented in this version of the * hypervisor. */ #define HV_STATUS_NOT_IMPLEMENTED ((u16)0x1010) /* * HV_STATUS_VMX_INSTRUCTION_FAILED * The requested VMX instruction failed to complete successfully. */ #define HV_STATUS_VMX_INSTRUCTION_FAILED ((u16)0x1011) /* * HV_STATUS_VMX_INSTRUCTION_FAILED_WITH_STATUS * The requested VMX instruction failed to complete successfully indicating * status. */ #define HV_STATUS_VMX_INSTRUCTION_FAILED_WITH_STATUS ((u16)0x1012) /* * HV_STATUS_MSR_ACCESS_FAILED * The requested access to the model specific register failed. */ #define HV_STATUS_MSR_ACCESS_FAILED ((u16)0x1013) /* * HV_STATUS_CR_ACCESS_FAILED * The requested access to the control register failed. */ #define HV_STATUS_CR_ACCESS_FAILED ((u16)0x1014) /* * HV_STATUS_TIMEOUT * The specified timeout expired before the operation completed. */ #define HV_STATUS_TIMEOUT ((u16)0x1016) /* * HV_STATUS_MSR_INTERCEPT * The requested access to the model specific register generated an intercept. */ #define HV_STATUS_MSR_INTERCEPT ((u16)0x1017) /* * HV_STATUS_CPUID_INTERCEPT * The CPUID instruction generated an intercept. */ #define HV_STATUS_CPUID_INTERCEPT ((u16)0x1018) /* * HV_STATUS_REPEAT_INSTRUCTION * The current instruction should be repeated and the instruction pointer not * advanced. */ #define HV_STATUS_REPEAT_INSTRUCTION ((u16)0x1019) /* * HV_STATUS_PAGE_PROTECTION_VIOLATION * The current instruction should be repeated and the instruction pointer not * advanced. */ #define HV_STATUS_PAGE_PROTECTION_VIOLATION ((u16)0x101A) /* * HV_STATUS_PAGE_TABLE_INVALID * The current instruction should be repeated and the instruction pointer not * advanced. */ #define HV_STATUS_PAGE_TABLE_INVALID ((u16)0x101B) /* * HV_STATUS_PAGE_NOT_PRESENT * The current instruction should be repeated and the instruction pointer not * advanced. */ #define HV_STATUS_PAGE_NOT_PRESENT ((u16)0x101C) /* * HV_STATUS_IO_INTERCEPT * The requested access to the I/O port generated an intercept. */ #define HV_STATUS_IO_INTERCEPT ((u16)0x101D) /* * HV_STATUS_NOTHING_TO_DO * There is nothing to do. */ #define HV_STATUS_NOTHING_TO_DO ((u16)0x101E) /* * HV_STATUS_THREAD_TERMINATING * The requested thread is terminating. */ #define HV_STATUS_THREAD_TERMINATING ((u16)0x101F) /* * HV_STATUS_SECTION_ALREADY_CONSTRUCTED * The specified section was already constructed. */ #define HV_STATUS_SECTION_ALREADY_CONSTRUCTED ((u16)0x1020) /* HV_STATUS_SECTION_NOT_ALREADY_CONSTRUCTED * The specified section was not already constructed. */ #define HV_STATUS_SECTION_NOT_ALREADY_CONSTRUCTED ((u16)0x1021) /* * HV_STATUS_PAGE_ALREADY_COMMITTED * The specified virtual address was already backed by physical memory. */ #define HV_STATUS_PAGE_ALREADY_COMMITTED ((u16)0x1022) /* * HV_STATUS_PAGE_NOT_ALREADY_COMMITTED * The specified virtual address was not already backed by physical memory. */ #define HV_STATUS_PAGE_NOT_ALREADY_COMMITTED ((u16)0x1023) /* * HV_STATUS_COMMITTED_PAGES_REMAIN * Committed pages remain in the section. */ #define HV_STATUS_COMMITTED_PAGES_REMAIN ((u16)0x1024) /* * HV_STATUS_NO_REMAINING_COMMITTED_PAGES * No additional committed pages beyond the specified page exist in the * section. */ #define HV_STATUS_NO_REMAINING_COMMITTED_PAGES ((u16)0x1025) /* * HV_STATUS_INSUFFICIENT_COMPARTMENT_VA * The VA space of the compartment is exhausted. */ #define HV_STATUS_INSUFFICIENT_COMPARTMENT_VA ((u16)0x1026) /* * HV_STATUS_DEREF_SPA_LIST_FULL * The SPA dereference list is full, and there are additional entries to be * added to it. */ #define HV_STATUS_DEREF_SPA_LIST_FULL ((u16)0x1027) /* * HV_STATUS_GPA_OUT_OF_RANGE * The supplied GPA is out of range. */ #define HV_STATUS_GPA_OUT_OF_RANGE ((u16)0x1027) /* * HV_STATUS_NONVOLATILE_XMM_STALE * The XMM register that was being accessed is stale. */ #define HV_STATUS_NONVOLATILE_XMM_STALE ((u16)0x1028) /* HV_STATUS_UNSUPPORTED_PROCESSOR * The hypervisor does not support the processors in this system. */ #define HV_STATUS_UNSUPPORTED_PROCESSOR ((u16)0x1029) /* * HV_STATUS_INSUFFICIENT_CROM_SPACE * Insufficient space existed for copying over the CROM contents. */ #define HV_STATUS_INSUFFICIENT_CROM_SPACE ((u16)0x2000) /* * HV_STATUS_BAD_CROM_FORMAT * The contents of the CROM failed validation attempts. */ #define HV_STATUS_BAD_CROM_FORMAT ((u16)0x2001) /* * HV_STATUS_UNSUPPORTED_CROM_FORMAT * The contents of the CROM contain contents the parser doesn't support. */ #define HV_STATUS_UNSUPPORTED_CROM_FORMAT ((u16)0x2002) /* * HV_STATUS_UNSUPPORTED_CONTROLLER * The register format of the OHCI controller specified for debugging is not * supported. */ #define HV_STATUS_UNSUPPORTED_CONTROLLER ((u16)0x2003) /* * HV_STATUS_CROM_TOO_LARGE * The CROM contents were to large to copy over. */ #define HV_STATUS_CROM_TOO_LARGE ((u16)0x2004) /* * HV_STATUS_CONTROLLER_IN_USE * The OHCI controller specified for debugging cannot be used as it is already * in use. */ #define HV_STATUS_CONTROLLER_IN_USE ((u16)0x2005) /* * The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent * is set by CPUID(HvCpuIdFunctionVersionAndFeatures). */ 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, }; /* 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(u32)) /* Define hypervisor message types. */ 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 }; /* Define the number of synthetic interrupt sources. */ #define HV_SYNIC_SINT_COUNT (16) #define HV_SYNIC_STIMER_COUNT (4) /* Define invalid partition identifier. */ #define HV_PARTITION_ID_INVALID ((u64)0x0) /* Define connection identifier type. */ union hv_connection_id { u32 Asu32; struct { u32 Id:24; u32 Reserved:8; } u; }; /* Define port identifier type. */ union hv_port_id { u32 Asu32; struct { u32 Id:24; u32 Reserved:8; } u ; }; /* Define port type. */ enum hv_port_type { HvPortTypeMessage = 1, HvPortTypeEvent = 2, HvPortTypeMonitor = 3 }; /* Define port information structure. */ struct hv_port_info { enum hv_port_type PortType; u32 Padding; union { struct { u32 TargetSint; u32 TargetVp; u64 RsvdZ; } MessagePortInfo; struct { u32 TargetSint; u32 TargetVp; u16 BaseFlagNumber; u16 FlagCount; u32 RsvdZ; } EventPortInfo; struct { u64 MonitorAddress; u64 RsvdZ; } MonitorPortInfo; }; }; struct hv_connection_info { enum hv_port_type PortType; u32 Padding; union { struct { u64 RsvdZ; } MessageConnectionInfo; struct { u64 RsvdZ; } EventConnectionInfo; struct { u64 MonitorAddress; } MonitorConnectionInfo; }; }; /* Define synthetic interrupt controller message flags. */ union hv_message_flags { u8 Asu8; struct { u8 MessagePending:1; u8 Reserved:7; }; }; /* Define synthetic interrupt controller message header. */ struct hv_message_header { enum hv_message_type MessageType; u8 PayloadSize; union hv_message_flags MessageFlags; u8 Reserved[2]; union { u64 Sender; union hv_port_id Port; }; }; /* Define timer message payload structure. */ struct hv_timer_message_payload { u32 TimerIndex; u32 Reserved; u64 ExpirationTime; /* When the timer expired */ u64 DeliveryTime; /* When the message was delivered */ }; /* Define synthetic interrupt controller message format. */ struct hv_message { struct hv_message_header Header; union { u64 Payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT]; } u ; }; /* Define the number of message buffers associated with each port. */ #define HV_PORT_MESSAGE_BUFFER_COUNT (16) /* Define the synthetic interrupt message page layout. */ struct hv_message_page { struct hv_message SintMessage[HV_SYNIC_SINT_COUNT]; }; /* Define the synthetic interrupt controller event flags format. */ union hv_synic_event_flags { u8 Flags8[HV_EVENT_FLAGS_BYTE_COUNT]; u32 Flags32[HV_EVENT_FLAGS_DWORD_COUNT]; }; /* Define the synthetic interrupt flags page layout. */ struct hv_synic_event_flags_page { union hv_synic_event_flags SintEventFlags[HV_SYNIC_SINT_COUNT]; }; /* Define SynIC control register. */ union hv_synic_scontrol { u64 AsUINT64; struct { u64 Enable:1; u64 Reserved:63; }; }; /* Define synthetic interrupt source. */ union hv_synic_sint { u64 AsUINT64; struct { u64 Vector:8; u64 Reserved1:8; u64 Masked:1; u64 AutoEoi:1; u64 Reserved2:46; }; }; /* Define the format of the SIMP register */ union hv_synic_simp { u64 AsUINT64; struct { u64 SimpEnabled:1; u64 Preserved:11; u64 BaseSimpGpa:52; }; }; /* Define the format of the SIEFP register */ union hv_synic_siefp { u64 AsUINT64; struct { u64 SiefpEnabled:1; u64 Preserved:11; u64 BaseSiefpGpa:52; }; }; /* Definitions for the monitored notification facility */ union hv_monitor_trigger_group { u64 AsUINT64; struct { u32 Pending; u32 Armed; }; }; struct hv_monitor_parameter { union hv_connection_id ConnectionId; u16 FlagNumber; u16 RsvdZ; }; union hv_monitor_trigger_state { u32 Asu32; struct { u32 GroupEnable:4; u32 RsvdZ:28; }; }; /* struct 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] | */ /* ------------------------------------------------------ */ struct hv_monitor_page { union hv_monitor_trigger_state TriggerState; u32 RsvdZ1; union hv_monitor_trigger_group TriggerGroup[4]; u64 RsvdZ2[3]; s32 NextCheckTime[4][32]; u16 Latency[4][32]; u64 RsvdZ3[32]; struct hv_monitor_parameter Parameter[4][32]; u8 RsvdZ4[1984]; }; /* Declare the various hypercall operations. */ enum hv_call_code { HvCallPostMessage = 0x005c, HvCallSignalEvent = 0x005d, }; /* Definition of the HvPostMessage hypercall input structure. */ struct hv_input_post_message { union hv_connection_id ConnectionId; u32 Reserved; enum hv_message_type MessageType; u32 PayloadSize; u64 Payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT]; }; /* Definition of the HvSignalEvent hypercall input structure. */ struct hv_input_signal_event { union hv_connection_id ConnectionId; u16 FlagNumber; u16 RsvdZ; }; /* * Versioning definitions used for guests reporting themselves to the * hypervisor, and visa versa. */ /* Version info reported by guest OS's */ enum hv_guest_os_vendor { HvGuestOsVendorMicrosoft = 0x0001 }; enum hv_guest_os_microsoft_ids { HvGuestOsMicrosoftUndefined = 0x00, HvGuestOsMicrosoftMSDOS = 0x01, HvGuestOsMicrosoftWindows3x = 0x02, HvGuestOsMicrosoftWindows9x = 0x03, HvGuestOsMicrosoftWindowsNT = 0x04, HvGuestOsMicrosoftWindowsCE = 0x05 }; /* * Declare the MSR used to identify the guest OS. */ #define HV_X64_MSR_GUEST_OS_ID 0x40000000 union hv_x64_msr_guest_os_id_contents { u64 AsUINT64; struct { u64 BuildNumber:16; u64 ServiceVersion:8; /* Service Pack, etc. */ u64 MinorVersion:8; u64 MajorVersion:8; u64 OsId:8; /* enum hv_guest_os_microsoft_ids (if Vendor=MS) */ u64 VendorId:16; /* enum hv_guest_os_vendor */ }; }; /* * Declare the MSR used to setup pages used to communicate with the hypervisor. */ #define HV_X64_MSR_HYPERCALL 0x40000001 union hv_x64_msr_hypercall_contents { u64 AsUINT64; struct { u64 Enable:1; u64 Reserved:11; u64 GuestPhysicalAddress:52; }; }; #endif