- Timestamp:
- Mar 27, 2025 10:22:31 AM (3 weeks ago)
- svn:sync-xref-src-repo-rev:
- 168190
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/NEMR3Native-win-armv8.cpp
r108761 r108763 278 278 279 279 280 #define WHV_REGNM(a_Suffix) WHvArm64Register ## a_Suffix 281 /** The general registers. */ 282 static const struct 283 { 284 WHV_REGISTER_NAME enmWHvReg; 285 uint32_t fCpumExtrn; 286 uintptr_t offCpumCtx; 287 } s_aCpumRegs[] = 288 { 289 #define CPUM_GREG_EMIT_X0_X3(a_Idx) { WHV_REGNM(X ## a_Idx), CPUMCTX_EXTRN_X ## a_Idx, RT_UOFFSETOF(CPUMCTX, aGRegs[a_Idx].x) } 290 #define CPUM_GREG_EMIT_X4_X28(a_Idx) { WHV_REGNM(X ## a_Idx), CPUMCTX_EXTRN_X4_X28, RT_UOFFSETOF(CPUMCTX, aGRegs[a_Idx].x) } 291 CPUM_GREG_EMIT_X0_X3(0), 292 CPUM_GREG_EMIT_X0_X3(1), 293 CPUM_GREG_EMIT_X0_X3(2), 294 CPUM_GREG_EMIT_X0_X3(3), 295 CPUM_GREG_EMIT_X4_X28(4), 296 CPUM_GREG_EMIT_X4_X28(5), 297 CPUM_GREG_EMIT_X4_X28(6), 298 CPUM_GREG_EMIT_X4_X28(7), 299 CPUM_GREG_EMIT_X4_X28(8), 300 CPUM_GREG_EMIT_X4_X28(9), 301 CPUM_GREG_EMIT_X4_X28(10), 302 CPUM_GREG_EMIT_X4_X28(11), 303 CPUM_GREG_EMIT_X4_X28(12), 304 CPUM_GREG_EMIT_X4_X28(13), 305 CPUM_GREG_EMIT_X4_X28(14), 306 CPUM_GREG_EMIT_X4_X28(15), 307 CPUM_GREG_EMIT_X4_X28(16), 308 CPUM_GREG_EMIT_X4_X28(17), 309 CPUM_GREG_EMIT_X4_X28(18), 310 CPUM_GREG_EMIT_X4_X28(19), 311 CPUM_GREG_EMIT_X4_X28(20), 312 CPUM_GREG_EMIT_X4_X28(21), 313 CPUM_GREG_EMIT_X4_X28(22), 314 CPUM_GREG_EMIT_X4_X28(23), 315 CPUM_GREG_EMIT_X4_X28(24), 316 CPUM_GREG_EMIT_X4_X28(25), 317 CPUM_GREG_EMIT_X4_X28(26), 318 CPUM_GREG_EMIT_X4_X28(27), 319 CPUM_GREG_EMIT_X4_X28(28), 320 { WHV_REGNM(Fp), CPUMCTX_EXTRN_FP, RT_UOFFSETOF(CPUMCTX, aGRegs[29].x) }, 321 { WHV_REGNM(Lr), CPUMCTX_EXTRN_LR, RT_UOFFSETOF(CPUMCTX, aGRegs[30].x) }, 322 { WHV_REGNM(Pc), CPUMCTX_EXTRN_PC, RT_UOFFSETOF(CPUMCTX, Pc.u64) }, 323 { WHV_REGNM(Fpcr), CPUMCTX_EXTRN_FPCR, RT_UOFFSETOF(CPUMCTX, fpcr) }, 324 { WHV_REGNM(Fpsr), CPUMCTX_EXTRN_FPSR, RT_UOFFSETOF(CPUMCTX, fpsr) } 325 #undef CPUM_GREG_EMIT_X0_X3 326 #undef CPUM_GREG_EMIT_X4_X28 327 }; 328 /** SIMD/FP registers. */ 329 static const struct 330 { 331 WHV_REGISTER_NAME enmWHvReg; 332 uintptr_t offCpumCtx; 333 } s_aCpumFpRegs[] = 334 { 335 #define CPUM_VREG_EMIT(a_Idx) { WHV_REGNM(Q ## a_Idx), RT_UOFFSETOF(CPUMCTX, aVRegs[a_Idx].v) } 336 CPUM_VREG_EMIT(0), 337 CPUM_VREG_EMIT(1), 338 CPUM_VREG_EMIT(2), 339 CPUM_VREG_EMIT(3), 340 CPUM_VREG_EMIT(4), 341 CPUM_VREG_EMIT(5), 342 CPUM_VREG_EMIT(6), 343 CPUM_VREG_EMIT(7), 344 CPUM_VREG_EMIT(8), 345 CPUM_VREG_EMIT(9), 346 CPUM_VREG_EMIT(10), 347 CPUM_VREG_EMIT(11), 348 CPUM_VREG_EMIT(12), 349 CPUM_VREG_EMIT(13), 350 CPUM_VREG_EMIT(14), 351 CPUM_VREG_EMIT(15), 352 CPUM_VREG_EMIT(16), 353 CPUM_VREG_EMIT(17), 354 CPUM_VREG_EMIT(18), 355 CPUM_VREG_EMIT(19), 356 CPUM_VREG_EMIT(20), 357 CPUM_VREG_EMIT(21), 358 CPUM_VREG_EMIT(22), 359 CPUM_VREG_EMIT(23), 360 CPUM_VREG_EMIT(24), 361 CPUM_VREG_EMIT(25), 362 CPUM_VREG_EMIT(26), 363 CPUM_VREG_EMIT(27), 364 CPUM_VREG_EMIT(28), 365 CPUM_VREG_EMIT(29), 366 CPUM_VREG_EMIT(30), 367 CPUM_VREG_EMIT(31) 368 #undef CPUM_VREG_EMIT 369 }; 370 /** PAuth key system registers. */ 371 static const struct 372 { 373 WHV_REGISTER_NAME enmWHvReg; 374 uintptr_t offCpumCtx; 375 } s_aCpumPAuthKeyRegs[] = 376 { 377 { WHV_REGNM(ApdAKeyLoEl1), RT_UOFFSETOF(CPUMCTX, Apda.Low.u64) }, 378 { WHV_REGNM(ApdAKeyHiEl1), RT_UOFFSETOF(CPUMCTX, Apda.High.u64) }, 379 { WHV_REGNM(ApdBKeyLoEl1), RT_UOFFSETOF(CPUMCTX, Apdb.Low.u64) }, 380 { WHV_REGNM(ApdBKeyHiEl1), RT_UOFFSETOF(CPUMCTX, Apdb.High.u64) }, 381 { WHV_REGNM(ApgAKeyLoEl1), RT_UOFFSETOF(CPUMCTX, Apga.Low.u64) }, 382 { WHV_REGNM(ApgAKeyHiEl1), RT_UOFFSETOF(CPUMCTX, Apga.High.u64) }, 383 { WHV_REGNM(ApiAKeyLoEl1), RT_UOFFSETOF(CPUMCTX, Apia.Low.u64) }, 384 { WHV_REGNM(ApiAKeyHiEl1), RT_UOFFSETOF(CPUMCTX, Apia.High.u64) }, 385 { WHV_REGNM(ApiBKeyLoEl1), RT_UOFFSETOF(CPUMCTX, Apib.Low.u64) }, 386 { WHV_REGNM(ApiBKeyHiEl1), RT_UOFFSETOF(CPUMCTX, Apib.High.u64) } 387 }; 388 /** System registers. */ 389 static const struct 390 { 391 WHV_REGISTER_NAME enmWHvReg; 392 uint32_t fCpumExtrn; 393 uintptr_t offCpumCtx; 394 } s_aCpumSysRegs[] = 395 { 396 { WHV_REGNM(SpEl0), CPUMCTX_EXTRN_SP, RT_UOFFSETOF(CPUMCTX, aSpReg[0].u64) }, 397 { WHV_REGNM(SpEl1), CPUMCTX_EXTRN_SP, RT_UOFFSETOF(CPUMCTX, aSpReg[1].u64) }, 398 { WHV_REGNM(SpsrEl1), CPUMCTX_EXTRN_SPSR, RT_UOFFSETOF(CPUMCTX, Spsr.u64) }, 399 { WHV_REGNM(ElrEl1), CPUMCTX_EXTRN_ELR, RT_UOFFSETOF(CPUMCTX, Elr.u64) }, 400 { WHV_REGNM(SctlrEl1), CPUMCTX_EXTRN_SCTLR_TCR_TTBR, RT_UOFFSETOF(CPUMCTX, Sctlr.u64) }, 401 { WHV_REGNM(TcrEl1), CPUMCTX_EXTRN_SCTLR_TCR_TTBR, RT_UOFFSETOF(CPUMCTX, Tcr.u64) }, 402 { WHV_REGNM(Ttbr0El1), CPUMCTX_EXTRN_SCTLR_TCR_TTBR, RT_UOFFSETOF(CPUMCTX, Ttbr0.u64) }, 403 { WHV_REGNM(Ttbr1El1), CPUMCTX_EXTRN_SCTLR_TCR_TTBR, RT_UOFFSETOF(CPUMCTX, Ttbr1.u64) }, 404 { WHV_REGNM(VbarEl1), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, VBar.u64) }, 405 { WHV_REGNM(CntkctlEl1), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, CntKCtl.u64) }, 406 { WHV_REGNM(ContextidrEl1), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, ContextIdr.u64) }, 407 { WHV_REGNM(CpacrEl1), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, Cpacr.u64) }, 408 { WHV_REGNM(CsselrEl1), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, Csselr.u64) }, 409 { WHV_REGNM(EsrEl1), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, Esr.u64) }, 410 { WHV_REGNM(FarEl1), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, Far.u64) }, 411 { WHV_REGNM(MairEl1), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, Mair.u64) }, 412 { WHV_REGNM(ParEl1), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, Par.u64) }, 413 { WHV_REGNM(TpidrroEl0), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, TpIdrRoEl0.u64) }, 414 { WHV_REGNM(TpidrEl0), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, aTpIdr[0].u64) }, 415 { WHV_REGNM(TpidrEl1), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, aTpIdr[1].u64) }, 416 { My_WHvArm64RegisterActlrEl1, CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, Actlr.u64) } 417 #if 0 /* Not available in Hyper-V */ 418 { WHV_REGNM(), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, Afsr0.u64) }, 419 { WHV_REGNM(), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, Afsr1.u64) }, 420 { WHV_REGNM(), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, Amair.u64) }, 421 { WHV_REGNM(), CPUMCTX_EXTRN_SYSREG_MISC, RT_UOFFSETOF(CPUMCTX, MDccInt.u64) } 422 #endif 423 }; 424 425 280 426 /********************************************************************************************************************************* 281 427 * Internal Functions * … … 401 547 #define NEM_LOG_REL_CAP_SUB(a_szField, a_Value) NEM_LOG_REL_CAP_SUB_EX(a_szField, "%d", a_Value) 402 548 403 /*404 * Is the hypervisor present with the desired capability?405 *406 * In build 17083 this translates into:407 * - CPUID[0x00000001].HVP is set408 * - CPUID[0x40000000] == "Microsoft Hv"409 * - CPUID[0x40000001].eax == "Hv#1"410 * - CPUID[0x40000003].ebx[12] is set.411 * - VidGetExoPartitionProperty(INVALID_HANDLE_VALUE, 0x60000, &Ignored) returns412 * a non-zero value.413 */414 /**415 * @todo Someone at Microsoft please explain weird API design:416 * 1. Pointless CapabilityCode duplication int the output;417 * 2. No output size.418 */419 549 WHV_CAPABILITY Caps; 420 550 RT_ZERO(Caps); … … 1276 1406 } while (0) 1277 1407 1278 /* GPRs */ 1279 if (fWhat & CPUMCTX_EXTRN_GPRS_MASK) 1280 { 1281 if (fWhat & CPUMCTX_EXTRN_X0) 1282 ADD_REG64(WHvArm64RegisterX0, pVCpu->cpum.GstCtx.aGRegs[0]); 1283 if (fWhat & CPUMCTX_EXTRN_X1) 1284 ADD_REG64(WHvArm64RegisterX1, pVCpu->cpum.GstCtx.aGRegs[1]); 1285 if (fWhat & CPUMCTX_EXTRN_X2) 1286 ADD_REG64(WHvArm64RegisterX2, pVCpu->cpum.GstCtx.aGRegs[2]); 1287 if (fWhat & CPUMCTX_EXTRN_X3) 1288 ADD_REG64(WHvArm64RegisterX3, pVCpu->cpum.GstCtx.aGRegs[3]); 1289 if (fWhat & CPUMCTX_EXTRN_X4_X28) 1290 { 1291 ADD_REG64(WHvArm64RegisterX4, pVCpu->cpum.GstCtx.aGRegs[4]); 1292 ADD_REG64(WHvArm64RegisterX5, pVCpu->cpum.GstCtx.aGRegs[5]); 1293 ADD_REG64(WHvArm64RegisterX6, pVCpu->cpum.GstCtx.aGRegs[6]); 1294 ADD_REG64(WHvArm64RegisterX7, pVCpu->cpum.GstCtx.aGRegs[7]); 1295 ADD_REG64(WHvArm64RegisterX8, pVCpu->cpum.GstCtx.aGRegs[8]); 1296 ADD_REG64(WHvArm64RegisterX9, pVCpu->cpum.GstCtx.aGRegs[9]); 1297 ADD_REG64(WHvArm64RegisterX10, pVCpu->cpum.GstCtx.aGRegs[10]); 1298 ADD_REG64(WHvArm64RegisterX11, pVCpu->cpum.GstCtx.aGRegs[11]); 1299 ADD_REG64(WHvArm64RegisterX12, pVCpu->cpum.GstCtx.aGRegs[12]); 1300 ADD_REG64(WHvArm64RegisterX13, pVCpu->cpum.GstCtx.aGRegs[13]); 1301 ADD_REG64(WHvArm64RegisterX14, pVCpu->cpum.GstCtx.aGRegs[14]); 1302 ADD_REG64(WHvArm64RegisterX15, pVCpu->cpum.GstCtx.aGRegs[15]); 1303 ADD_REG64(WHvArm64RegisterX16, pVCpu->cpum.GstCtx.aGRegs[16]); 1304 ADD_REG64(WHvArm64RegisterX17, pVCpu->cpum.GstCtx.aGRegs[17]); 1305 ADD_REG64(WHvArm64RegisterX18, pVCpu->cpum.GstCtx.aGRegs[18]); 1306 ADD_REG64(WHvArm64RegisterX19, pVCpu->cpum.GstCtx.aGRegs[19]); 1307 ADD_REG64(WHvArm64RegisterX20, pVCpu->cpum.GstCtx.aGRegs[20]); 1308 ADD_REG64(WHvArm64RegisterX21, pVCpu->cpum.GstCtx.aGRegs[21]); 1309 ADD_REG64(WHvArm64RegisterX22, pVCpu->cpum.GstCtx.aGRegs[22]); 1310 ADD_REG64(WHvArm64RegisterX23, pVCpu->cpum.GstCtx.aGRegs[23]); 1311 ADD_REG64(WHvArm64RegisterX24, pVCpu->cpum.GstCtx.aGRegs[24]); 1312 ADD_REG64(WHvArm64RegisterX25, pVCpu->cpum.GstCtx.aGRegs[25]); 1313 ADD_REG64(WHvArm64RegisterX26, pVCpu->cpum.GstCtx.aGRegs[26]); 1314 ADD_REG64(WHvArm64RegisterX27, pVCpu->cpum.GstCtx.aGRegs[27]); 1315 ADD_REG64(WHvArm64RegisterX28, pVCpu->cpum.GstCtx.aGRegs[28]); 1316 } 1317 if (fWhat & CPUMCTX_EXTRN_LR) 1318 ADD_REG64(WHvArm64RegisterLr, pVCpu->cpum.GstCtx.aGRegs[30]); 1319 if (fWhat & CPUMCTX_EXTRN_FP) 1320 ADD_REG64(WHvArm64RegisterFp, pVCpu->cpum.GstCtx.aGRegs[29]); 1321 } 1322 1323 /* RIP & Flags */ 1324 if (fWhat & CPUMCTX_EXTRN_PC) 1325 ADD_SYSREG64(WHvArm64RegisterPc, pVCpu->cpum.GstCtx.Pc); 1408 if ( (pVCpu->cpum.GstCtx.fExtrn & (CPUMCTX_EXTRN_GPRS_MASK | CPUMCTX_EXTRN_PC | CPUMCTX_EXTRN_FPCR | CPUMCTX_EXTRN_FPSR)) 1409 != (CPUMCTX_EXTRN_GPRS_MASK | CPUMCTX_EXTRN_PC | CPUMCTX_EXTRN_FPCR | CPUMCTX_EXTRN_FPSR)) 1410 { 1411 for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumRegs); i++) 1412 { 1413 if (!(s_aCpumRegs[i].fCpumExtrn & pVCpu->cpum.GstCtx.fExtrn)) 1414 { 1415 const CPUMCTXGREG *pReg = (const CPUMCTXGREG *)((uint8_t *)&pVCpu->cpum.GstCtx + s_aCpumRegs[i].offCpumCtx); 1416 ADD_REG64(s_aCpumRegs[i].enmWHvReg, *pReg); 1417 } 1418 } 1419 } 1420 1421 if (fWhat & CPUMCTX_EXTRN_V0_V31) 1422 { 1423 /* SIMD/FP registers. */ 1424 for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumFpRegs); i++) 1425 { 1426 PCCPUMCTXVREG pVReg = (PCCPUMCTXVREG)((uint8_t *)&pVCpu->cpum.GstCtx + s_aCpumFpRegs[i].offCpumCtx); 1427 ADD_REG128(s_aCpumFpRegs[i].enmWHvReg, *pVReg); 1428 } 1429 } 1430 1431 if (fWhat & CPUMCTX_EXTRN_SYSREG_DEBUG) 1432 { 1433 for (uint32_t i = 0; i < pVM->nem.s.cBreakpoints; i++) 1434 { 1435 ADD_SYSREG64((WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgbcr0El1 + i), pVCpu->cpum.GstCtx.aBp[i].Ctrl); 1436 ADD_SYSREG64((WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgbvr0El1 + i), pVCpu->cpum.GstCtx.aBp[i].Value); 1437 } 1438 1439 for (uint32_t i = 0; i < pVM->nem.s.cWatchpoints; i++) 1440 { 1441 ADD_SYSREG64((WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgwcr0El1 + i), pVCpu->cpum.GstCtx.aWp[i].Ctrl); 1442 ADD_SYSREG64((WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgwvr0El1 + i), pVCpu->cpum.GstCtx.aWp[i].Value); 1443 } 1444 1445 ADD_SYSREG64(WHvArm64RegisterMdscrEl1, pVCpu->cpum.GstCtx.Mdscr); 1446 } 1447 1448 if (fWhat & CPUMCTX_EXTRN_SYSREG_PAUTH_KEYS) 1449 { 1450 /* PAuth registers. */ 1451 for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumPAuthKeyRegs); i++) 1452 { 1453 const CPUMCTXSYSREG *pReg = (const CPUMCTXSYSREG *)((uint8_t *)&pVCpu->cpum.GstCtx + s_aCpumPAuthKeyRegs[i].offCpumCtx); 1454 ADD_SYSREG64(s_aCpumPAuthKeyRegs[i].enmWHvReg, *pReg); 1455 } 1456 } 1457 1458 if ( (pVCpu->cpum.GstCtx.fExtrn & (CPUMCTX_EXTRN_SPSR | CPUMCTX_EXTRN_ELR | CPUMCTX_EXTRN_SP | CPUMCTX_EXTRN_SCTLR_TCR_TTBR | CPUMCTX_EXTRN_SYSREG_MISC)) 1459 != (CPUMCTX_EXTRN_SPSR | CPUMCTX_EXTRN_ELR | CPUMCTX_EXTRN_SP | CPUMCTX_EXTRN_SCTLR_TCR_TTBR | CPUMCTX_EXTRN_SYSREG_MISC)) 1460 { 1461 /* System registers. */ 1462 for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumSysRegs); i++) 1463 { 1464 if (!(s_aCpumSysRegs[i].fCpumExtrn & pVCpu->cpum.GstCtx.fExtrn)) 1465 { 1466 const CPUMCTXSYSREG *pReg = (const CPUMCTXSYSREG *)((uint8_t *)&pVCpu->cpum.GstCtx + s_aCpumSysRegs[i].offCpumCtx); 1467 ADD_SYSREG64(s_aCpumSysRegs[i].enmWHvReg, *pReg); 1468 } 1469 } 1470 } 1471 1326 1472 if (fWhat & CPUMCTX_EXTRN_PSTATE) 1327 1473 ADD_REG64_RAW(WHvArm64RegisterPstate, pVCpu->cpum.GstCtx.fPState); 1328 if (fWhat & CPUMCTX_EXTRN_SPSR)1329 ADD_SYSREG64(WHvArm64RegisterSpsrEl1, pVCpu->cpum.GstCtx.Spsr);1330 if (fWhat & CPUMCTX_EXTRN_ELR)1331 ADD_SYSREG64(WHvArm64RegisterElrEl1, pVCpu->cpum.GstCtx.Elr);1332 if (fWhat & CPUMCTX_EXTRN_SP)1333 {1334 ADD_SYSREG64(WHvArm64RegisterSpEl0, pVCpu->cpum.GstCtx.aSpReg[0]);1335 ADD_SYSREG64(WHvArm64RegisterSpEl1, pVCpu->cpum.GstCtx.aSpReg[1]);1336 }1337 if (fWhat & CPUMCTX_EXTRN_SCTLR_TCR_TTBR)1338 {1339 ADD_SYSREG64(WHvArm64RegisterSctlrEl1, pVCpu->cpum.GstCtx.Sctlr);1340 ADD_SYSREG64(WHvArm64RegisterTcrEl1, pVCpu->cpum.GstCtx.Tcr);1341 ADD_SYSREG64(WHvArm64RegisterTtbr0El1, pVCpu->cpum.GstCtx.Ttbr0);1342 ADD_SYSREG64(WHvArm64RegisterTtbr1El1, pVCpu->cpum.GstCtx.Ttbr1);1343 }1344 1345 /* Vector state. */1346 if (fWhat & CPUMCTX_EXTRN_V0_V31)1347 {1348 ADD_REG128(WHvArm64RegisterQ0, pVCpu->cpum.GstCtx.aVRegs[0]);1349 ADD_REG128(WHvArm64RegisterQ1, pVCpu->cpum.GstCtx.aVRegs[1]);1350 ADD_REG128(WHvArm64RegisterQ2, pVCpu->cpum.GstCtx.aVRegs[2]);1351 ADD_REG128(WHvArm64RegisterQ3, pVCpu->cpum.GstCtx.aVRegs[3]);1352 ADD_REG128(WHvArm64RegisterQ4, pVCpu->cpum.GstCtx.aVRegs[4]);1353 ADD_REG128(WHvArm64RegisterQ5, pVCpu->cpum.GstCtx.aVRegs[5]);1354 ADD_REG128(WHvArm64RegisterQ6, pVCpu->cpum.GstCtx.aVRegs[6]);1355 ADD_REG128(WHvArm64RegisterQ7, pVCpu->cpum.GstCtx.aVRegs[7]);1356 ADD_REG128(WHvArm64RegisterQ8, pVCpu->cpum.GstCtx.aVRegs[8]);1357 ADD_REG128(WHvArm64RegisterQ9, pVCpu->cpum.GstCtx.aVRegs[9]);1358 ADD_REG128(WHvArm64RegisterQ10, pVCpu->cpum.GstCtx.aVRegs[10]);1359 ADD_REG128(WHvArm64RegisterQ11, pVCpu->cpum.GstCtx.aVRegs[11]);1360 ADD_REG128(WHvArm64RegisterQ12, pVCpu->cpum.GstCtx.aVRegs[12]);1361 ADD_REG128(WHvArm64RegisterQ13, pVCpu->cpum.GstCtx.aVRegs[13]);1362 ADD_REG128(WHvArm64RegisterQ14, pVCpu->cpum.GstCtx.aVRegs[14]);1363 ADD_REG128(WHvArm64RegisterQ15, pVCpu->cpum.GstCtx.aVRegs[15]);1364 ADD_REG128(WHvArm64RegisterQ16, pVCpu->cpum.GstCtx.aVRegs[16]);1365 ADD_REG128(WHvArm64RegisterQ17, pVCpu->cpum.GstCtx.aVRegs[17]);1366 ADD_REG128(WHvArm64RegisterQ18, pVCpu->cpum.GstCtx.aVRegs[18]);1367 ADD_REG128(WHvArm64RegisterQ19, pVCpu->cpum.GstCtx.aVRegs[19]);1368 ADD_REG128(WHvArm64RegisterQ20, pVCpu->cpum.GstCtx.aVRegs[20]);1369 ADD_REG128(WHvArm64RegisterQ21, pVCpu->cpum.GstCtx.aVRegs[21]);1370 ADD_REG128(WHvArm64RegisterQ22, pVCpu->cpum.GstCtx.aVRegs[22]);1371 ADD_REG128(WHvArm64RegisterQ23, pVCpu->cpum.GstCtx.aVRegs[23]);1372 ADD_REG128(WHvArm64RegisterQ24, pVCpu->cpum.GstCtx.aVRegs[24]);1373 ADD_REG128(WHvArm64RegisterQ25, pVCpu->cpum.GstCtx.aVRegs[25]);1374 ADD_REG128(WHvArm64RegisterQ26, pVCpu->cpum.GstCtx.aVRegs[26]);1375 ADD_REG128(WHvArm64RegisterQ27, pVCpu->cpum.GstCtx.aVRegs[27]);1376 ADD_REG128(WHvArm64RegisterQ28, pVCpu->cpum.GstCtx.aVRegs[28]);1377 ADD_REG128(WHvArm64RegisterQ29, pVCpu->cpum.GstCtx.aVRegs[29]);1378 ADD_REG128(WHvArm64RegisterQ30, pVCpu->cpum.GstCtx.aVRegs[30]);1379 ADD_REG128(WHvArm64RegisterQ31, pVCpu->cpum.GstCtx.aVRegs[31]);1380 }1381 1382 if (fWhat & CPUMCTX_EXTRN_FPCR)1383 ADD_REG64_RAW(WHvArm64RegisterFpcr, pVCpu->cpum.GstCtx.fpcr);1384 if (fWhat & CPUMCTX_EXTRN_FPSR)1385 ADD_REG64_RAW(WHvArm64RegisterFpsr, pVCpu->cpum.GstCtx.fpsr);1386 1387 /* System registers. */1388 if (fWhat & CPUMCTX_EXTRN_SYSREG_MISC)1389 {1390 ADD_SYSREG64(WHvArm64RegisterVbarEl1, pVCpu->cpum.GstCtx.VBar);1391 ADD_SYSREG64(WHvArm64RegisterEsrEl1, pVCpu->cpum.GstCtx.Esr);1392 ADD_SYSREG64(WHvArm64RegisterFarEl1, pVCpu->cpum.GstCtx.Far);1393 ADD_SYSREG64(WHvArm64RegisterCntkctlEl1, pVCpu->cpum.GstCtx.CntKCtl);1394 ADD_SYSREG64(WHvArm64RegisterContextidrEl1, pVCpu->cpum.GstCtx.ContextIdr);1395 ADD_SYSREG64(WHvArm64RegisterCpacrEl1, pVCpu->cpum.GstCtx.Cpacr);1396 ADD_SYSREG64(WHvArm64RegisterCsselrEl1, pVCpu->cpum.GstCtx.Csselr);1397 ADD_SYSREG64(WHvArm64RegisterMairEl1, pVCpu->cpum.GstCtx.Mair);1398 ADD_SYSREG64(WHvArm64RegisterParEl1, pVCpu->cpum.GstCtx.Par);1399 ADD_SYSREG64(WHvArm64RegisterTpidrroEl0, pVCpu->cpum.GstCtx.TpIdrRoEl0);1400 ADD_SYSREG64(WHvArm64RegisterTpidrEl0, pVCpu->cpum.GstCtx.aTpIdr[0]);1401 ADD_SYSREG64(WHvArm64RegisterTpidrEl1, pVCpu->cpum.GstCtx.aTpIdr[1]);1402 ADD_SYSREG64(My_WHvArm64RegisterActlrEl1, pVCpu->cpum.GstCtx.Actlr);1403 }1404 1405 if (fWhat & CPUMCTX_EXTRN_SYSREG_DEBUG)1406 {1407 for (uint32_t i = 0; i < pVM->nem.s.cBreakpoints; i++)1408 {1409 ADD_SYSREG64((WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgbcr0El1 + i), pVCpu->cpum.GstCtx.aBp[i].Ctrl);1410 ADD_SYSREG64((WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgbvr0El1 + i), pVCpu->cpum.GstCtx.aBp[i].Value);1411 }1412 1413 for (uint32_t i = 0; i < pVM->nem.s.cWatchpoints; i++)1414 {1415 ADD_SYSREG64((WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgwcr0El1 + i), pVCpu->cpum.GstCtx.aWp[i].Ctrl);1416 ADD_SYSREG64((WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgwvr0El1 + i), pVCpu->cpum.GstCtx.aWp[i].Value);1417 }1418 1419 ADD_SYSREG64(WHvArm64RegisterMdscrEl1, pVCpu->cpum.GstCtx.Mdscr);1420 }1421 1422 if (fWhat & CPUMCTX_EXTRN_SYSREG_PAUTH_KEYS)1423 {1424 ADD_SYSREG64(WHvArm64RegisterApdAKeyHiEl1, pVCpu->cpum.GstCtx.Apda.High);1425 ADD_SYSREG64(WHvArm64RegisterApdAKeyLoEl1, pVCpu->cpum.GstCtx.Apda.Low);1426 ADD_SYSREG64(WHvArm64RegisterApdBKeyHiEl1, pVCpu->cpum.GstCtx.Apdb.High);1427 ADD_SYSREG64(WHvArm64RegisterApdBKeyLoEl1, pVCpu->cpum.GstCtx.Apdb.Low);1428 ADD_SYSREG64(WHvArm64RegisterApgAKeyHiEl1, pVCpu->cpum.GstCtx.Apga.High);1429 ADD_SYSREG64(WHvArm64RegisterApgAKeyLoEl1, pVCpu->cpum.GstCtx.Apga.Low);1430 ADD_SYSREG64(WHvArm64RegisterApiAKeyHiEl1, pVCpu->cpum.GstCtx.Apia.High);1431 ADD_SYSREG64(WHvArm64RegisterApiAKeyLoEl1, pVCpu->cpum.GstCtx.Apia.Low);1432 ADD_SYSREG64(WHvArm64RegisterApiBKeyHiEl1, pVCpu->cpum.GstCtx.Apib.High);1433 ADD_SYSREG64(WHvArm64RegisterApiBKeyLoEl1, pVCpu->cpum.GstCtx.Apib.Low);1434 }1435 1474 1436 1475 #undef ADD_REG64 … … 1466 1505 uintptr_t iReg = 0; 1467 1506 1468 /* GPRs */ 1469 if (fWhat & CPUMCTX_EXTRN_GPRS_MASK) 1470 { 1471 if (fWhat & CPUMCTX_EXTRN_X0) 1472 aenmNames[iReg++] = WHvArm64RegisterX0; 1473 if (fWhat & CPUMCTX_EXTRN_X1) 1474 aenmNames[iReg++] = WHvArm64RegisterX1; 1475 if (fWhat & CPUMCTX_EXTRN_X2) 1476 aenmNames[iReg++] = WHvArm64RegisterX2; 1477 if (fWhat & CPUMCTX_EXTRN_X3) 1478 aenmNames[iReg++] = WHvArm64RegisterX3; 1479 if (fWhat & CPUMCTX_EXTRN_X4_X28) 1480 { 1481 aenmNames[iReg++] = WHvArm64RegisterX4; 1482 aenmNames[iReg++] = WHvArm64RegisterX5; 1483 aenmNames[iReg++] = WHvArm64RegisterX6; 1484 aenmNames[iReg++] = WHvArm64RegisterX7; 1485 aenmNames[iReg++] = WHvArm64RegisterX8; 1486 aenmNames[iReg++] = WHvArm64RegisterX9; 1487 aenmNames[iReg++] = WHvArm64RegisterX10; 1488 aenmNames[iReg++] = WHvArm64RegisterX11; 1489 aenmNames[iReg++] = WHvArm64RegisterX12; 1490 aenmNames[iReg++] = WHvArm64RegisterX13; 1491 aenmNames[iReg++] = WHvArm64RegisterX14; 1492 aenmNames[iReg++] = WHvArm64RegisterX15; 1493 aenmNames[iReg++] = WHvArm64RegisterX16; 1494 aenmNames[iReg++] = WHvArm64RegisterX17; 1495 aenmNames[iReg++] = WHvArm64RegisterX18; 1496 aenmNames[iReg++] = WHvArm64RegisterX19; 1497 aenmNames[iReg++] = WHvArm64RegisterX20; 1498 aenmNames[iReg++] = WHvArm64RegisterX21; 1499 aenmNames[iReg++] = WHvArm64RegisterX22; 1500 aenmNames[iReg++] = WHvArm64RegisterX23; 1501 aenmNames[iReg++] = WHvArm64RegisterX24; 1502 aenmNames[iReg++] = WHvArm64RegisterX25; 1503 aenmNames[iReg++] = WHvArm64RegisterX26; 1504 aenmNames[iReg++] = WHvArm64RegisterX27; 1505 aenmNames[iReg++] = WHvArm64RegisterX28; 1506 } 1507 if (fWhat & CPUMCTX_EXTRN_LR) 1508 aenmNames[iReg++] = WHvArm64RegisterLr; 1509 if (fWhat & CPUMCTX_EXTRN_FP) 1510 aenmNames[iReg++] = WHvArm64RegisterFp; 1511 } 1512 1513 /* PC & Flags */ 1514 if (fWhat & CPUMCTX_EXTRN_PC) 1515 aenmNames[iReg++] = WHvArm64RegisterPc; 1507 if ( (pVCpu->cpum.GstCtx.fExtrn & (CPUMCTX_EXTRN_GPRS_MASK | CPUMCTX_EXTRN_PC | CPUMCTX_EXTRN_FPCR | CPUMCTX_EXTRN_FPSR)) 1508 != (CPUMCTX_EXTRN_GPRS_MASK | CPUMCTX_EXTRN_PC | CPUMCTX_EXTRN_FPCR | CPUMCTX_EXTRN_FPSR)) 1509 { 1510 for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumRegs); i++) 1511 { 1512 if (!(s_aCpumRegs[i].fCpumExtrn & pVCpu->cpum.GstCtx.fExtrn)) 1513 aenmNames[iReg++] = s_aCpumRegs[i].enmWHvReg; 1514 } 1515 } 1516 1517 if (fWhat & CPUMCTX_EXTRN_V0_V31) 1518 { 1519 /* SIMD/FP registers. */ 1520 for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumFpRegs); i++) 1521 { 1522 aenmNames[iReg++] = s_aCpumFpRegs[i].enmWHvReg; 1523 } 1524 } 1525 1526 if (fWhat & CPUMCTX_EXTRN_SYSREG_DEBUG) 1527 { 1528 for (uint32_t i = 0; i < pVM->nem.s.cBreakpoints; i++) 1529 { 1530 aenmNames[iReg++] = (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgbcr0El1 + i); 1531 aenmNames[iReg++] = (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgbvr0El1 + i); 1532 } 1533 1534 for (uint32_t i = 0; i < pVM->nem.s.cWatchpoints; i++) 1535 { 1536 aenmNames[iReg++] = (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgwcr0El1 + i); 1537 aenmNames[iReg++] = (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgwvr0El1 + i); 1538 } 1539 1540 aenmNames[iReg++] = WHvArm64RegisterMdscrEl1; 1541 } 1542 1543 if (fWhat & CPUMCTX_EXTRN_SYSREG_PAUTH_KEYS) 1544 { 1545 /* PAuth registers. */ 1546 for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumPAuthKeyRegs); i++) 1547 { 1548 aenmNames[iReg++] = s_aCpumPAuthKeyRegs[i].enmWHvReg; 1549 } 1550 } 1551 1552 if ( (pVCpu->cpum.GstCtx.fExtrn & (CPUMCTX_EXTRN_SPSR | CPUMCTX_EXTRN_ELR | CPUMCTX_EXTRN_SP | CPUMCTX_EXTRN_SCTLR_TCR_TTBR | CPUMCTX_EXTRN_SYSREG_MISC)) 1553 != (CPUMCTX_EXTRN_SPSR | CPUMCTX_EXTRN_ELR | CPUMCTX_EXTRN_SP | CPUMCTX_EXTRN_SCTLR_TCR_TTBR | CPUMCTX_EXTRN_SYSREG_MISC)) 1554 { 1555 /* System registers. */ 1556 for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumSysRegs); i++) 1557 { 1558 if (!(s_aCpumSysRegs[i].fCpumExtrn & pVCpu->cpum.GstCtx.fExtrn)) 1559 aenmNames[iReg++] = s_aCpumSysRegs[i].enmWHvReg; 1560 } 1561 } 1562 1516 1563 if (fWhat & CPUMCTX_EXTRN_PSTATE) 1517 1564 aenmNames[iReg++] = WHvArm64RegisterPstate; 1518 if (fWhat & CPUMCTX_EXTRN_SPSR)1519 aenmNames[iReg++] = WHvArm64RegisterSpsrEl1;1520 if (fWhat & CPUMCTX_EXTRN_ELR)1521 aenmNames[iReg++] = WHvArm64RegisterElrEl1;1522 if (fWhat & CPUMCTX_EXTRN_SP)1523 {1524 aenmNames[iReg++] = WHvArm64RegisterSpEl0;1525 aenmNames[iReg++] = WHvArm64RegisterSpEl1;1526 }1527 if (fWhat & CPUMCTX_EXTRN_SCTLR_TCR_TTBR)1528 {1529 aenmNames[iReg++] = WHvArm64RegisterSctlrEl1;1530 aenmNames[iReg++] = WHvArm64RegisterTcrEl1;1531 aenmNames[iReg++] = WHvArm64RegisterTtbr0El1;1532 aenmNames[iReg++] = WHvArm64RegisterTtbr1El1;1533 }1534 1535 /* Vector state. */1536 if (fWhat & CPUMCTX_EXTRN_V0_V31)1537 {1538 aenmNames[iReg++] = WHvArm64RegisterQ0;1539 aenmNames[iReg++] = WHvArm64RegisterQ1;1540 aenmNames[iReg++] = WHvArm64RegisterQ2;1541 aenmNames[iReg++] = WHvArm64RegisterQ3;1542 aenmNames[iReg++] = WHvArm64RegisterQ4;1543 aenmNames[iReg++] = WHvArm64RegisterQ5;1544 aenmNames[iReg++] = WHvArm64RegisterQ6;1545 aenmNames[iReg++] = WHvArm64RegisterQ7;1546 aenmNames[iReg++] = WHvArm64RegisterQ8;1547 aenmNames[iReg++] = WHvArm64RegisterQ9;1548 aenmNames[iReg++] = WHvArm64RegisterQ10;1549 aenmNames[iReg++] = WHvArm64RegisterQ11;1550 aenmNames[iReg++] = WHvArm64RegisterQ12;1551 aenmNames[iReg++] = WHvArm64RegisterQ13;1552 aenmNames[iReg++] = WHvArm64RegisterQ14;1553 aenmNames[iReg++] = WHvArm64RegisterQ15;1554 1555 aenmNames[iReg++] = WHvArm64RegisterQ16;1556 aenmNames[iReg++] = WHvArm64RegisterQ17;1557 aenmNames[iReg++] = WHvArm64RegisterQ18;1558 aenmNames[iReg++] = WHvArm64RegisterQ19;1559 aenmNames[iReg++] = WHvArm64RegisterQ20;1560 aenmNames[iReg++] = WHvArm64RegisterQ21;1561 aenmNames[iReg++] = WHvArm64RegisterQ22;1562 aenmNames[iReg++] = WHvArm64RegisterQ23;1563 aenmNames[iReg++] = WHvArm64RegisterQ24;1564 aenmNames[iReg++] = WHvArm64RegisterQ25;1565 aenmNames[iReg++] = WHvArm64RegisterQ26;1566 aenmNames[iReg++] = WHvArm64RegisterQ27;1567 aenmNames[iReg++] = WHvArm64RegisterQ28;1568 aenmNames[iReg++] = WHvArm64RegisterQ29;1569 aenmNames[iReg++] = WHvArm64RegisterQ30;1570 aenmNames[iReg++] = WHvArm64RegisterQ31;1571 }1572 if (fWhat & CPUMCTX_EXTRN_FPCR)1573 aenmNames[iReg++] = WHvArm64RegisterFpcr;1574 if (fWhat & CPUMCTX_EXTRN_FPSR)1575 aenmNames[iReg++] = WHvArm64RegisterFpsr;1576 1577 /* System registers. */1578 if (fWhat & CPUMCTX_EXTRN_SYSREG_MISC)1579 {1580 aenmNames[iReg++] = WHvArm64RegisterVbarEl1;1581 aenmNames[iReg++] = WHvArm64RegisterEsrEl1;1582 aenmNames[iReg++] = WHvArm64RegisterFarEl1;1583 aenmNames[iReg++] = WHvArm64RegisterCntkctlEl1;1584 aenmNames[iReg++] = WHvArm64RegisterContextidrEl1;1585 aenmNames[iReg++] = WHvArm64RegisterCpacrEl1;1586 aenmNames[iReg++] = WHvArm64RegisterCsselrEl1;1587 aenmNames[iReg++] = WHvArm64RegisterMairEl1;1588 aenmNames[iReg++] = WHvArm64RegisterParEl1;1589 aenmNames[iReg++] = WHvArm64RegisterTpidrroEl0;1590 aenmNames[iReg++] = WHvArm64RegisterTpidrEl0;1591 aenmNames[iReg++] = WHvArm64RegisterTpidrEl1;1592 aenmNames[iReg++] = My_WHvArm64RegisterActlrEl1;1593 }1594 1595 if (fWhat & CPUMCTX_EXTRN_SYSREG_DEBUG)1596 {1597 /* Hyper-V doesn't allow syncing debug break-/watchpoint registers which aren't there. */1598 for (uint32_t i = 0; i < pVM->nem.s.cBreakpoints; i++)1599 {1600 aenmNames[iReg++] = (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgbcr0El1 + i);1601 aenmNames[iReg++] = (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgbvr0El1 + i);1602 }1603 1604 for (uint32_t i = 0; i < pVM->nem.s.cWatchpoints; i++)1605 {1606 aenmNames[iReg++] = (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgwcr0El1 + i);1607 aenmNames[iReg++] = (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgwvr0El1 + i);1608 }1609 1610 aenmNames[iReg++] = WHvArm64RegisterMdscrEl1;1611 }1612 1613 if (fWhat & CPUMCTX_EXTRN_SYSREG_PAUTH_KEYS)1614 {1615 aenmNames[iReg++] = WHvArm64RegisterApdAKeyHiEl1;1616 aenmNames[iReg++] = WHvArm64RegisterApdAKeyLoEl1;1617 aenmNames[iReg++] = WHvArm64RegisterApdBKeyHiEl1;1618 aenmNames[iReg++] = WHvArm64RegisterApdBKeyLoEl1;1619 aenmNames[iReg++] = WHvArm64RegisterApgAKeyHiEl1;1620 aenmNames[iReg++] = WHvArm64RegisterApgAKeyLoEl1;1621 aenmNames[iReg++] = WHvArm64RegisterApiAKeyHiEl1;1622 aenmNames[iReg++] = WHvArm64RegisterApiAKeyLoEl1;1623 aenmNames[iReg++] = WHvArm64RegisterApiBKeyHiEl1;1624 aenmNames[iReg++] = WHvArm64RegisterApiBKeyLoEl1;1625 }1626 1565 1627 1566 size_t const cRegs = iReg; … … 1644 1583 #define GET_REG64(a_DstVar, a_enmName) do { \ 1645 1584 Assert(aenmNames[iReg] == (a_enmName)); \ 1646 (a_DstVar) .x = aValues[iReg].Reg64; \1585 (a_DstVar)->x = aValues[iReg].Reg64; \ 1647 1586 iReg++; \ 1648 1587 } while (0) 1649 1588 #define GET_REG64_RAW(a_DstVar, a_enmName) do { \ 1650 1589 Assert(aenmNames[iReg] == (a_enmName)); \ 1651 (a_DstVar) = aValues[iReg].Reg64; \1590 *(a_DstVar) = aValues[iReg].Reg64; \ 1652 1591 iReg++; \ 1653 1592 } while (0) 1654 1593 #define GET_SYSREG64(a_DstVar, a_enmName) do { \ 1655 1594 Assert(aenmNames[iReg] == (a_enmName)); \ 1656 (a_DstVar) .u64 = aValues[iReg].Reg64; \1595 (a_DstVar)->u64 = aValues[iReg].Reg64; \ 1657 1596 iReg++; \ 1658 1597 } while (0) 1659 1598 #define GET_REG128(a_DstVar, a_enmName) do { \ 1660 1599 Assert(aenmNames[iReg] == a_enmName); \ 1661 (a_DstVar) .au64[0] = aValues[iReg].Reg128.Low64; \1662 (a_DstVar) .au64[1] = aValues[iReg].Reg128.High64; \1600 (a_DstVar)->au64[0] = aValues[iReg].Reg128.Low64; \ 1601 (a_DstVar)->au64[1] = aValues[iReg].Reg128.High64; \ 1663 1602 iReg++; \ 1664 1603 } while (0) 1665 1604 1666 /* GPRs */ 1667 if (fWhat & CPUMCTX_EXTRN_GPRS_MASK) 1668 { 1669 if (fWhat & CPUMCTX_EXTRN_X0) 1670 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[0], WHvArm64RegisterX0); 1671 if (fWhat & CPUMCTX_EXTRN_X1) 1672 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[1], WHvArm64RegisterX1); 1673 if (fWhat & CPUMCTX_EXTRN_X2) 1674 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[2], WHvArm64RegisterX2); 1675 if (fWhat & CPUMCTX_EXTRN_X3) 1676 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[3], WHvArm64RegisterX3); 1677 if (fWhat & CPUMCTX_EXTRN_X4_X28) 1678 { 1679 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[4], WHvArm64RegisterX4); 1680 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[5], WHvArm64RegisterX5); 1681 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[6], WHvArm64RegisterX6); 1682 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[7], WHvArm64RegisterX7); 1683 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[8], WHvArm64RegisterX8); 1684 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[9], WHvArm64RegisterX9); 1685 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[10], WHvArm64RegisterX10); 1686 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[11], WHvArm64RegisterX11); 1687 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[12], WHvArm64RegisterX12); 1688 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[13], WHvArm64RegisterX13); 1689 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[14], WHvArm64RegisterX14); 1690 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[15], WHvArm64RegisterX15); 1691 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[16], WHvArm64RegisterX16); 1692 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[17], WHvArm64RegisterX17); 1693 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[18], WHvArm64RegisterX18); 1694 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[19], WHvArm64RegisterX19); 1695 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[20], WHvArm64RegisterX20); 1696 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[21], WHvArm64RegisterX21); 1697 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[22], WHvArm64RegisterX22); 1698 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[23], WHvArm64RegisterX23); 1699 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[24], WHvArm64RegisterX24); 1700 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[25], WHvArm64RegisterX25); 1701 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[26], WHvArm64RegisterX26); 1702 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[27], WHvArm64RegisterX27); 1703 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[28], WHvArm64RegisterX28); 1704 } 1705 if (fWhat & CPUMCTX_EXTRN_LR) 1706 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[30], WHvArm64RegisterLr); 1707 if (fWhat & CPUMCTX_EXTRN_FP) 1708 GET_REG64(pVCpu->cpum.GstCtx.aGRegs[29], WHvArm64RegisterFp); 1709 } 1710 1711 /* RIP & Flags */ 1712 if (fWhat & CPUMCTX_EXTRN_PC) 1713 GET_REG64_RAW(pVCpu->cpum.GstCtx.Pc.u64, WHvArm64RegisterPc); 1605 if ( (pVCpu->cpum.GstCtx.fExtrn & (CPUMCTX_EXTRN_GPRS_MASK | CPUMCTX_EXTRN_PC | CPUMCTX_EXTRN_FPCR | CPUMCTX_EXTRN_FPSR)) 1606 != (CPUMCTX_EXTRN_GPRS_MASK | CPUMCTX_EXTRN_PC | CPUMCTX_EXTRN_FPCR | CPUMCTX_EXTRN_FPSR)) 1607 { 1608 for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumRegs); i++) 1609 { 1610 if (!(s_aCpumRegs[i].fCpumExtrn & pVCpu->cpum.GstCtx.fExtrn)) 1611 { 1612 CPUMCTXGREG *pReg = (CPUMCTXGREG *)((uint8_t *)&pVCpu->cpum.GstCtx + s_aCpumRegs[i].offCpumCtx); 1613 GET_REG64(pReg, s_aCpumRegs[i].enmWHvReg); 1614 } 1615 } 1616 } 1617 1618 if (fWhat & CPUMCTX_EXTRN_V0_V31) 1619 { 1620 /* SIMD/FP registers. */ 1621 for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumFpRegs); i++) 1622 { 1623 PCPUMCTXVREG pVReg = (PCPUMCTXVREG)((uint8_t *)&pVCpu->cpum.GstCtx + s_aCpumFpRegs[i].offCpumCtx); 1624 GET_REG128(pVReg, s_aCpumFpRegs[i].enmWHvReg); 1625 } 1626 } 1627 1628 if (fWhat & CPUMCTX_EXTRN_SYSREG_DEBUG) 1629 { 1630 for (uint32_t i = 0; i < pVM->nem.s.cBreakpoints; i++) 1631 { 1632 GET_SYSREG64(&pVCpu->cpum.GstCtx.aBp[i].Ctrl, (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgbcr0El1 + i)); 1633 GET_SYSREG64(&pVCpu->cpum.GstCtx.aBp[i].Value, (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgbvr0El1 + i)); 1634 } 1635 1636 for (uint32_t i = 0; i < pVM->nem.s.cWatchpoints; i++) 1637 { 1638 GET_SYSREG64(&pVCpu->cpum.GstCtx.aWp[i].Ctrl, (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgwcr0El1 + i)); 1639 GET_SYSREG64(&pVCpu->cpum.GstCtx.aWp[i].Value, (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgwvr0El1 + i)); 1640 } 1641 1642 GET_SYSREG64(&pVCpu->cpum.GstCtx.Mdscr, WHvArm64RegisterMdscrEl1); 1643 } 1644 1645 if (fWhat & CPUMCTX_EXTRN_SYSREG_PAUTH_KEYS) 1646 { 1647 /* PAuth registers. */ 1648 for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumPAuthKeyRegs); i++) 1649 { 1650 CPUMCTXSYSREG *pReg = (CPUMCTXSYSREG *)((uint8_t *)&pVCpu->cpum.GstCtx + s_aCpumPAuthKeyRegs[i].offCpumCtx); 1651 GET_SYSREG64(pReg, s_aCpumPAuthKeyRegs[i].enmWHvReg); 1652 } 1653 } 1654 1655 if ( (pVCpu->cpum.GstCtx.fExtrn & (CPUMCTX_EXTRN_SPSR | CPUMCTX_EXTRN_ELR | CPUMCTX_EXTRN_SP | CPUMCTX_EXTRN_SCTLR_TCR_TTBR | CPUMCTX_EXTRN_SYSREG_MISC)) 1656 != (CPUMCTX_EXTRN_SPSR | CPUMCTX_EXTRN_ELR | CPUMCTX_EXTRN_SP | CPUMCTX_EXTRN_SCTLR_TCR_TTBR | CPUMCTX_EXTRN_SYSREG_MISC)) 1657 { 1658 /* System registers. */ 1659 for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumSysRegs); i++) 1660 { 1661 if (!(s_aCpumSysRegs[i].fCpumExtrn & pVCpu->cpum.GstCtx.fExtrn)) 1662 { 1663 CPUMCTXSYSREG *pReg = (CPUMCTXSYSREG *)((uint8_t *)&pVCpu->cpum.GstCtx + s_aCpumSysRegs[i].offCpumCtx); 1664 GET_SYSREG64(pReg, s_aCpumSysRegs[i].enmWHvReg); 1665 } 1666 } 1667 } 1668 1714 1669 if (fWhat & CPUMCTX_EXTRN_PSTATE) 1715 GET_REG64_RAW(pVCpu->cpum.GstCtx.fPState, WHvArm64RegisterPstate); 1716 if (fWhat & CPUMCTX_EXTRN_SPSR) 1717 GET_SYSREG64(pVCpu->cpum.GstCtx.Spsr, WHvArm64RegisterSpsrEl1); 1718 if (fWhat & CPUMCTX_EXTRN_ELR) 1719 GET_SYSREG64(pVCpu->cpum.GstCtx.Elr, WHvArm64RegisterElrEl1); 1720 if (fWhat & CPUMCTX_EXTRN_SP) 1721 { 1722 GET_SYSREG64(pVCpu->cpum.GstCtx.aSpReg[0], WHvArm64RegisterSpEl0); 1723 GET_SYSREG64(pVCpu->cpum.GstCtx.aSpReg[1], WHvArm64RegisterSpEl1); 1724 } 1725 if (fWhat & CPUMCTX_EXTRN_SCTLR_TCR_TTBR) 1726 { 1727 GET_SYSREG64(pVCpu->cpum.GstCtx.Sctlr, WHvArm64RegisterSctlrEl1); 1728 GET_SYSREG64(pVCpu->cpum.GstCtx.Tcr, WHvArm64RegisterTcrEl1); 1729 GET_SYSREG64(pVCpu->cpum.GstCtx.Ttbr0, WHvArm64RegisterTtbr0El1); 1730 GET_SYSREG64(pVCpu->cpum.GstCtx.Ttbr1, WHvArm64RegisterTtbr1El1); 1731 } 1732 1733 /* Vector state. */ 1734 if (fWhat & CPUMCTX_EXTRN_V0_V31) 1735 { 1736 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[0], WHvArm64RegisterQ0); 1737 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[1], WHvArm64RegisterQ1); 1738 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[2], WHvArm64RegisterQ2); 1739 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[3], WHvArm64RegisterQ3); 1740 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[4], WHvArm64RegisterQ4); 1741 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[5], WHvArm64RegisterQ5); 1742 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[6], WHvArm64RegisterQ6); 1743 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[7], WHvArm64RegisterQ7); 1744 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[8], WHvArm64RegisterQ8); 1745 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[9], WHvArm64RegisterQ9); 1746 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[10], WHvArm64RegisterQ10); 1747 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[11], WHvArm64RegisterQ11); 1748 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[12], WHvArm64RegisterQ12); 1749 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[13], WHvArm64RegisterQ13); 1750 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[14], WHvArm64RegisterQ14); 1751 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[15], WHvArm64RegisterQ15); 1752 1753 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[16], WHvArm64RegisterQ16); 1754 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[17], WHvArm64RegisterQ17); 1755 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[18], WHvArm64RegisterQ18); 1756 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[19], WHvArm64RegisterQ19); 1757 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[20], WHvArm64RegisterQ20); 1758 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[21], WHvArm64RegisterQ21); 1759 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[22], WHvArm64RegisterQ22); 1760 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[23], WHvArm64RegisterQ23); 1761 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[24], WHvArm64RegisterQ24); 1762 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[25], WHvArm64RegisterQ25); 1763 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[26], WHvArm64RegisterQ26); 1764 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[27], WHvArm64RegisterQ27); 1765 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[28], WHvArm64RegisterQ28); 1766 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[29], WHvArm64RegisterQ29); 1767 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[30], WHvArm64RegisterQ30); 1768 GET_REG128(pVCpu->cpum.GstCtx.aVRegs[31], WHvArm64RegisterQ31); 1769 } 1770 if (fWhat & CPUMCTX_EXTRN_FPCR) 1771 GET_REG64_RAW(pVCpu->cpum.GstCtx.fpcr, WHvArm64RegisterFpcr); 1772 if (fWhat & CPUMCTX_EXTRN_FPSR) 1773 GET_REG64_RAW(pVCpu->cpum.GstCtx.fpsr, WHvArm64RegisterFpsr); 1774 1775 /* System registers. */ 1776 if (fWhat & CPUMCTX_EXTRN_SYSREG_MISC) 1777 { 1778 GET_SYSREG64(pVCpu->cpum.GstCtx.VBar, WHvArm64RegisterVbarEl1); 1779 GET_SYSREG64(pVCpu->cpum.GstCtx.Esr, WHvArm64RegisterEsrEl1); 1780 GET_SYSREG64(pVCpu->cpum.GstCtx.Far, WHvArm64RegisterFarEl1); 1781 GET_SYSREG64(pVCpu->cpum.GstCtx.CntKCtl, WHvArm64RegisterCntkctlEl1); 1782 GET_SYSREG64(pVCpu->cpum.GstCtx.ContextIdr, WHvArm64RegisterContextidrEl1); 1783 GET_SYSREG64(pVCpu->cpum.GstCtx.Cpacr, WHvArm64RegisterCpacrEl1); 1784 GET_SYSREG64(pVCpu->cpum.GstCtx.Csselr, WHvArm64RegisterCsselrEl1); 1785 GET_SYSREG64(pVCpu->cpum.GstCtx.Mair, WHvArm64RegisterMairEl1); 1786 GET_SYSREG64(pVCpu->cpum.GstCtx.Par, WHvArm64RegisterParEl1); 1787 GET_SYSREG64(pVCpu->cpum.GstCtx.TpIdrRoEl0, WHvArm64RegisterTpidrroEl0); 1788 GET_SYSREG64(pVCpu->cpum.GstCtx.aTpIdr[0], WHvArm64RegisterTpidrEl0); 1789 GET_SYSREG64(pVCpu->cpum.GstCtx.aTpIdr[1], WHvArm64RegisterTpidrEl1); 1790 GET_SYSREG64(pVCpu->cpum.GstCtx.Actlr, My_WHvArm64RegisterActlrEl1); 1791 } 1792 1793 if (fWhat & CPUMCTX_EXTRN_SYSREG_DEBUG) 1794 { 1795 for (uint32_t i = 0; i < pVM->nem.s.cBreakpoints; i++) 1796 { 1797 GET_SYSREG64(pVCpu->cpum.GstCtx.aBp[i].Ctrl, (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgbcr0El1 + i)); 1798 GET_SYSREG64(pVCpu->cpum.GstCtx.aBp[i].Value, (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgbvr0El1 + i)); 1799 } 1800 1801 for (uint32_t i = 0; i < pVM->nem.s.cWatchpoints; i++) 1802 { 1803 GET_SYSREG64(pVCpu->cpum.GstCtx.aWp[i].Ctrl, (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgwcr0El1 + i)); 1804 GET_SYSREG64(pVCpu->cpum.GstCtx.aWp[i].Value, (WHV_REGISTER_NAME)((uint32_t)WHvArm64RegisterDbgwvr0El1 + i)); 1805 } 1806 1807 GET_SYSREG64(pVCpu->cpum.GstCtx.Mdscr, WHvArm64RegisterMdscrEl1); 1808 } 1809 1810 if (fWhat & CPUMCTX_EXTRN_SYSREG_PAUTH_KEYS) 1811 { 1812 GET_SYSREG64(pVCpu->cpum.GstCtx.Apda.High, WHvArm64RegisterApdAKeyHiEl1); 1813 GET_SYSREG64(pVCpu->cpum.GstCtx.Apda.Low, WHvArm64RegisterApdAKeyLoEl1); 1814 GET_SYSREG64(pVCpu->cpum.GstCtx.Apdb.High, WHvArm64RegisterApdBKeyHiEl1); 1815 GET_SYSREG64(pVCpu->cpum.GstCtx.Apdb.Low, WHvArm64RegisterApdBKeyLoEl1); 1816 GET_SYSREG64(pVCpu->cpum.GstCtx.Apga.High, WHvArm64RegisterApgAKeyHiEl1); 1817 GET_SYSREG64(pVCpu->cpum.GstCtx.Apga.Low, WHvArm64RegisterApgAKeyLoEl1); 1818 GET_SYSREG64(pVCpu->cpum.GstCtx.Apia.High, WHvArm64RegisterApiAKeyHiEl1); 1819 GET_SYSREG64(pVCpu->cpum.GstCtx.Apia.Low, WHvArm64RegisterApiAKeyLoEl1); 1820 GET_SYSREG64(pVCpu->cpum.GstCtx.Apib.High, WHvArm64RegisterApiBKeyHiEl1); 1821 GET_SYSREG64(pVCpu->cpum.GstCtx.Apib.Low, WHvArm64RegisterApiBKeyLoEl1); 1822 } 1670 GET_REG64_RAW(&pVCpu->cpum.GstCtx.fPState, WHvArm64RegisterPstate); 1823 1671 1824 1672 /* Almost done, just update extrn flags. */
Note:
See TracChangeset
for help on using the changeset viewer.