Changeset 91271 in vbox
- Timestamp:
- Sep 16, 2021 7:42:37 AM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 146930
- Location:
- trunk
- Files:
-
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/cpum.h
r91266 r91271 1539 1539 VMM_INT_DECL(uint64_t) CPUMGetGuestSpecCtrl(PVMCPUCC pVCpu); 1540 1540 VMM_INT_DECL(uint64_t) CPUMGetGuestCR4ValidMask(PVM pVM); 1541 VMM_INT_DECL(void) CPUMSetGuestPaePdpes(PVMCPU pVCpu, PCX86PDPE paPaePdpes); 1541 1542 /** @} */ 1542 1543 -
trunk/include/VBox/vmm/cpum.mac
r87522 r91271 257 257 alignb 8 258 258 .fExtrn resq 1 259 .aPaePdpes resq 4 259 260 alignb 8 260 261 .hwvirt.svm.uMsrHSavePa resq 1 -
trunk/include/VBox/vmm/cpumctx.h
r87522 r91271 479 479 uint64_t fExtrn; 480 480 481 /** 0x2e0 - Hardware virtualization state. */ 481 /** 0x2e0 - PAE PDPTEs. */ 482 X86PDPE aPaePdpes[4]; 483 484 /** 0x300 - Hardware virtualization state. */ 482 485 struct 483 486 { … … 486 489 struct 487 490 { 488 /** 0x 2e0 - MSR holding physical address of the Guest's Host-state. */491 /** 0x300 - MSR holding physical address of the Guest's Host-state. */ 489 492 uint64_t uMsrHSavePa; 490 /** 0x 2e8 - Guest physical address of the nested-guest VMCB. */493 /** 0x308 - Guest physical address of the nested-guest VMCB. */ 491 494 RTGCPHYS GCPhysVmcb; 492 /** 0x 2f0 - Cache of the nested-guest VMCB - R0 ptr. */495 /** 0x310 - Cache of the nested-guest VMCB - R0 ptr. */ 493 496 R0PTRTYPE(PSVMVMCB) pVmcbR0; 494 /** 0x 2f8 - Cache of the nested-guest VMCB - R3 ptr. */497 /** 0x318 - Cache of the nested-guest VMCB - R3 ptr. */ 495 498 R3PTRTYPE(PSVMVMCB) pVmcbR3; 496 /** 0x3 00 - Guest's host-state save area. */499 /** 0x320 - Guest's host-state save area. */ 497 500 SVMHOSTSTATE HostState; 498 /** 0x3 b8 - Guest TSC time-stamp of when the previous PAUSE instr. was executed. */501 /** 0x3d8 - Guest TSC time-stamp of when the previous PAUSE instr. was executed. */ 499 502 uint64_t uPrevPauseTick; 500 /** 0x3 c0 - Pause filter count. */503 /** 0x3e0 - Pause filter count. */ 501 504 uint16_t cPauseFilter; 502 /** 0x3 c2 - Pause filter threshold. */505 /** 0x3e2 - Pause filter threshold. */ 503 506 uint16_t cPauseFilterThreshold; 504 /** 0x3 c4 - Whether the injected event is subject to event intercepts. */507 /** 0x3e4 - Whether the injected event is subject to event intercepts. */ 505 508 bool fInterceptEvents; 506 /** 0x3 c5 - Padding. */509 /** 0x3e5 - Padding. */ 507 510 bool afPadding[3]; 508 /** 0x3 c8 - MSR permission bitmap - R0 ptr. */511 /** 0x3e8 - MSR permission bitmap - R0 ptr. */ 509 512 R0PTRTYPE(void *) pvMsrBitmapR0; 510 /** 0x3 d0 - MSR permission bitmap - R3 ptr. */513 /** 0x3f0 - MSR permission bitmap - R3 ptr. */ 511 514 R3PTRTYPE(void *) pvMsrBitmapR3; 512 /** 0x3 d8 - IO permission bitmap - R0 ptr. */515 /** 0x3f8 - IO permission bitmap - R0 ptr. */ 513 516 R0PTRTYPE(void *) pvIoBitmapR0; 514 /** 0x 3e0 - IO permission bitmap - R3 ptr. */517 /** 0x400 - IO permission bitmap - R3 ptr. */ 515 518 R3PTRTYPE(void *) pvIoBitmapR3; 516 /** 0x 3e8 - Host physical address of the nested-guest VMCB. */519 /** 0x408 - Host physical address of the nested-guest VMCB. */ 517 520 RTHCPHYS HCPhysVmcb; 518 /** 0x 3f0 - Padding. */521 /** 0x410 - Padding. */ 519 522 uint8_t abPadding0[272]; 520 523 } svm; … … 522 525 struct 523 526 { 524 /** 0x 2e4- Guest physical address of the VMXON region. */527 /** 0x300 - Guest physical address of the VMXON region. */ 525 528 RTGCPHYS GCPhysVmxon; 526 /** 0x 2e8 - Guest physical address of the current VMCS pointer. */529 /** 0x308 - Guest physical address of the current VMCS pointer. */ 527 530 RTGCPHYS GCPhysVmcs; 528 /** 0x 2f0 - Guest physical address of the shadow VMCS pointer. */531 /** 0x310 - Guest physical address of the shadow VMCS pointer. */ 529 532 RTGCPHYS GCPhysShadowVmcs; 530 /** 0x 2f8 - Last emulated VMX instruction/VM-exit diagnostic. */533 /** 0x318 - Last emulated VMX instruction/VM-exit diagnostic. */ 531 534 VMXVDIAG enmDiag; 532 /** 0x 2fc - VMX abort reason. */535 /** 0x31c - VMX abort reason. */ 533 536 VMXABORT enmAbort; 534 /** 0x3 00 - Last emulated VMX instruction/VM-exit diagnostic auxiliary info. (mainly537 /** 0x320 - Last emulated VMX instruction/VM-exit diagnostic auxiliary info. (mainly 535 538 * used for info. that's not part of the VMCS). */ 536 539 uint64_t uDiagAux; 537 /** 0x3 08 - VMX abort auxiliary info. */540 /** 0x328 - VMX abort auxiliary info. */ 538 541 uint32_t uAbortAux; 539 /** 0x3 0c - Whether the guest is in VMX root mode. */542 /** 0x32c - Whether the guest is in VMX root mode. */ 540 543 bool fInVmxRootMode; 541 /** 0x3 0d - Whether the guest is in VMX non-root mode. */544 /** 0x32d - Whether the guest is in VMX non-root mode. */ 542 545 bool fInVmxNonRootMode; 543 /** 0x3 0e - Whether the injected events are subjected to event intercepts. */546 /** 0x32e - Whether the injected events are subjected to event intercepts. */ 544 547 bool fInterceptEvents; 545 /** 0x3 0f - Whether blocking of NMI (or virtual-NMIs) was in effect in VMX non-root548 /** 0x32f - Whether blocking of NMI (or virtual-NMIs) was in effect in VMX non-root 546 549 * mode before execution of IRET. */ 547 550 bool fNmiUnblockingIret; 548 /** 0x3 10 - The current VMCS - R0 ptr. */551 /** 0x330 - The current VMCS - R0 ptr. */ 549 552 R0PTRTYPE(PVMXVVMCS) pVmcsR0; 550 /** 0x3 18 - The curent VMCS - R3 ptr. */553 /** 0x338 - The curent VMCS - R3 ptr. */ 551 554 R3PTRTYPE(PVMXVVMCS) pVmcsR3; 552 /** 0X3 20 - The shadow VMCS - R0 ptr. */555 /** 0X340 - The shadow VMCS - R0 ptr. */ 553 556 R0PTRTYPE(PVMXVVMCS) pShadowVmcsR0; 554 /** 0x3 28 - The shadow VMCS - R3 ptr. */557 /** 0x348 - The shadow VMCS - R3 ptr. */ 555 558 R3PTRTYPE(PVMXVVMCS) pShadowVmcsR3; 556 /** 0x3 30 - The virtual-APIC page - R0 ptr. */559 /** 0x350 - The virtual-APIC page - R0 ptr. */ 557 560 R0PTRTYPE(void *) pvVirtApicPageR0; 558 /** 0x3 38 - The virtual-APIC page - R3 ptr. */561 /** 0x358 - The virtual-APIC page - R3 ptr. */ 559 562 R3PTRTYPE(void *) pvVirtApicPageR3; 560 /** 0x3 40 - The VMREAD bitmap - R0 ptr. */563 /** 0x360 - The VMREAD bitmap - R0 ptr. */ 561 564 R0PTRTYPE(void *) pvVmreadBitmapR0; 562 /** 0x3 48 - The VMREAD bitmap - R3 ptr. */565 /** 0x368 - The VMREAD bitmap - R3 ptr. */ 563 566 R3PTRTYPE(void *) pvVmreadBitmapR3; 564 /** 0x3 50 - The VMWRITE bitmap - R0 ptr. */567 /** 0x370 - The VMWRITE bitmap - R0 ptr. */ 565 568 R0PTRTYPE(void *) pvVmwriteBitmapR0; 566 /** 0x3 58 - The VMWRITE bitmap - R3 ptr. */569 /** 0x378 - The VMWRITE bitmap - R3 ptr. */ 567 570 R3PTRTYPE(void *) pvVmwriteBitmapR3; 568 /** 0x3 60 - The VM-entry MSR-load area - R0 ptr. */571 /** 0x380 - The VM-entry MSR-load area - R0 ptr. */ 569 572 R0PTRTYPE(PVMXAUTOMSR) pEntryMsrLoadAreaR0; 570 /** 0x3 68 - The VM-entry MSR-load area - R3 ptr. */573 /** 0x388 - The VM-entry MSR-load area - R3 ptr. */ 571 574 R3PTRTYPE(PVMXAUTOMSR) pEntryMsrLoadAreaR3; 572 /** 0x3 70 - The VM-exit MSR-store area - R0 ptr. */575 /** 0x390 - The VM-exit MSR-store area - R0 ptr. */ 573 576 R0PTRTYPE(PVMXAUTOMSR) pExitMsrStoreAreaR0; 574 /** 0x3 78 - The VM-exit MSR-store area - R3 ptr. */577 /** 0x398 - The VM-exit MSR-store area - R3 ptr. */ 575 578 R3PTRTYPE(PVMXAUTOMSR) pExitMsrStoreAreaR3; 576 /** 0x3 80 - The VM-exit MSR-load area - R0 ptr. */579 /** 0x3a0 - The VM-exit MSR-load area - R0 ptr. */ 577 580 R0PTRTYPE(PVMXAUTOMSR) pExitMsrLoadAreaR0; 578 /** 0x3 88 - The VM-exit MSR-load area - R3 ptr. */581 /** 0x3a8 - The VM-exit MSR-load area - R3 ptr. */ 579 582 R3PTRTYPE(PVMXAUTOMSR) pExitMsrLoadAreaR3; 580 /** 0x3 90 - MSR bitmap - R0 ptr. */583 /** 0x3b0 - MSR bitmap - R0 ptr. */ 581 584 R0PTRTYPE(void *) pvMsrBitmapR0; 582 /** 0x3 98 - The MSR bitmap - R3 ptr. */585 /** 0x3b8 - The MSR bitmap - R3 ptr. */ 583 586 R3PTRTYPE(void *) pvMsrBitmapR3; 584 /** 0x3 a0 - The I/O bitmap - R0 ptr. */587 /** 0x3c0 - The I/O bitmap - R0 ptr. */ 585 588 R0PTRTYPE(void *) pvIoBitmapR0; 586 /** 0x3 a8 - The I/O bitmap - R3 ptr. */589 /** 0x3c8 - The I/O bitmap - R3 ptr. */ 587 590 R3PTRTYPE(void *) pvIoBitmapR3; 588 /** 0x3 b0 - Guest TSC timestamp of the first PAUSE instruction that is considered to591 /** 0x3d0 - Guest TSC timestamp of the first PAUSE instruction that is considered to 589 592 * be the first in a loop. */ 590 593 uint64_t uFirstPauseLoopTick; 591 /** 0x3 b8 - Guest TSC timestamp of the previous PAUSE instruction. */594 /** 0x3d8 - Guest TSC timestamp of the previous PAUSE instruction. */ 592 595 uint64_t uPrevPauseTick; 593 /** 0x3 c0 - Guest TSC timestamp of VM-entry (used for VMX-preemption timer). */596 /** 0x3e0 - Guest TSC timestamp of VM-entry (used for VMX-preemption timer). */ 594 597 uint64_t uEntryTick; 595 /** 0x3 c8 - Virtual-APIC write offset (until trap-like VM-exit). */598 /** 0x3e8 - Virtual-APIC write offset (until trap-like VM-exit). */ 596 599 uint16_t offVirtApicWrite; 597 /** 0x3 ca - Whether virtual-NMI blocking is in effect. */600 /** 0x3ea - Whether virtual-NMI blocking is in effect. */ 598 601 bool fVirtNmiBlocking; 599 /** 0x3 cc- Padding. */602 /** 0x3eb - Padding. */ 600 603 uint8_t abPadding0[5]; 601 /** 0x3 d0 - Guest VMX MSRs. */604 /** 0x3f0 - Guest VMX MSRs. */ 602 605 VMXMSRS Msrs; 603 /** 0x4 b0 - Host physical address of the VMCS. */606 /** 0x4d0 - Host physical address of the VMCS. */ 604 607 RTHCPHYS HCPhysVmcs; 605 /** 0x4 b8 - Host physical address of the shadow VMCS. */608 /** 0x4d8 - Host physical address of the shadow VMCS. */ 606 609 RTHCPHYS HCPhysShadowVmcs; 607 /** 0x4 c0 - Host physical address of the virtual-APIC page. */610 /** 0x4e0 - Host physical address of the virtual-APIC page. */ 608 611 RTHCPHYS HCPhysVirtApicPage; 609 /** 0x4 c8 - Host physical address of the VMREAD bitmap. */612 /** 0x4e8 - Host physical address of the VMREAD bitmap. */ 610 613 RTHCPHYS HCPhysVmreadBitmap; 611 /** 0x4 d0 - Host physical address of the VMWRITE bitmap. */614 /** 0x4f0 - Host physical address of the VMWRITE bitmap. */ 612 615 RTHCPHYS HCPhysVmwriteBitmap; 613 /** 0x4 d8 - Host physical address of the VM-entry MSR-load area. */616 /** 0x4f8 - Host physical address of the VM-entry MSR-load area. */ 614 617 RTHCPHYS HCPhysEntryMsrLoadArea; 615 /** 0x 4e0 - Host physical address of the VM-exit MSR-store area. */618 /** 0x500 - Host physical address of the VM-exit MSR-store area. */ 616 619 RTHCPHYS HCPhysExitMsrStoreArea; 617 /** 0x 4e8 - Host physical address of the VM-exit MSR-load area. */620 /** 0x508 - Host physical address of the VM-exit MSR-load area. */ 618 621 RTHCPHYS HCPhysExitMsrLoadArea; 619 /** 0x 4f0 - Host physical address of the MSR bitmap. */622 /** 0x510 - Host physical address of the MSR bitmap. */ 620 623 RTHCPHYS HCPhysMsrBitmap; 621 /** 0x 4f8 - Host physical address of the I/O bitmap. */624 /** 0x518 - Host physical address of the I/O bitmap. */ 622 625 RTHCPHYS HCPhysIoBitmap; 623 626 } vmx; 624 627 } CPUM_UNION_NM(s); 625 628 626 /** 0x5 00 - Hardware virtualization type currently in use. */629 /** 0x520 - Hardware virtualization type currently in use. */ 627 630 CPUMHWVIRT enmHwvirt; 628 /** 0x5 04 - Global interrupt flag - AMD only (always true on Intel). */631 /** 0x524 - Global interrupt flag - AMD only (always true on Intel). */ 629 632 bool fGif; 630 633 bool afPadding1[3]; 631 /** 0x5 08 - A subset of guest force flags that are saved while running the634 /** 0x528 - A subset of guest force flags that are saved while running the 632 635 * nested-guest. */ 633 636 #ifdef VMCPU_WITH_64_BIT_FFS … … 637 640 uint32_t fPadding; 638 641 #endif 639 /** 0x5 10 - Pad to 64 byte boundary. */640 uint8_t abPadding0[ 48];642 /** 0x530 - Pad to 64 byte boundary. */ 643 uint8_t abPadding0[16]; 641 644 } hwvirt; 642 645 } CPUMCTX; … … 691 694 AssertCompileMemberOffset(CPUMCTX, pXStateR3, 584); 692 695 AssertCompileMemberOffset(CPUMCTX, aoffXState, 592); 693 AssertCompileMemberOffset(CPUMCTX, hwvirt, 0x2e0); 694 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.uMsrHSavePa, 0x2e0); 695 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pVmcbR0, 0x2f0); 696 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pVmcbR3, 0x2f8); 697 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.HostState, 0x300); 698 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.cPauseFilter, 0x3c0); 699 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvMsrBitmapR0, 0x3c8); 700 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvIoBitmapR3, 0x3e0); 701 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.HCPhysVmcb, 0x3e8); 702 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pVmcbR0, 8); 703 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvMsrBitmapR0, 8); 704 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvIoBitmapR0, 8); 705 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.GCPhysVmxon, 0x2e0); 706 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.GCPhysVmcs, 0x2e8); 707 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.GCPhysShadowVmcs, 0x2f0); 708 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.enmDiag, 0x2f8); 709 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.enmAbort, 0x2fc); 710 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.uDiagAux, 0x300); 711 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.uAbortAux, 0x308); 712 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInVmxRootMode, 0x30c); 713 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInVmxNonRootMode, 0x30d); 714 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInterceptEvents, 0x30e); 715 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fNmiUnblockingIret, 0x30f); 716 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR0, 0x310); 717 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR3, 0x318); 718 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR0, 0x320); 719 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR3, 0x328); 720 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVirtApicPageR0, 0x330); 721 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVirtApicPageR3, 0x338); 722 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR0, 0x340); 723 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR3, 0x348); 724 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR0, 0x350); 725 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR3, 0x358); 726 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pEntryMsrLoadAreaR0, 0x360); 727 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pEntryMsrLoadAreaR3, 0x368); 728 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrStoreAreaR0, 0x370); 729 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrStoreAreaR3, 0x378); 730 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrLoadAreaR0, 0x380); 731 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrLoadAreaR3, 0x388); 732 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvMsrBitmapR0, 0x390); 733 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvMsrBitmapR3, 0x398); 734 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvIoBitmapR0, 0x3a0); 735 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvIoBitmapR3, 0x3a8); 736 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.uFirstPauseLoopTick, 0x3b0); 737 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.uPrevPauseTick, 0x3b8); 738 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.uEntryTick, 0x3c0); 739 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.offVirtApicWrite, 0x3c8); 740 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fVirtNmiBlocking, 0x3ca); 741 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.Msrs, 0x3d0); 742 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysVmcs, 0x4b0); 743 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysShadowVmcs, 0x4b8); 744 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysVirtApicPage, 0x4c0); 745 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysVmreadBitmap, 0x4c8); 746 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysVmwriteBitmap, 0x4d0); 747 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysEntryMsrLoadArea, 0x4d8); 748 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysExitMsrStoreArea, 0x4e0); 749 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysExitMsrLoadArea, 0x4e8); 750 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysMsrBitmap, 0x4f0); 751 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysIoBitmap, 0x4f8); 752 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR0, 8); 753 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR0, 8); 754 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR0, 8); 755 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR0, 8); 756 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pEntryMsrLoadAreaR0, 8); 757 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrStoreAreaR0, 8); 758 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrLoadAreaR0, 8); 759 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvMsrBitmapR0, 8); 760 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvIoBitmapR0, 8); 761 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.Msrs, 8); 762 AssertCompileMemberOffset(CPUMCTX, hwvirt.enmHwvirt, 0x500); 763 AssertCompileMemberOffset(CPUMCTX, hwvirt.fGif, 0x504); 764 AssertCompileMemberOffset(CPUMCTX, hwvirt.fLocalForcedActions, 0x508); 696 AssertCompileMemberOffset(CPUMCTX, aPaePdpes, 0x2e0); 697 AssertCompileMemberOffset(CPUMCTX, hwvirt, 0x300); 698 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.uMsrHSavePa, 0x300); 699 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.GCPhysVmcb, 0x308); 700 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pVmcbR0, 0x310); 701 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pVmcbR3, 0x318); 702 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.HostState, 0x320); 703 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.uPrevPauseTick, 0x3d8); 704 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.cPauseFilter, 0x3e0); 705 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvMsrBitmapR0, 0x3e8); 706 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvMsrBitmapR3, 0x3f0); 707 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvIoBitmapR0, 0x3f8); 708 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvIoBitmapR3, 0x400); 709 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.HCPhysVmcb, 0x408); 710 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.GCPhysVmxon, 0x300); 711 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.GCPhysVmcs, 0x308); 712 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.GCPhysShadowVmcs, 0x310); 713 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.enmDiag, 0x318); 714 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.enmAbort, 0x31c); 715 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.uDiagAux, 0x320); 716 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.uAbortAux, 0x328); 717 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInVmxRootMode, 0x32c); 718 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInVmxNonRootMode, 0x32d); 719 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInterceptEvents, 0x32e); 720 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fNmiUnblockingIret, 0x32f); 721 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR0, 0x330); 722 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR3, 0x338); 723 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR0, 0x340); 724 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR3, 0x348); 725 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVirtApicPageR0, 0x350); 726 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVirtApicPageR3, 0x358); 727 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR0, 0x360); 728 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR3, 0x368); 729 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR0, 0x370); 730 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR3, 0x378); 731 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pEntryMsrLoadAreaR0, 0x380); 732 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pEntryMsrLoadAreaR3, 0x388); 733 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrStoreAreaR0, 0x390); 734 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrStoreAreaR3, 0x398); 735 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrLoadAreaR0, 0x3a0); 736 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrLoadAreaR3, 0x3a8); 737 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvMsrBitmapR0, 0x3b0); 738 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvMsrBitmapR3, 0x3b8); 739 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvIoBitmapR0, 0x3c0); 740 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvIoBitmapR3, 0x3c8); 741 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.uFirstPauseLoopTick, 0x3d0); 742 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.uPrevPauseTick, 0x3d8); 743 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.uEntryTick, 0x3e0); 744 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.offVirtApicWrite, 0x3e8); 745 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fVirtNmiBlocking, 0x3ea); 746 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.Msrs, 0x3f0); 747 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysVmcs, 0x4d0); 748 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysShadowVmcs, 0x4d8); 749 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysVirtApicPage, 0x4e0); 750 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysVmreadBitmap, 0x4e8); 751 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysVmwriteBitmap, 0x4f0); 752 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysEntryMsrLoadArea, 0x4f8); 753 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysExitMsrStoreArea, 0x500); 754 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysExitMsrLoadArea, 0x508); 755 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysMsrBitmap, 0x510); 756 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.HCPhysIoBitmap, 0x518); 757 AssertCompileMemberOffset(CPUMCTX, hwvirt.enmHwvirt, 0x520); 758 AssertCompileMemberOffset(CPUMCTX, hwvirt.fGif, 0x524); 759 AssertCompileMemberOffset(CPUMCTX, hwvirt.fLocalForcedActions, 0x528); 765 760 AssertCompileMembersAtSameOffset(CPUMCTX, CPUM_UNION_STRUCT_NM(g,qw.) rax, CPUMCTX, CPUM_UNION_NM(g.) aGRegs); 766 761 AssertCompileMembersAtSameOffset(CPUMCTX, CPUM_UNION_STRUCT_NM(g,qw.) rax, CPUMCTX, CPUM_UNION_STRUCT_NM(g,qw2.) r0); … … 845 840 AssertCompileMembersAtSameOffset(CPUMCTX, CPUM_UNION_STRUCT_NM(s,n.) gs, CPUMCTX, CPUM_UNION_NM(s.) aSRegs[X86_SREG_GS]); 846 841 # endif 842 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pVmcbR0, 8); 843 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvMsrBitmapR0, 8); 844 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvIoBitmapR0, 8); 845 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR0, 8); 846 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR0, 8); 847 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR0, 8); 848 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR0, 8); 849 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pEntryMsrLoadAreaR0, 8); 850 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrStoreAreaR0, 8); 851 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pExitMsrLoadAreaR0, 8); 852 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvMsrBitmapR0, 8); 853 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvIoBitmapR0, 8); 854 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.Msrs, 8); 847 855 848 856 /** -
trunk/include/VBox/vmm/hm.h
r87519 r91271 113 113 VMM_INT_DECL(int) HMInvalidatePage(PVMCPUCC pVCpu, RTGCPTR GCVirt); 114 114 VMM_INT_DECL(bool) HMHasPendingIrq(PVMCC pVM); 115 VMM_INT_DECL(PX86PDPE) HMGetPaePdpes(PVMCPU pVCpu);116 115 VMM_INT_DECL(bool) HMSetSingleInstruction(PVMCC pVM, PVMCPUCC pVCpu, bool fEnable); 117 116 VMM_INT_DECL(bool) HMIsSvmActive(PVM pVM); -
trunk/include/VBox/vmm/pgm.h
r91246 r91271 297 297 || (enmMode) == PGMMODE_NESTED_PAE \ 298 298 || (enmMode) == PGMMODE_NESTED_AMD64) 299 300 /** Macro for checking if it's one of the PAE modes. 301 * @param enmMode PGMMODE_*. 302 */ 303 #define PGMMODE_IS_PAE(enmMode) ( (enmMode) == PGMMODE_PAE \ 304 || (enmMode) == PGMMODE_PAE_NX) 299 305 300 306 /** … … 348 354 VMMDECL(int) PGMGstSetPage(PVMCPUCC pVCpu, RTGCPTR GCPtr, size_t cb, uint64_t fFlags); 349 355 VMMDECL(int) PGMGstModifyPage(PVMCPUCC pVCpu, RTGCPTR GCPtr, size_t cb, uint64_t fFlags, uint64_t fMask); 350 VMM_INT_DECL(int) PGMGstGetPaePdpes(PVMCPUCC pVCpu, PX86PDPE paPdpes);351 VMM_INT_DECL(void) PGMGstUpdatePaePdpes(PVMCPUCC pVCpu, PCX86PDPE paPdpes);352 356 353 357 VMMDECL(int) PGMInvalidatePage(PVMCPUCC pVCpu, RTGCPTR GCPtrPage); -
trunk/include/VBox/vmm/vm.h
r91266 r91271 485 485 #define VMCPU_FF_HM_UPDATE_CR3 RT_BIT_64(VMCPU_FF_HM_UPDATE_CR3_BIT) 486 486 #define VMCPU_FF_HM_UPDATE_CR3_BIT 12 487 /** This action forces the VM to service any pending updates to PAE PDPEs (used 488 * only by HM) 489 * @todo r=bird: This description is very unhelpful. From the looks of things, 490 * when this flag is set the actual PDPE values live in HMCPU::aPdpes 491 * and PGM should fetch them from there before use. */ 492 #define VMCPU_FF_HM_UPDATE_PAE_PDPES RT_BIT_64(VMCPU_FF_HM_UPDATE_PAE_PDPES_BIT) 493 #define VMCPU_FF_HM_UPDATE_PAE_PDPES_BIT 13 487 /* Bit 13 used to be VMCPU_FF_HM_UPDATE_PAE_PDPES. */ 494 488 /** This action forces the VM to resync the page tables before going 495 489 * back to execute guest code. (GLOBAL FLUSH) */ … … 582 576 #define VM_FF_HIGH_PRIORITY_POST_MASK ( VM_FF_PGM_NO_MEMORY ) 583 577 /** High priority post-execution actions. */ 584 #define VMCPU_FF_HIGH_PRIORITY_POST_MASK ( VMCPU_FF_PDM_CRITSECT \ 585 | VMCPU_FF_HM_UPDATE_CR3 | VMCPU_FF_HM_UPDATE_PAE_PDPES \ 586 | VMCPU_FF_IEM | VMCPU_FF_IOM ) 578 #define VMCPU_FF_HIGH_PRIORITY_POST_MASK ( VMCPU_FF_PDM_CRITSECT | VMCPU_FF_HM_UPDATE_CR3 | VMCPU_FF_IEM | VMCPU_FF_IOM ) 587 579 588 580 /** Normal priority VM post-execution actions. */ -
trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
r91266 r91271 2331 2331 fMask |= X86_CR4_FSGSBASE; 2332 2332 return fMask; 2333 } 2334 2335 2336 /** 2337 * Sets the PAE PDPTEs for the guest. 2338 * 2339 * @param pVCpu The cross context virtual CPU structure of the calling thread. 2340 * @param pPaePdes The PAE PDPTEs to set. 2341 */ 2342 VMM_INT_DECL(void) CPUMSetGuestPaePdpes(PVMCPU pVCpu, PCX86PDPE paPaePdpes) 2343 { 2344 Assert(paPaePdpes); 2345 for (unsigned i = 0; i < RT_ELEMENTS(pVCpu->cpum.s.Guest.aPaePdpes); i++) 2346 pVCpu->cpum.s.Guest.aPaePdpes[i].u = paPaePdpes[i].u; 2347 pVCpu->cpum.s.Guest.fExtrn &= ~CPUMCTX_EXTRN_CR3; 2333 2348 } 2334 2349 -
trunk/src/VBox/VMM/VMMAll/HMAll.cpp
r91037 r91271 733 733 734 734 /** 735 * Return the PAE PDPE entries.736 *737 * @returns Pointer to the PAE PDPE array.738 * @param pVCpu The cross context virtual CPU structure.739 */740 VMM_INT_DECL(PX86PDPE) HMGetPaePdpes(PVMCPU pVCpu)741 {742 return &pVCpu->hm.s.aPdpes[0];743 }744 745 746 /**747 735 * Sets or clears the single instruction flag. 748 736 * -
trunk/src/VBox/VMM/VMMAll/PGMAll.cpp
r91250 r91271 2363 2363 2364 2364 /** 2365 * Gets the PAE PDPEs values cached by the CPU.2366 *2367 * @returns VBox status code.2368 * @param pVCpu The cross context virtual CPU structure.2369 * @param paPdpes Where to return the four PDPEs. The array2370 * pointed to must have 4 entries.2371 */2372 VMM_INT_DECL(int) PGMGstGetPaePdpes(PVMCPUCC pVCpu, PX86PDPE paPdpes)2373 {2374 Assert(pVCpu->pgm.s.enmShadowMode == PGMMODE_EPT);2375 2376 paPdpes[0] = pVCpu->pgm.s.aGstPaePdpeRegs[0];2377 paPdpes[1] = pVCpu->pgm.s.aGstPaePdpeRegs[1];2378 paPdpes[2] = pVCpu->pgm.s.aGstPaePdpeRegs[2];2379 paPdpes[3] = pVCpu->pgm.s.aGstPaePdpeRegs[3];2380 return VINF_SUCCESS;2381 }2382 2383 2384 /**2385 * Sets the PAE PDPEs values cached by the CPU.2386 *2387 * @remarks This must be called *AFTER* PGMUpdateCR3.2388 *2389 * @param pVCpu The cross context virtual CPU structure.2390 * @param paPdpes The four PDPE values. The array pointed to must2391 * have exactly 4 entries.2392 *2393 * @remarks No-long-jump zone!!!2394 */2395 VMM_INT_DECL(void) PGMGstUpdatePaePdpes(PVMCPUCC pVCpu, PCX86PDPE paPdpes)2396 {2397 Assert(pVCpu->pgm.s.enmShadowMode == PGMMODE_EPT);2398 2399 for (unsigned i = 0; i < RT_ELEMENTS(pVCpu->pgm.s.aGstPaePdpeRegs); i++)2400 {2401 if (pVCpu->pgm.s.aGstPaePdpeRegs[i].u != paPdpes[i].u)2402 {2403 pVCpu->pgm.s.aGstPaePdpeRegs[i] = paPdpes[i];2404 2405 /* Force lazy remapping if it changed in any way. */2406 pVCpu->pgm.s.apGstPaePDsR3[i] = 0;2407 pVCpu->pgm.s.apGstPaePDsR0[i] = 0;2408 pVCpu->pgm.s.aGCPhysGstPaePDs[i] = NIL_RTGCPHYS;2409 }2410 }2411 2412 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES);2413 }2414 2415 2416 /**2417 2365 * Gets the current CR3 register value for the shadow memory context. 2418 2366 * @returns CR3 value. … … 2424 2372 AssertPtrReturn(pPoolPage, NIL_RTHCPHYS); 2425 2373 return pPoolPage->Core.Key; 2374 } 2375 2376 2377 /** 2378 * Forces lazy remapping of the guest's PAE page-directory structures. 2379 * 2380 * @param pVCpu The cross context virtual CPU structure. 2381 */ 2382 static void pgmGstUpdatePaePdpes(PVMCPU pVCpu) 2383 { 2384 for (unsigned i = 0; i < RT_ELEMENTS(pVCpu->pgm.s.aGCPhysGstPaePDs); i++) 2385 { 2386 pVCpu->pgm.s.apGstPaePDsR3[i] = 0; 2387 pVCpu->pgm.s.apGstPaePDsR0[i] = 0; 2388 pVCpu->pgm.s.aGCPhysGstPaePDs[i] = NIL_RTGCPHYS; 2389 } 2426 2390 } 2427 2391 … … 2528 2492 else 2529 2493 STAM_COUNTER_INC(&pVCpu->pgm.s.Stats.CTX_MID_Z(Stat,FlushTLBSameCR3)); 2494 2495 /* 2496 * Update PAE PDPTEs. 2497 */ 2498 if (PGMMODE_IS_PAE(pVCpu->pgm.s.enmGuestMode)) 2499 pgmGstUpdatePaePdpes(pVCpu); 2530 2500 } 2531 2501 … … 2595 2565 AssertRCSuccess(rc); /* Assumes VINF_PGM_SYNC_CR3 doesn't apply to nested paging. */ /** @todo this isn't true for the mac, but we need hw to test/fix this. */ 2596 2566 } 2567 /* 2568 * Update PAE PDPTEs. 2569 */ 2570 else if (PGMMODE_IS_PAE(pVCpu->pgm.s.enmGuestMode)) 2571 pgmGstUpdatePaePdpes(pVCpu); 2597 2572 2598 2573 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_HM_UPDATE_CR3); -
trunk/src/VBox/VMM/VMMAll/PGMAllBth.h
r91250 r91271 4343 4343 * Map the 4 PDs too. 4344 4344 */ 4345 PX86PDPT pGuestPDPT = pgmGstGetPaePDPTPtr(pVCpu); 4345 X86PDPE aGstPaePdpes[X86_PG_PAE_PDPE_ENTRIES]; 4346 memcpy(&aGstPaePdpes, HCPtrGuestCR3, sizeof(aGstPaePdpes)); 4347 CPUMSetGuestPaePdpes(pVCpu, &aGstPaePdpes[0]); 4346 4348 for (unsigned i = 0; i < X86_PG_PAE_PDPE_ENTRIES; i++) 4347 4349 { 4348 pVCpu->pgm.s.aGstPaePdpeRegs[i].u = pGuestPDPT->a[i].u;4349 if ( pGuestPDPT->a[i].u & X86_PDPE_P)4350 X86PDPE PaePdpe = aGstPaePdpes[i]; 4351 if (PaePdpe.u & X86_PDPE_P) 4350 4352 { 4351 4353 RTHCPTR HCPtr; 4352 RTGCPHYS GCPhys = PGM_A20_APPLY(pVCpu, pGuestPDPT->a[i].u & X86_PDPE_PG_MASK);4354 RTGCPHYS GCPhys = PGM_A20_APPLY(pVCpu, PaePdpe.u & X86_PDPE_PG_MASK); 4353 4355 PGM_LOCK_VOID(pVM); 4354 4356 PPGMPAGE pPage = pgmPhysGetPage(pVM, GCPhys); -
trunk/src/VBox/VMM/VMMR0/HMSVMR0.cpp
r91265 r91271 3995 3995 { 3996 3996 Assert(VMMRZCallRing3IsEnabled(pVCpu)); 3997 Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES));3998 3997 3999 3998 /* Could happen as a result of longjump. */ -
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r91265 r91271 5898 5898 if (CPUMIsGuestInPAEModeEx(pCtx)) 5899 5899 { 5900 rc = PGMGstGetPaePdpes(pVCpu, &pVCpu->hm.s.aPdpes[0]); 5901 AssertRC(rc); 5902 rc = VMXWriteVmcs64(VMX_VMCS64_GUEST_PDPTE0_FULL, pVCpu->hm.s.aPdpes[0].u); AssertRC(rc); 5903 rc = VMXWriteVmcs64(VMX_VMCS64_GUEST_PDPTE1_FULL, pVCpu->hm.s.aPdpes[1].u); AssertRC(rc); 5904 rc = VMXWriteVmcs64(VMX_VMCS64_GUEST_PDPTE2_FULL, pVCpu->hm.s.aPdpes[2].u); AssertRC(rc); 5905 rc = VMXWriteVmcs64(VMX_VMCS64_GUEST_PDPTE3_FULL, pVCpu->hm.s.aPdpes[3].u); AssertRC(rc); 5900 rc = VMXWriteVmcs64(VMX_VMCS64_GUEST_PDPTE0_FULL, pCtx->aPaePdpes[0].u); AssertRC(rc); 5901 rc = VMXWriteVmcs64(VMX_VMCS64_GUEST_PDPTE1_FULL, pCtx->aPaePdpes[1].u); AssertRC(rc); 5902 rc = VMXWriteVmcs64(VMX_VMCS64_GUEST_PDPTE2_FULL, pCtx->aPaePdpes[2].u); AssertRC(rc); 5903 rc = VMXWriteVmcs64(VMX_VMCS64_GUEST_PDPTE3_FULL, pCtx->aPaePdpes[3].u); AssertRC(rc); 5906 5904 } 5907 5905 … … 7964 7962 } 7965 7963 7966 /* If the guest is in PAE mode, sync back the PDPE's into the guest state. 7967 Note: CR4.PAE, CR0.PG, EFER MSR changes are always intercepted, so they're up to date. */ 7964 /* 7965 * If the guest is in PAE mode, sync back the PDPE's into the guest state. 7966 * CR4.PAE, CR0.PG, EFER MSR changes are always intercepted, so they're up to date. 7967 */ 7968 7968 if (CPUMIsGuestInPAEModeEx(pCtx)) 7969 7969 { 7970 rc = VMXReadVmcs64(VMX_VMCS64_GUEST_PDPTE0_FULL, &pVCpu->hm.s.aPdpes[0].u); AssertRC(rc); 7971 rc = VMXReadVmcs64(VMX_VMCS64_GUEST_PDPTE1_FULL, &pVCpu->hm.s.aPdpes[1].u); AssertRC(rc); 7972 rc = VMXReadVmcs64(VMX_VMCS64_GUEST_PDPTE2_FULL, &pVCpu->hm.s.aPdpes[2].u); AssertRC(rc); 7973 rc = VMXReadVmcs64(VMX_VMCS64_GUEST_PDPTE3_FULL, &pVCpu->hm.s.aPdpes[3].u); AssertRC(rc); 7974 VMCPU_FF_SET(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES); 7970 X86PDPE aPaePdpes[4]; 7971 rc = VMXReadVmcs64(VMX_VMCS64_GUEST_PDPTE0_FULL, &aPaePdpes[0].u); AssertRC(rc); 7972 rc = VMXReadVmcs64(VMX_VMCS64_GUEST_PDPTE1_FULL, &aPaePdpes[1].u); AssertRC(rc); 7973 rc = VMXReadVmcs64(VMX_VMCS64_GUEST_PDPTE2_FULL, &aPaePdpes[2].u); AssertRC(rc); 7974 rc = VMXReadVmcs64(VMX_VMCS64_GUEST_PDPTE3_FULL, &aPaePdpes[3].u); AssertRC(rc); 7975 if (memcmp(&aPaePdpes[0], &pCtx->aPaePdpes[0], sizeof(aPaePdpes))) 7976 { 7977 memcpy(&pCtx->aPaePdpes[0], &aPaePdpes[0], sizeof(aPaePdpes)); 7978 /* PGM now updates PAE PDPTEs while updating CR3. */ 7979 VMCPU_FF_SET(pVCpu, VMCPU_FF_HM_UPDATE_CR3); 7980 } 7975 7981 } 7976 7982 } … … 8044 8050 PGMUpdateCR3(pVCpu, CPUMGetGuestCR3(pVCpu)); 8045 8051 } 8046 8047 if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES))8048 PGMGstUpdatePaePdpes(pVCpu, &pVCpu->hm.s.aPdpes[0]);8049 8050 8052 Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_HM_UPDATE_CR3)); 8051 Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES));8052 8053 } 8053 8054 … … 10902 10903 Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_HM_UPDATE_CR3)); 10903 10904 } 10904 if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES))10905 {10906 PGMGstUpdatePaePdpes(pVCpu, &pVCpu->hm.s.aPdpes[0]);10907 Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES));10908 }10909 10905 10910 10906 #ifdef VBOX_WITH_NESTED_HWVIRT_VMX … … 11279 11275 { 11280 11276 VMMRZCallRing3Enable(pVCpu); 11281 11282 11277 Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_HM_UPDATE_CR3)); 11283 Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES));11284 11278 11285 11279 #ifdef HMVMX_ALWAYS_SAVE_RO_GUEST_STATE … … 15639 15633 case VMX_EXIT_QUAL_CRX_ACCESS_WRITE: 15640 15634 { 15635 /* 15636 * When PAE paging is used, the CPU will reload PAE PDPTEs from CR3 when the guest 15637 * changes certain bits even in CR0, CR4 (and not just CR3). We are currently fine 15638 * since IEM_CPUMCTX_EXTRN_MUST_MASK (used below) includes CR3 which will import 15639 * PAE PDPTEs as well. 15640 */ 15641 15641 int rc = hmR0VmxImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK); 15642 15642 AssertRCReturn(rc, rc); -
trunk/src/VBox/VMM/VMMR0/VMMR0.cpp
r91245 r91271 732 732 uint64_t const fCpuFFs = VMCPU_FF_TIMER | VMCPU_FF_PDM_CRITSECT | VMCPU_FF_IEM 733 733 | VMCPU_FF_REQUEST | VMCPU_FF_DBGF | VMCPU_FF_HM_UPDATE_CR3 734 | VMCPU_FF_ HM_UPDATE_PAE_PDPES | VMCPU_FF_PGM_SYNC_CR3| VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL734 | VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL 735 735 | VMCPU_FF_TO_R3 | VMCPU_FF_IOM; 736 736 -
trunk/src/VBox/VMM/VMMR3/CPUM.cpp
r91120 r91271 2685 2685 SSMR3PutStructEx(pSSM, pZmm16Hi, sizeof(*pZmm16Hi), SSMSTRUCT_FLAGS_FULL_STRUCT, g_aCpumZmm16HiFields, NULL); 2686 2686 } 2687 SSMR3PutU64(pSSM, pGstCtx->aPaePdpes[0].u); 2688 SSMR3PutU64(pSSM, pGstCtx->aPaePdpes[1].u); 2689 SSMR3PutU64(pSSM, pGstCtx->aPaePdpes[2].u); 2690 SSMR3PutU64(pSSM, pGstCtx->aPaePdpes[3].u); 2687 2691 if (pVM->cpum.s.GuestFeatures.fSvm) 2688 2692 { … … 2961 2965 PX86XSAVEZMM16HI pZmm16Hi = CPUMCTX_XSAVE_C_PTR(pGstCtx, XSAVE_C_ZMM_16HI_BIT, PX86XSAVEZMM16HI); 2962 2966 SSMR3GetStructEx(pSSM, pZmm16Hi, sizeof(*pZmm16Hi), SSMSTRUCT_FLAGS_FULL_STRUCT, g_aCpumZmm16HiFields, NULL); 2967 } 2968 if (uVersion >= CPUM_SAVED_STATE_VERSION_PAE_PDPES) 2969 { 2970 SSMR3GetU64(pSSM, &pGstCtx->aPaePdpes[0].u); 2971 SSMR3GetU64(pSSM, &pGstCtx->aPaePdpes[1].u); 2972 SSMR3GetU64(pSSM, &pGstCtx->aPaePdpes[2].u); 2973 SSMR3GetU64(pSSM, &pGstCtx->aPaePdpes[3].u); 2963 2974 } 2964 2975 if (uVersion >= CPUM_SAVED_STATE_VERSION_HWVIRT_SVM) … … 3589 3600 pszPrefix, pCtx->msrSFMASK, 3590 3601 pszPrefix, pCtx->msrKERNELGSBASE); 3602 3603 if (CPUMIsGuestInPAEModeEx(pCtx)) 3604 for (unsigned i = 0; i < RT_ELEMENTS(pCtx->aPaePdpes); i++) 3605 pHlp->pfnPrintf(pHlp, "%sPAE PDPTE %u =%016RX64\n", pszPrefix, i, pCtx->aPaePdpes[i]); 3591 3606 break; 3592 3607 } -
trunk/src/VBox/VMM/VMMR3/EM.cpp
r91264 r91271 1458 1458 } 1459 1459 1460 /* Update PAE PDPEs. This must be done *after* PGMUpdateCR3() and used only by the Nested Paging case for HM. */1461 if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES))1462 {1463 CPUM_IMPORT_EXTRN_RCSTRICT(pVCpu, CPUMCTX_EXTRN_CR0 | CPUMCTX_EXTRN_CR3 | CPUMCTX_EXTRN_CR4 | CPUMCTX_EXTRN_EFER, rc);1464 if (CPUMIsGuestInPAEMode(pVCpu))1465 {1466 PX86PDPE pPdpes = HMGetPaePdpes(pVCpu);1467 AssertPtr(pPdpes);1468 1469 PGMGstUpdatePaePdpes(pVCpu, pPdpes);1470 Assert(!VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES));1471 }1472 else1473 VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_HM_UPDATE_PAE_PDPES);1474 }1475 1476 1460 /* IEM has pending work (typically memory write after INS instruction). */ 1477 1461 if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_IEM)) -
trunk/src/VBox/VMM/VMMR3/PGM.cpp
r91249 r91271 801 801 pPGM->apGstPaePDsR0[i] = NIL_RTR0PTR; 802 802 pPGM->aGCPhysGstPaePDs[i] = NIL_RTGCPHYS; 803 pPGM->aGstPaePdpeRegs[i].u = UINT64_MAX;804 803 pPGM->aGCPhysGstPaePDsMonitored[i] = NIL_RTGCPHYS; 805 804 } -
trunk/src/VBox/VMM/VMMR3/VMM.cpp
r91246 r91271 2648 2648 PRINT_FLAG(VMCPU_FF_,REQUEST); 2649 2649 PRINT_FLAG(VMCPU_FF_,HM_UPDATE_CR3); 2650 PRINT_FLAG(VMCPU_FF_,HM_UPDATE_PAE_PDPES);2651 2650 PRINT_FLAG(VMCPU_FF_,PGM_SYNC_CR3); 2652 2651 PRINT_FLAG(VMCPU_FF_,PGM_SYNC_CR3_NON_GLOBAL); -
trunk/src/VBox/VMM/include/CPUMInternal.h
r91266 r91271 115 115 * @{ */ 116 116 /** The current saved state version. */ 117 #define CPUM_SAVED_STATE_VERSION CPUM_SAVED_STATE_VERSION_HWVIRT_VMX_2 117 #define CPUM_SAVED_STATE_VERSION CPUM_SAVED_STATE_VERSION_PAE_PDPES 118 /** The saved state version with PAE PDPEs added. */ 119 #define CPUM_SAVED_STATE_VERSION_PAE_PDPES 21 118 120 /** The saved state version with more virtual VMCS fields and CPUMCTX VMX fields. */ 119 121 #define CPUM_SAVED_STATE_VERSION_HWVIRT_VMX_2 20 -
trunk/src/VBox/VMM/include/CPUMInternal.mac
r91266 r91271 224 224 alignb 8 225 225 .Guest.fExtrn resq 1 226 .Guest.aPaePdpes resq 4 226 227 alignb 8 227 228 .Guest.hwvirt.svm.uMsrHSavePa resq 1 -
trunk/src/VBox/VMM/include/PGMInternal.h
r91250 r91271 3554 3554 /** The physical addresses of the guest page directories (PAE) pointed to by apGstPagePDsHC/GC. */ 3555 3555 RTGCPHYS aGCPhysGstPaePDs[4]; 3556 /** The values of the 4 PDPE CPU registers (PAE).3557 * @todo Not really maintained by PGM atm, only by VT-x in EPT mode. Should3558 * load on cr3 load and use instead of guest memory version like real3559 * HW. We probably should move these to the CPUMCTX and treat them3560 * like the rest of the register wrt exporting to VT-x and import back. */3561 X86PDPE aGstPaePdpeRegs[4];3562 3556 /** The physical addresses of the monitored guest page directories (PAE). */ 3563 3557 RTGCPHYS aGCPhysGstPaePDsMonitored[4];
Note:
See TracChangeset
for help on using the changeset viewer.