Changeset 71129 in vbox for trunk/include/iprt/nt
- Timestamp:
- Feb 26, 2018 3:58:50 PM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 121015
- Location:
- trunk/include/iprt/nt
- Files:
-
- 1 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/nt/hyperv.h
r71087 r71129 28 28 #define ___iprt_nt_hyperv_h 29 29 30 30 31 #ifndef IN_IDA_PRO 31 32 # include <iprt/types.h> … … 53 54 /** Hyper-V unsigned 128-bit integer type. */ 54 55 typedef struct { uint64_t Low64, High64; } HV_UINT128; 56 /** Hyper-V port ID. */ 57 typedef union 58 { 59 uint32_t AsUINT32; 60 struct 61 { 62 uint32_t Id : 24; 63 uint32_t Reserved : 8; 64 }; 65 } HV_PORT_ID; 66 /** Pointer to a Hyper-V port ID. */ 67 typedef HV_PORT_ID *PHV_PORT_ID; 55 68 56 69 … … 917 930 }; 918 931 } HV_X64_SEGMENT_REGISTER; 932 AssertCompileSize(HV_X64_SEGMENT_REGISTER, 16); 919 933 /** Pointer to a value of HvX64RegisterEs..Tr. */ 920 934 typedef HV_X64_SEGMENT_REGISTER *PHV_X64_SEGMENT_REGISTER; … … 928 942 uint64_t Base; 929 943 } HV_X64_TABLE_REGISTER; 944 AssertCompileSize(HV_X64_TABLE_REGISTER, 16); 930 945 /** Pointer to a value of HvX64RegisterIdtr/Gdtrr. */ 931 946 typedef HV_X64_TABLE_REGISTER *PHV_X64_TABLE_REGISTER; … … 1083 1098 1084 1099 1100 1101 /** 1102 * Hyper-V SyncIC message types. 1103 */ 1104 typedef enum 1105 { 1106 HvMessageTypeNone = 0x00000000, 1107 1108 HvMessageTypeUnmappedGpa = 0x80000000, 1109 HvMessageTypeGpaIntercept, 1110 1111 HvMessageTimerExpired = 0x80000010, 1112 1113 HvMessageTypeInvalidVpRegisterValue = 0x80000020, 1114 HvMessageTypeUnrecoverableException, 1115 HvMessageTypeUnsupportedFeature, 1116 HvMessageTypeTlbPageSizeMismatch, /**< @since v5 */ 1117 1118 /** @note Same as HvMessageTypeX64ApicEoi? Gone in 5.0. Missing from 7600 WDK 1119 * headers even if it's in the 2.0 docs. */ 1120 HvMessageTypeApicEoi = 0x80000030, 1121 /** @note Same as HvMessageTypeX64LegacyFpError? Gone in 5.0, whereas 4.0b 1122 * calls it HvMessageTypeX64LegacyFpError. Missing from 7600 WDK 1123 * headers even if it's in the 2.0 docs. */ 1124 HvMessageTypeFerrAsserted, 1125 1126 HvMessageTypeEventLogBufferComplete = 0x80000040, 1127 1128 HvMessageTypeX64IoPortIntercept = 0x80010000, 1129 HvMessageTypeX64MsrIntercept, 1130 HvMessageTypeX64CpuidIntercept, 1131 HvMessageTypeX64ExceptionIntercept, 1132 /** @note Appeared in 5.0 docs, but were here in 7600 WDK headers already. */ 1133 HvMessageTypeX64ApicEoi, 1134 /** @note Appeared in 5.0 docs, but were here in 7600 WDK headers already. */ 1135 HvMessageTypeX64LegacyFpError, 1136 /** @since v5 */ 1137 HvMessageTypeX64RegisterIntercept, 1138 /** @since WinHvPlatform? */ 1139 HvMessageTypeX64Halt, 1140 /** @since WinHvPlatform? */ 1141 HvMessageTypeX64InterruptWindow 1142 1143 } HV_MESSAGE_TYPE; 1144 AssertCompileSize(HV_MESSAGE_TYPE, 4); 1145 AssertCompile(HvMessageTypeX64RegisterIntercept == 0x80010006); 1146 AssertCompile(HvMessageTypeX64Halt == 0x80010007); 1147 AssertCompile(HvMessageTypeX64InterruptWindow == 0x80010008); 1148 /** Pointer to a Hyper-V SyncIC message type. */ 1149 typedef HV_MESSAGE_TYPE *PHV_MESSAGE_TYPE; 1150 1151 /** Flag set for hypervisor messages, guest cannot send messages with this 1152 * flag set. */ 1153 #define HV_MESSAGE_TYPE_HYPERVISOR_MASK UINT32_C(0x80000000) 1154 1155 /** Hyper-V SynIC message size (they are fixed sized). */ 1156 #define HV_MESSAGE_SIZE 256 1157 /** Maximum Hyper-V SynIC message payload size in bytes. */ 1158 #define HV_MESSAGE_MAX_PAYLOAD_BYTE_COUNT (HV_MESSAGE_SIZE - 16) 1159 /** Maximum Hyper-V SynIC message payload size in QWORDs (uint64_t). */ 1160 #define HV_MESSAGE_MAX_PAYLOAD_QWORD_COUNT (HV_MESSAGE_MAX_PAYLOAD_BYTE_COUNT / 8) 1161 1162 /** SynIC message flags. */ 1163 typedef union 1164 { 1165 uint8_t AsUINT8; 1166 struct 1167 { 1168 /** Messages are pending in the queue. */ 1169 uint8_t MessagePending : 1; 1170 uint8_t Reserved : 7; 1171 }; 1172 } HV_MESSAGE_FLAGS; 1173 AssertCompileSize(HV_MESSAGE_FLAGS, 1); 1174 1175 /** SynIC message header. */ 1176 typedef struct 1177 { 1178 HV_MESSAGE_TYPE MessageType; 1179 /** The 2.0-5.0b docs all have this incorrectly switched with 'Reserved', WDK 7600 got it right. */ 1180 uint8_t PayloadSize; 1181 HV_MESSAGE_FLAGS MessageFlags; 1182 uint16_t Reserved; 1183 union 1184 { 1185 uint64_t OriginationId; 1186 HV_PARTITION_ID Sender; 1187 HV_PORT_ID Port; 1188 }; 1189 } HV_MESSAGE_HEADER; 1190 AssertCompileSize(HV_MESSAGE_HEADER, 16); 1191 /** Pointer to a Hyper-V message header. */ 1192 typedef HV_MESSAGE_HEADER *PHV_MESSAGE_HEADER; 1193 /** Pointer to a const Hyper-V message header. */ 1194 typedef HV_MESSAGE_HEADER const *PCHV_MESSAGE_HEADER; 1195 1196 1197 1198 /** @name Intercept access type. 1199 * @{ */ 1200 typedef uint8_t HV_INTERCEPT_ACCESS_TYPE; 1201 #define HV_INTERCEPT_ACCESS_READ 0 1202 #define HV_INTERCEPT_ACCESS_WRITE 1 1203 #define HV_INTERCEPT_ACCESS_EXECUTE 2 1204 /** @} */ 1205 1206 /** @name Intercept access type mask. 1207 * @{ */ 1208 typedef uint32_t HV_INTERCEPT_ACCESS_TYPE_MASK; 1209 #define HV_INTERCEPT_ACCESS_MASK_NONE 0 1210 #define HV_INTERCEPT_ACCESS_MASK_READ 1 1211 #define HV_INTERCEPT_ACCESS_MASK_WRITE 2 1212 #define HV_INTERCEPT_ACCESS_MASK_EXECUTE 4 1213 /** @} */ 1214 1215 /** X64 intercept execution state. 1216 * @sa WHV_X64_VP_EXECUTION_STATE */ 1217 typedef union 1218 { 1219 uint16_t AsUINT16; 1220 struct 1221 { 1222 uint16_t Cpl : 2; 1223 uint16_t Cr0Pe : 1; 1224 uint16_t Cr0Am : 1; 1225 uint16_t EferLma : 1; 1226 uint16_t DebugActive : 1; 1227 uint16_t InterruptionPending : 1; 1228 uint16_t Reserved0 : 5; 1229 uint16_t InterruptShadow : 1; 1230 uint16_t Reserved1 : 3; 1231 }; 1232 } HV_X64_VP_EXECUTION_STATE; 1233 AssertCompileSize(HV_X64_VP_EXECUTION_STATE, 2); 1234 /** Pointer to X86 intercept execution state. */ 1235 typedef HV_X64_VP_EXECUTION_STATE *PHV_X64_VP_EXECUTION_STATE; 1236 /** Pointer to const X86 intercept execution state. */ 1237 typedef HV_X64_VP_EXECUTION_STATE const *PCHV_X64_VP_EXECUTION_STATE; 1238 1239 /** X64 intercept message header. */ 1240 typedef struct 1241 { 1242 HV_VP_INDEX VpIndex; /**< 0x00 */ 1243 uint8_t InstructionLength; /**< 0x04: Zero if not available, instruction fetch exit, ... */ 1244 HV_INTERCEPT_ACCESS_TYPE InterceptAccessType; /**< 0x05 */ 1245 HV_X64_VP_EXECUTION_STATE ExecutionState; /**< 0x06 */ 1246 HV_X64_SEGMENT_REGISTER CsSegment; /**< 0x08 */ 1247 uint64_t Rip; /**< 0x18 */ 1248 uint64_t Rflags; /**< 0x20 */ 1249 } HV_X64_INTERCEPT_MESSAGE_HEADER; 1250 AssertCompileSize(HV_X64_INTERCEPT_MESSAGE_HEADER, 40); 1251 /** Pointer to a x86 intercept message header. */ 1252 typedef HV_X64_INTERCEPT_MESSAGE_HEADER *PHV_X64_INTERCEPT_MESSAGE_HEADER; 1253 1254 1255 /** X64 memory access flags (HvMessageTypeGpaIntercept, HvMessageTypeUnmappedGpa). 1256 * @sa WHV_MEMORY_ACCESS_INFO */ 1257 typedef union 1258 { 1259 uint8_t AsUINT8; 1260 struct 1261 { 1262 uint8_t GvaValid : 1; 1263 uint8_t Reserved : 7; 1264 }; 1265 } HV_X64_MEMORY_ACCESS_INFO; 1266 AssertCompileSize(HV_X64_MEMORY_ACCESS_INFO, 1); 1267 1268 /** The payload format for HvMessageTypeGpaIntercept and HvMessageTypeUnmappedGpa. 1269 * @sa WHV_MEMORY_ACCESS_CONTEXT 1270 * @note max message size. */ 1271 typedef struct 1272 { 1273 HV_X64_INTERCEPT_MESSAGE_HEADER Header; /**< 0x00 */ 1274 HV_CACHE_TYPE CacheType; /**< 0x28 */ 1275 uint8_t InstructionByteCount; /**< 0x2c */ 1276 HV_X64_MEMORY_ACCESS_INFO MemoryAccessInfo; /**< 0x2d */ 1277 uint16_t Reserved1; /**< 0x2e */ 1278 uint64_t GuestVirtualAddress; /**< 0x30 */ 1279 uint64_t GuestPhysicalAddress; /**< 0x38 */ 1280 uint8_t InstructionBytes[16]; /**< 0x40 */ 1281 /* We don't the following (v5 / WinHvPlatform): */ 1282 HV_X64_SEGMENT_REGISTER DsSegment; /**< 0x50 */ 1283 HV_X64_SEGMENT_REGISTER SsSegment; /**< 0x60 */ 1284 uint64_t Rax; /**< 0x70 */ 1285 uint64_t Rcx; /**< 0x78 */ 1286 uint64_t Rdx; /**< 0x80 */ 1287 uint64_t Rbx; /**< 0x88 */ 1288 uint64_t Rsp; /**< 0x90 */ 1289 uint64_t Rbp; /**< 0x98 */ 1290 uint64_t Rsi; /**< 0xa0 */ 1291 uint64_t Rdi; /**< 0xa8 */ 1292 uint64_t R8; /**< 0xb0 */ 1293 uint64_t R9; /**< 0xb8 */ 1294 uint64_t R10; /**< 0xc0 */ 1295 uint64_t R11; /**< 0xc8 */ 1296 uint64_t R12; /**< 0xd0 */ 1297 uint64_t R13; /**< 0xd8 */ 1298 uint64_t R14; /**< 0xe0 */ 1299 uint64_t R15; /**< 0xe8 */ 1300 } HV_X64_MEMORY_INTERCEPT_MESSAGE; 1301 AssertCompileSize(HV_X64_MEMORY_INTERCEPT_MESSAGE, 0xf0); 1302 AssertCompileMemberOffset(HV_X64_MEMORY_INTERCEPT_MESSAGE, DsSegment, 0x50); 1303 /** Pointer to a HvMessageTypeGpaIntercept or HvMessageTypeUnmappedGpa payload. */ 1304 typedef HV_X64_MEMORY_INTERCEPT_MESSAGE *PHV_X64_MEMORY_INTERCEPT_MESSAGE; 1305 /** Pointer to a const HvMessageTypeGpaIntercept or HvMessageTypeUnmappedGpa payload. */ 1306 typedef HV_X64_MEMORY_INTERCEPT_MESSAGE const *PCHV_X64_MEMORY_INTERCEPT_MESSAGE; 1307 1308 1309 /** X64 I/O port access information (HvMessageTypeX64IoPortIntercept). */ 1310 typedef union HV_X64_IO_PORT_ACCESS_INFO 1311 { 1312 uint8_t AsUINT8; 1313 struct 1314 { 1315 uint8_t AccessSize : 3; 1316 uint8_t StringOp : 1; 1317 uint8_t RepPrefix : 1; 1318 uint8_t Reserved : 3; 1319 }; 1320 } HV_X64_IO_PORT_ACCESS_INFO; 1321 AssertCompileSize(HV_X64_IO_PORT_ACCESS_INFO, 1); 1322 1323 /** The payload format for HvMessageTypeX64IoPortIntercept. */ 1324 typedef struct _HV_X64_IO_PORT_INTERCEPT_MESSAGE 1325 { 1326 HV_X64_INTERCEPT_MESSAGE_HEADER Header; /**< 0x00 */ 1327 uint16_t PortNumber; /**< 0x28 */ 1328 HV_X64_IO_PORT_ACCESS_INFO AccessInfo; /**< 0x2a */ 1329 uint8_t InstructionByteCount; /**< 0x2b */ 1330 uint32_t Reserved; /**< 0x2c */ 1331 uint64_t Rax; /**< 0x30 */ 1332 uint8_t InstructionBytes[16]; /**< 0x38 */ 1333 HV_X64_SEGMENT_REGISTER DsSegment; /**< 0x48 */ 1334 HV_X64_SEGMENT_REGISTER EsSegment; /**< 0x58 */ 1335 uint64_t Rcx; /**< 0x68 */ 1336 uint64_t Rsi; /**< 0x70 */ 1337 uint64_t Rdi; /**< 0x78 */ 1338 } HV_X64_IO_PORT_INTERCEPT_MESSAGE; 1339 AssertCompileSize(HV_X64_IO_PORT_INTERCEPT_MESSAGE, 128); 1340 /** Pointer to a HvMessageTypeX64IoPortIntercept payload. */ 1341 typedef HV_X64_IO_PORT_INTERCEPT_MESSAGE *PHV_X64_IO_PORT_INTERCEPT_MESSAGE; 1342 /** Pointer to a const HvMessageTypeX64IoPortIntercept payload. */ 1343 typedef HV_X64_IO_PORT_INTERCEPT_MESSAGE const *PCHV_X64_IO_PORT_INTERCEPT_MESSAGE; 1344 1345 /** Full I/O port message. */ 1346 typedef struct 1347 { 1348 HV_MESSAGE_HEADER MsgHdr; 1349 HV_X64_IO_PORT_INTERCEPT_MESSAGE Payload; 1350 } HV_X64_IO_PORT_INTERCEPT_MESSAGE_FULL; 1351 1352 1353 /** X64 exception information (HvMessageTypeX64ExceptionIntercept). 1354 * @sa WHV_VP_EXCEPTION_INFO */ 1355 typedef union 1356 { 1357 uint8_t AsUINT8; 1358 struct 1359 { 1360 uint8_t ErrorCodeValid : 1; 1361 /** @todo WHV_VP_EXCEPTION_INFO::SoftwareException */ 1362 uint8_t Reserved : 7; 1363 }; 1364 } HV_X64_EXCEPTION_INFO; 1365 AssertCompileSize(HV_X64_EXCEPTION_INFO, 1); 1366 1367 /** The payload format for HvMessageTypeX64ExceptionIntercept. 1368 * @sa WHV_VP_EXCEPTION_CONTEXT 1369 * @note max message size. */ 1370 typedef struct 1371 { 1372 HV_X64_INTERCEPT_MESSAGE_HEADER Header; /**< 0x00 */ 1373 uint16_t ExceptionVector; /**< 0x28 */ 1374 HV_X64_EXCEPTION_INFO ExceptionInfo; /**< 0x2a */ 1375 uint8_t InstructionByteCount; /**< 0x2b */ 1376 uint32_t ErrorCode; /**< 0x2c */ 1377 uint64_t ExceptionParameter; /**< 0x30 */ 1378 uint64_t Reserved; /**< 0x38 */ 1379 uint8_t InstructionBytes[16]; /**< 0x40 */ 1380 HV_X64_SEGMENT_REGISTER DsSegment; /**< 0x50 */ 1381 HV_X64_SEGMENT_REGISTER SsSegment; /**< 0x60 */ 1382 uint64_t Rax; /**< 0x70 */ 1383 uint64_t Rcx; /**< 0x78 */ 1384 uint64_t Rdx; /**< 0x80 */ 1385 uint64_t Rbx; /**< 0x88 */ 1386 uint64_t Rsp; /**< 0x90 */ 1387 uint64_t Rbp; /**< 0x98 */ 1388 uint64_t Rsi; /**< 0xa0 */ 1389 uint64_t Rdi; /**< 0xa8 */ 1390 uint64_t R8; /**< 0xb0 */ 1391 uint64_t R9; /**< 0xb8 */ 1392 uint64_t R10; /**< 0xc0 */ 1393 uint64_t R11; /**< 0xc8 */ 1394 uint64_t R12; /**< 0xd0 */ 1395 uint64_t R13; /**< 0xd8 */ 1396 uint64_t R14; /**< 0xe0 */ 1397 uint64_t R15; /**< 0xe8 */ 1398 } HV_X64_EXCEPTION_INTERCEPT_MESSAGE; 1399 AssertCompileSize(HV_X64_EXCEPTION_INTERCEPT_MESSAGE, 0xf0); 1400 /** Pointer to a HvMessageTypeX64ExceptionIntercept payload. */ 1401 typedef HV_X64_EXCEPTION_INTERCEPT_MESSAGE *PHV_X64_EXCEPTION_INTERCEPT_MESSAGE; 1402 /** Pointer to a ocnst HvMessageTypeX64ExceptionIntercept payload. */ 1403 typedef HV_X64_EXCEPTION_INTERCEPT_MESSAGE const *PCHV_X64_EXCEPTION_INTERCEPT_MESSAGE; 1404 1405 1406 /** 1407 * The payload format for HvMessageTypeX64Halt, 1408 * 1409 * @note This message does not include HV_X64_INTERCEPT_MESSAGE_HEADER! 1410 */ 1411 typedef struct 1412 { 1413 /** Seems to be a zero 64-bit field here. */ 1414 uint64_t u64Reserved; 1415 } HV_X64_HALT_MESSAGE; 1416 /** Pointer to a HvMessageTypeX64Halt payload. */ 1417 typedef HV_X64_HALT_MESSAGE *PHV_X64_HALT_MESSAGE; 1418 /** Pointer to a const HvMessageTypeX64Halt payload. */ 1419 typedef HV_X64_HALT_MESSAGE const *PCHV_X64_HALT_MESSAGE; 1420 1421 /** Full HvMessageTypeX64Halt message. */ 1422 typedef struct 1423 { 1424 HV_MESSAGE_HEADER MsgHdr; 1425 HV_X64_HALT_MESSAGE Payload; 1426 } HV_X64_HALT_MESSAGE_FULL; 1427 1428 1429 1430 /** Hyper-V SynIC message. */ 1431 typedef struct 1432 { 1433 HV_MESSAGE_HEADER Header; 1434 /** 0x10 */ 1435 union 1436 { 1437 uint64_t Payload[HV_MESSAGE_MAX_PAYLOAD_QWORD_COUNT]; 1438 1439 /** Common header for X64 intercept messages. */ 1440 HV_X64_INTERCEPT_MESSAGE_HEADER X64InterceptHeader; 1441 /** HvMessageTypeGpaIntercept, HvMessageTypeUnmappedGpa. */ 1442 HV_X64_MEMORY_INTERCEPT_MESSAGE X86MemoryIntercept; 1443 /** HvMessageTypeX64IoPortIntercept */ 1444 HV_X64_IO_PORT_INTERCEPT_MESSAGE X64IoPortIntercept; 1445 /** HvMessageTypeX64ExceptionIntercept */ 1446 HV_X64_EXCEPTION_INTERCEPT_MESSAGE X64ExceptionIntercept; 1447 /** HvMessageTypeX64Halt. */ 1448 HV_X64_HALT_MESSAGE X64Halt; 1449 }; 1450 } HV_MESSAGE; 1451 AssertCompileSize(HV_MESSAGE, HV_MESSAGE_SIZE); 1452 /** Pointer to a Hyper-V SynIC message. */ 1453 typedef HV_MESSAGE *PHV_MESSAGE; 1454 /** Pointer to const a Hyper-V SynIC message. */ 1455 typedef HV_MESSAGE const *PCHV_MESSAGE; 1456 1085 1457 #endif 1086 1458
Note:
See TracChangeset
for help on using the changeset viewer.