1#![allow(dead_code)]
6use crate::HV_HYP_PAGE_SIZE;
7use num_enum::TryFromPrimitive;
8use zerocopy::{FromBytes, IntoBytes};
9
10pub const HV_PAGE_SIZE: usize = HV_HYP_PAGE_SIZE as usize;
11
12pub const HV_CPUID_FUNCTION_VERSION_AND_FEATURES: u32 = 0x00000001;
13pub const HV_CPUID_FUNCTION_HV_VENDOR_AND_MAX_FUNCTION: u32 = 0x40000000;
14pub const HV_CPUID_FUNCTION_HV_INTERFACE: u32 = 0x40000001;
15pub const HV_CPUID_FUNCTION_MS_HV_VERSION: u32 = 0x40000002;
16pub const HV_CPUID_FUNCTION_MS_HV_FEATURES: u32 = 0x40000003;
17pub const HV_CPUID_FUNCTION_MS_HV_ENLIGHTENMENT_INFORMATION: u32 = 0x40000004;
18pub const HV_CPUID_FUNCTION_MS_HV_IMPLEMENTATION_LIMITS: u32 = 0x40000005;
19pub const HV_CPUID_FUNCTION_MS_HV_HARDWARE_FEATURES: u32 = 0x40000006;
20
21pub const HV_PARTITION_PRIVILEGE_ACCESS_VP_RUNTIME_MSR: u64 = 0x0000000000000001;
22pub const HV_PARTITION_PRIVILEGE_PARTITION_REFERENCE_COUNTER: u64 = 0x0000000000000002;
23pub const HV_PARTITION_PRIVILEGE_SYNIC_MSRS: u64 = 0x0000000000000004;
24pub const HV_PARTITION_PRIVILEGE_ACCESS_SYNTHETIC_TIMER_MSRS: u64 = 0x0000000000000008;
25pub const HV_PARTITION_PRIVILEGE_ACCESS_APIC_MSRS: u64 = 0x0000000000000010;
26pub const HV_PARTITION_PRIVILEGE_ACCESS_HYPERCALL_MSRS: u64 = 0x0000000000000020;
27pub const HV_PARTITION_PRIVILEGE_ACCESS_VP_INDEX: u64 = 0x0000000000000040;
28pub const HV_PARTITION_PRIVILEGE_ACCESS_RESET_MSR: u64 = 0x0000000000000080;
29pub const HV_PARTITION_PRIVILEGE_ACCESS_STATS_MSR: u64 = 0x0000000000000100;
30pub const HV_PARTITION_PRIVILEGE_ACCESS_PARTITION_REFERENCE_TSC: u64 = 0x0000000000000200;
31pub const HV_PARTITION_PRIVILEGE_ACCESS_GUEST_IDLE_MSR: u64 = 0x0000000000000400;
32pub const HV_PARTITION_PRIVILEGE_ACCESS_FREQUENCY_MSRS: u64 = 0x0000000000000800;
33pub const HV_PARTITION_PRIVILEGE_ACCESS_DEBUG_MSRS: u64 = 0x0000000000001000;
34pub const HV_PARTITION_PRIVILEGE_ACCESS_REENLIGHTENMENT_CTRLS: u64 = 0x0000000000002000;
35pub const HV_PARTITION_PRIVILEGE_ACCESS_ROOT_SCHEDULER_MSR: u64 = 0x0000000000004000;
36
37pub const HV_PARTITION_PRIVILEGE_CREATE_PARTITIONS: u64 = 0x0000000100000000;
38pub const HV_PARTITION_PRIVILEGE_ACCESS_PARTITION_ID: u64 = 0x0000000200000000;
39pub const HV_PARTITION_PRIVILEGE_ACCESS_MEMORY_POOL: u64 = 0x0000000400000000;
40pub const HV_PARTITION_PRIVILEGE_ADJUST_MESSAGE_BUFFERS: u64 = 0x0000000800000000;
41pub const HV_PARTITION_PRIVILEGE_POST_MESSAGES: u64 = 0x0000001000000000;
42pub const HV_PARTITION_PRIVILEGE_SIGNAL_EVENTS: u64 = 0x0000002000000000;
43pub const HV_PARTITION_PRIVILEGE_CREATE_PORT: u64 = 0x0000004000000000;
44pub const HV_PARTITION_PRIVILEGE_CONNECT_PORT: u64 = 0x0000008000000000;
45pub const HV_PARTITION_PRIVILEGE_ACCESS_STATS: u64 = 0x0000010000000000;
46pub const HV_PARTITION_PRIVILEGE_DEBUGGING: u64 = 0x0000080000000000;
47pub const HV_PARTITION_PRIVILEGE_CPU_MANAGEMENT: u64 = 0x0000100000000000;
48pub const HV_PARTITION_PRIVILEGE_CONFIGURE_PROFILER: u64 = 0x0000200000000000;
49pub const HV_PARTITION_PRIVILEGE_ACCESS_VP_EXIT_TRACING: u64 = 0x0000400000000000;
50pub const HV_PARTITION_PRIVILEGE_ENABLE_EXTENDED_GVA_RANGES_FLUSH_VA_LIST: u64 = 0x0000800000000000;
51pub const HV_PARTITION_PRIVILEGE_ACCESS_VSM: u64 = 0x0001000000000000;
52pub const HV_PARTITION_PRIVILEGE_ACCESS_VP_REGISTERS: u64 = 0x0002000000000000;
53pub const HV_PARTITION_PRIVILEGE_FAST_HYPERCALL_OUTPUT: u64 = 0x0008000000000000;
54pub const HV_PARTITION_PRIVILEGE_ENABLE_EXTENDED_HYPERCALLS: u64 = 0x0010000000000000;
55pub const HV_PARTITION_PRIVILEGE_START_VIRTUAL_PROCESSOR: u64 = 0x0020000000000000;
56pub const HV_PARTITION_PRIVILEGE_ISOLATION: u64 = 0x0040000000000000;
57
58pub const HV_FEATURE_MWAIT_AVAILABLE_DEPRECATED: u32 = 1 << 0;
59pub const HV_FEATURE_GUEST_DEBUGGING_AVAILABLE: u32 = 1 << 1;
60pub const HV_FEATURE_PERFORMANCE_MONITORS_AVAILABLE: u32 = 1 << 2;
61pub const HV_FEATURE_CPU_DYNAMIC_PARTITIONING_AVAILABLE: u32 = 1 << 3;
62pub const HV_FEATURE_XMM_REGISTERS_FOR_FAST_HYPERCALL_AVAILABLE: u32 = 1 << 4;
63pub const HV_FEATURE_GUEST_IDLE_AVAILABLE: u32 = 1 << 5;
64pub const HV_FEATURE_HYPERVISOR_SLEEP_STATE_SUPPORT_AVAILABLE: u32 = 1 << 6;
65pub const HV_FEATURE_NUMA_DISTANCE_QUERY_AVAILABLE: u32 = 1 << 7;
66pub const HV_FEATURE_FREQUENCY_REGS_AVAILABLE: u32 = 1 << 8;
67pub const HV_FEATURE_SYNTHETIC_MACHINE_CHECK_AVAILABLE: u32 = 1 << 9;
68pub const HV_FEATURE_GUEST_CRASH_REGS_AVAILABLE: u32 = 1 << 10;
69pub const HV_FEATURE_DEBUG_REGS_AVAILABLE: u32 = 1 << 11;
70pub const HV_FEATURE_NPIEP1_AVAILABLE: u32 = 1 << 12;
71pub const HV_FEATURE_DISABLE_HYPERVISOR_AVAILABLE: u32 = 1 << 13;
72pub const HV_FEATURE_EXTENDED_GVA_RANGES_FOR_FLUSH_VIRTUAL_ADDRESS_LIST_AVAILABLE: u32 = 1 << 14;
73pub const HV_FEATURE_FAST_HYPERCALL_OUTPUT_AVAILABLE: u32 = 1 << 15;
74pub const HV_FEATURE_SVM_FEATURES_AVAILABLE: u32 = 1 << 16;
75pub const HV_FEATURE_SINT_POLLING_MODE_AVAILABLE: u32 = 1 << 17;
76pub const HV_FEATURE_HYPERCALL_MSR_LOCK_AVAILABLE: u32 = 1 << 18;
77pub const HV_FEATURE_DIRECT_SYNTHETIC_TIMERS: u32 = 1 << 19;
78pub const HV_FEATURE_REGISTER_PAT_AVAILABLE: u32 = 1 << 20;
79pub const HV_FEATURE_REGISTER_BNDCFGS_AVAILABLE: u32 = 1 << 21;
80pub const HV_FEATURE_WATCHDOG_TIMER_AVAILABLE: u32 = 1 << 22;
81pub const HV_FEATURE_SYNTHETIC_TIME_UNHALTED_TIMER_AVAILABLE: u32 = 1 << 23;
82pub const HV_FEATURE_DEVICE_DOMAINS_AVAILABLE: u32 = 1 << 24; pub const HV_FEATURE_S1_DEVICE_DOMAINS_AVAILABLE: u32 = 1 << 25; pub const HV_FEATURE_LBR_AVAILABLE: u32 = 1 << 26;
85pub const HV_FEATURE_IPT_AVAILABLE: u32 = 1 << 27;
86pub const HV_FEATURE_CROSS_VTL_FLUSH_AVAILABLE: u32 = 1 << 28;
87
88pub const HV_ENLIGHTENMENT_USE_HYPERCALL_FOR_ADDRESS_SPACE_SWITCH: u32 = 1 << 0;
89pub const HV_ENLIGHTENMENT_USE_HYPERCALL_FOR_LOCAL_FLUSH: u32 = 1 << 1;
90pub const HV_ENLIGHTENMENT_USE_HYPERCALL_FOR_REMOTE_FLUSH_AND_LOCAL_FLUSH_ENTIRE: u32 = 1 << 2;
91pub const HV_ENLIGHTENMENT_USE_APIC_MSRS: u32 = 1 << 3;
92pub const HV_ENLIGHTENMENT_USE_HV_REGISTER_FOR_RESET: u32 = 1 << 4;
93pub const HV_ENLIGHTENMENT_USE_RELAXED_TIMING: u32 = 1 << 5;
94pub const HV_ENLIGHTENMENT_USE_DMA_REMAPPING_DEPRECATED: u32 = 1 << 6;
95pub const HV_ENLIGHTENMENT_USE_INTERRUPT_REMAPPING_DEPRECATED: u32 = 1 << 7;
96pub const HV_ENLIGHTENMENT_USE_X2_APIC_MSRS: u32 = 1 << 8;
97pub const HV_ENLIGHTENMENT_DEPRECATE_AUTO_EOI: u32 = 1 << 9;
98pub const HV_ENLIGHTENMENT_USE_SYNTHETIC_CLUSTER_IPI: u32 = 1 << 10;
99pub const HV_ENLIGHTENMENT_USE_EX_PROCESSOR_MASKS: u32 = 1 << 11;
100pub const HV_ENLIGHTENMENT_NESTED: u32 = 1 << 12;
101pub const HV_ENLIGHTENMENT_USE_INT_FOR_MBEC_SYSTEM_CALLS: u32 = 1 << 13;
102pub const HV_ENLIGHTENMENT_USE_VMCS_ENLIGHTENMENTS: u32 = 1 << 14;
103pub const HV_ENLIGHTENMENT_USE_SYNCED_TIMELINE: u32 = 1 << 15;
104pub const HV_ENLIGHTENMENT_CORE_SCHEDULER_REQUESTED: u32 = 1 << 16;
105pub const HV_ENLIGHTENMENT_USE_DIRECT_LOCAL_FLUSH_ENTIRE: u32 = 1 << 17;
106pub const HV_ENLIGHTENMENT_NO_NON_ARCHITECTURAL_CORE_SHARING: u32 = 1 << 18;
107pub const HV_ENLIGHTENMENT_RESERVED: u32 = 13 << 19;
108
109pub const HV_CALL_POST_MESSAGE: u64 = 0x005c;
110pub const HV_CALL_SIGNAL_EVENT: u64 = 0x005d;
111pub const HV_CALL_RETARGET_DEVICE_INTERRUPT: u64 = 0x007e;
112
113pub const MSR_HYPERCALL_ACTIVE: u64 = 1;
114pub const MSR_HYPERCALL_LOCKED: u64 = 2;
115pub const MSR_HYPERCALL_ADDR_MASK: u64 = !0xfff;
116
117pub const MSR_SIEFP_SIMP_ACTIVE: u64 = 1;
118pub const MSR_SIEFP_SIMP_ADDR_MASK: u64 = !0xfff;
119
120#[derive(TryFromPrimitive, Debug, Copy, Clone, PartialEq)]
121#[repr(u16)]
122pub enum HvError {
123 InvalidHypercallCode = 0x0002,
124 InvalidHypercallInput = 0x0003,
125 InvalidAlignment = 0x0004,
126 InvalidParameter = 0x0005,
127 AccessDenied = 0x0006,
128 InvalidPartitionState = 0x0007,
129 OperationDenied = 0x0008,
130 UnknownProperty = 0x0009,
131 PropertyValueOutOfRange = 0x000A,
132 InsufficientMemory = 0x000B,
133 PartitionTooDeep = 0x000C,
134 InvalidPartitionId = 0x000D,
135 InvalidVpIndex = 0x000E,
136 NotFound = 0x0010,
137 InvalidPortId = 0x0011,
138 InvalidConnectionId = 0x0012,
139 InsufficientBuffers = 0x0013,
140 NotAcknowledged = 0x0014,
141 InvalidVpState = 0x0015,
142 Acknowledged = 0x0016,
143 InvalidSaveRestoreState = 0x0017,
144 InvalidSynicState = 0x0018,
145 ObjectInUse = 0x0019,
146 InvalidProximityDomainInfo = 0x001A,
147 NoData = 0x001B,
148 Inactive = 0x001C,
149 NoResources = 0x001D,
150 FeatureUnavailable = 0x001E,
151 PartialPacket = 0x001F,
152 ProcessorFeatureNotSupported = 0x0020,
153 ProcessorCacheLineFlushSizeIncompatible = 0x0030,
154 InsufficientBuffer = 0x0033,
155 IncompatibleProcessor = 0x0037,
156 InsufficientDeviceDomains = 0x0038,
157 CpuidFeatureValidationError = 0x003C,
158 CpuidXsaveFeatureValidationError = 0x003D,
159 ProcessorStartupTimeout = 0x003E,
160 SmxEnabled = 0x003F,
161 InvalidLpIndex = 0x0041,
162 InvalidRegisterValue = 0x0050,
163 InvalidVtlState = 0x0051,
164 NxNotDetected = 0x0055,
165 InvalidDeviceId = 0x0057,
166 InvalidDeviceState = 0x0058,
167 PendingPageRequests = 0x0059,
168 PageRequestInvalid = 0x0060,
169 KeyAlreadyExists = 0x0065,
170 DeviceAlreadyInDomain = 0x0066,
171 InvalidCpuGroupId = 0x006F,
172 InvalidCpuGroupState = 0x0070,
173 OperationFailed = 0x0071,
174 NotAllowedWithNestedVirtActive = 0x0072,
175 InsufficientRootMemory = 0x0073,
176 EventBufferAlreadyFreed = 0x0074,
177}
178
179#[repr(C)]
180#[derive(Copy, Clone, IntoBytes, Debug, FromBytes)]
181pub struct HvMessageHeader {
182 pub typ: u32,
183 pub len: u8,
184 pub flags: u8,
185 pub rsvd: u16,
186 pub id: u64,
187}
188
189pub const MESSAGE_TYPE_TIMER_EXPIRED: u32 = 0x80000010;
190
191#[repr(C)]
192#[derive(Copy, Clone, IntoBytes, Debug, FromBytes)]
193pub struct HvMessage {
194 pub header: HvMessageHeader,
195 pub payload: [[u8; 24]; 10],
196}
197
198#[repr(C)]
199#[derive(Copy, Clone, IntoBytes, Debug, FromBytes)]
200pub struct TimerMessagePayload {
201 pub timer_index: u32,
202 pub reserved: u32,
203 pub expiration_time: u64,
204 pub delivery_time: u64,
205}