VirtualBox

Changeset 71129 in vbox for trunk/include/iprt/nt


Ignore:
Timestamp:
Feb 26, 2018 3:58:50 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
121015
Message:

VMM/NEM/win: Reimplemented virtual process API, optimizing the cancel case and prepping for doing this from ring-0. bugref:9044

Location:
trunk/include/iprt/nt
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/nt/hyperv.h

    r71087 r71129  
    2828#define ___iprt_nt_hyperv_h
    2929
     30
    3031#ifndef IN_IDA_PRO
    3132# include <iprt/types.h>
     
    5354/** Hyper-V unsigned 128-bit integer type.   */
    5455typedef struct { uint64_t Low64, High64; } HV_UINT128;
     56/** Hyper-V port ID. */
     57typedef 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. */
     67typedef HV_PORT_ID *PHV_PORT_ID;
    5568
    5669
     
    917930    };
    918931} HV_X64_SEGMENT_REGISTER;
     932AssertCompileSize(HV_X64_SEGMENT_REGISTER, 16);
    919933/** Pointer to a value of HvX64RegisterEs..Tr. */
    920934typedef HV_X64_SEGMENT_REGISTER *PHV_X64_SEGMENT_REGISTER;
     
    928942    uint64_t            Base;
    929943} HV_X64_TABLE_REGISTER;
     944AssertCompileSize(HV_X64_TABLE_REGISTER, 16);
    930945/** Pointer to a value of HvX64RegisterIdtr/Gdtrr. */
    931946typedef HV_X64_TABLE_REGISTER *PHV_X64_TABLE_REGISTER;
     
    10831098
    10841099
     1100
     1101/**
     1102 * Hyper-V SyncIC message types.
     1103 */
     1104typedef 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;
     1144AssertCompileSize(HV_MESSAGE_TYPE, 4);
     1145AssertCompile(HvMessageTypeX64RegisterIntercept == 0x80010006);
     1146AssertCompile(HvMessageTypeX64Halt == 0x80010007);
     1147AssertCompile(HvMessageTypeX64InterruptWindow == 0x80010008);
     1148/** Pointer to a Hyper-V SyncIC message type. */
     1149typedef 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.   */
     1163typedef 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;
     1173AssertCompileSize(HV_MESSAGE_FLAGS, 1);
     1174
     1175/** SynIC message header. */
     1176typedef 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;
     1190AssertCompileSize(HV_MESSAGE_HEADER, 16);
     1191/** Pointer to a Hyper-V message header. */
     1192typedef HV_MESSAGE_HEADER *PHV_MESSAGE_HEADER;
     1193/** Pointer to a const Hyper-V message header. */
     1194typedef HV_MESSAGE_HEADER const *PCHV_MESSAGE_HEADER;
     1195
     1196
     1197
     1198/** @name Intercept access type.
     1199 * @{ */
     1200typedef 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 * @{ */
     1208typedef 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 */
     1217typedef 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;
     1233AssertCompileSize(HV_X64_VP_EXECUTION_STATE, 2);
     1234/** Pointer to X86 intercept execution state. */
     1235typedef HV_X64_VP_EXECUTION_STATE *PHV_X64_VP_EXECUTION_STATE;
     1236/** Pointer to const X86 intercept execution state. */
     1237typedef HV_X64_VP_EXECUTION_STATE const *PCHV_X64_VP_EXECUTION_STATE;
     1238
     1239/** X64 intercept message header. */
     1240typedef 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;
     1250AssertCompileSize(HV_X64_INTERCEPT_MESSAGE_HEADER, 40);
     1251/** Pointer to a x86 intercept message header. */
     1252typedef 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 */
     1257typedef 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;
     1266AssertCompileSize(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. */
     1271typedef 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;
     1301AssertCompileSize(HV_X64_MEMORY_INTERCEPT_MESSAGE, 0xf0);
     1302AssertCompileMemberOffset(HV_X64_MEMORY_INTERCEPT_MESSAGE, DsSegment, 0x50);
     1303/** Pointer to a HvMessageTypeGpaIntercept or HvMessageTypeUnmappedGpa payload. */
     1304typedef HV_X64_MEMORY_INTERCEPT_MESSAGE *PHV_X64_MEMORY_INTERCEPT_MESSAGE;
     1305/** Pointer to a const HvMessageTypeGpaIntercept or HvMessageTypeUnmappedGpa payload. */
     1306typedef HV_X64_MEMORY_INTERCEPT_MESSAGE const *PCHV_X64_MEMORY_INTERCEPT_MESSAGE;
     1307
     1308
     1309/** X64 I/O port access information (HvMessageTypeX64IoPortIntercept). */
     1310typedef 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;
     1321AssertCompileSize(HV_X64_IO_PORT_ACCESS_INFO, 1);
     1322
     1323/** The payload format for HvMessageTypeX64IoPortIntercept.  */
     1324typedef 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;
     1339AssertCompileSize(HV_X64_IO_PORT_INTERCEPT_MESSAGE, 128);
     1340/** Pointer to a HvMessageTypeX64IoPortIntercept payload. */
     1341typedef HV_X64_IO_PORT_INTERCEPT_MESSAGE *PHV_X64_IO_PORT_INTERCEPT_MESSAGE;
     1342/** Pointer to a const HvMessageTypeX64IoPortIntercept payload. */
     1343typedef HV_X64_IO_PORT_INTERCEPT_MESSAGE const *PCHV_X64_IO_PORT_INTERCEPT_MESSAGE;
     1344
     1345/** Full I/O port message. */
     1346typedef 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 */
     1355typedef 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;
     1365AssertCompileSize(HV_X64_EXCEPTION_INFO, 1);
     1366
     1367/** The payload format for HvMessageTypeX64ExceptionIntercept.
     1368 * @sa   WHV_VP_EXCEPTION_CONTEXT
     1369 * @note max message size. */
     1370typedef 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;
     1399AssertCompileSize(HV_X64_EXCEPTION_INTERCEPT_MESSAGE, 0xf0);
     1400/** Pointer to a HvMessageTypeX64ExceptionIntercept payload. */
     1401typedef HV_X64_EXCEPTION_INTERCEPT_MESSAGE *PHV_X64_EXCEPTION_INTERCEPT_MESSAGE;
     1402/** Pointer to a ocnst HvMessageTypeX64ExceptionIntercept payload. */
     1403typedef 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 */
     1411typedef 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. */
     1417typedef HV_X64_HALT_MESSAGE *PHV_X64_HALT_MESSAGE;
     1418/** Pointer to a const HvMessageTypeX64Halt payload. */
     1419typedef HV_X64_HALT_MESSAGE const *PCHV_X64_HALT_MESSAGE;
     1420
     1421/** Full HvMessageTypeX64Halt message. */
     1422typedef 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. */
     1431typedef 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;
     1451AssertCompileSize(HV_MESSAGE, HV_MESSAGE_SIZE);
     1452/** Pointer to a Hyper-V SynIC message. */
     1453typedef HV_MESSAGE *PHV_MESSAGE;
     1454/** Pointer to const a Hyper-V SynIC message. */
     1455typedef HV_MESSAGE const *PCHV_MESSAGE;
     1456
    10851457#endif
    10861458
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette