Changeset 62417 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Jul 22, 2016 10:09:53 AM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 108968
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/GIMAllHv.cpp
r62357 r62417 286 286 if ( pMsgIn->uConnectionId == GIM_HV_VMBUS_MSG_CONNECTION_ID 287 287 && pMsgIn->enmMessageType == GIMHVMSGTYPE_VMBUS 288 && !MSR_GIM_HV_SINT_IS_MASKED(pHvCpu-> uSint2Msr)288 && !MSR_GIM_HV_SINT_IS_MASKED(pHvCpu->auSintXMsr[GIM_HV_VMBUS_MSG_SINT]) 289 289 && MSR_GIM_HV_SIMP_IS_ENABLED(pHvCpu->uSimpMsr)) 290 290 { … … 483 483 return VINF_SUCCESS; 484 484 485 case MSR_GIM_HV_SINT2: 485 case MSR_GIM_HV_SINT0: case MSR_GIM_HV_SINT1: case MSR_GIM_HV_SINT2: case MSR_GIM_HV_SINT3: 486 case MSR_GIM_HV_SINT4: case MSR_GIM_HV_SINT5: case MSR_GIM_HV_SINT6: case MSR_GIM_HV_SINT7: 487 case MSR_GIM_HV_SINT8: case MSR_GIM_HV_SINT9: case MSR_GIM_HV_SINT10: case MSR_GIM_HV_SINT11: 488 case MSR_GIM_HV_SINT12: case MSR_GIM_HV_SINT13: case MSR_GIM_HV_SINT14: case MSR_GIM_HV_SINT15: 486 489 { 487 490 PGIMHVCPU pHvCpu = &pVCpu->gim.s.u.HvCpu; 488 *puValue = pHvCpu-> uSint2Msr;491 *puValue = pHvCpu->auSintXMsr[idMsr - MSR_GIM_HV_SINT0]; 489 492 return VINF_SUCCESS; 490 493 } … … 496 499 return VINF_SUCCESS; 497 500 } 501 502 case MSR_GIM_HV_SVERSION: 503 *puValue = GIM_HV_SVERSION; 504 return VINF_SUCCESS; 498 505 499 506 case MSR_GIM_HV_RESET: … … 590 597 { 591 598 gimR3HvDisableHypercallPage(pVM); 592 pHv->u64HypercallMsr &= ~MSR_GIM_HV_HYPERCALL_PAGE_ENABLE _BIT;599 pHv->u64HypercallMsr &= ~MSR_GIM_HV_HYPERCALL_PAGE_ENABLE; 593 600 LogRel(("GIM: HyperV: Hypercall page disabled via Guest OS ID MSR\n")); 594 601 } … … 642 649 * see @bugref{7270#c116}. */ 643 650 /* First, update all but the hypercall page enable bit. */ 644 pHv->u64HypercallMsr = (uRawValue & ~MSR_GIM_HV_HYPERCALL_PAGE_ENABLE _BIT);651 pHv->u64HypercallMsr = (uRawValue & ~MSR_GIM_HV_HYPERCALL_PAGE_ENABLE); 645 652 646 653 /* Hypercall page can only be enabled when the guest has enabled hypercalls. */ 647 bool fEnable = RT_BOOL(uRawValue & MSR_GIM_HV_HYPERCALL_PAGE_ENABLE_BIT);654 bool fEnable = MSR_GIM_HV_HYPERCALL_PAGE_IS_ENABLED(uRawValue); 648 655 if ( fEnable 649 656 && !gimHvAreHypercallsEnabled(pVCpu)) … … 679 686 #else /* IN_RING3 */ 680 687 /* First, update all but the TSC page enable bit. */ 681 pHv->u64TscPageMsr = (uRawValue & ~MSR_GIM_HV_REF_TSC_ENABLE _BIT);688 pHv->u64TscPageMsr = (uRawValue & ~MSR_GIM_HV_REF_TSC_ENABLE); 682 689 683 690 /* Is the guest disabling the TSC page? */ 684 bool fEnable = RT_BOOL(uRawValue & MSR_GIM_HV_REF_TSC_ENABLE_BIT);691 bool fEnable = MSR_GIM_HV_REF_TSC_IS_ENABLED(uRawValue); 685 692 if (!fEnable) 686 693 { … … 709 716 #else /* IN_RING3 */ 710 717 PGIMHVCPU pHvCpu = &pVCpu->gim.s.u.HvCpu; 711 /* First, update all but the APIC-assist page enable bit. */ 712 pHvCpu->uApicAssistPageMsr = (uRawValue & ~MSR_GIM_HV_APICASSIST_PAGE_ENABLE_BIT); 713 714 /* Is the guest disabling the APIC-assist page? */ 715 bool fEnable = RT_BOOL(uRawValue & MSR_GIM_HV_APICASSIST_PAGE_ENABLE_BIT); 716 if (!fEnable) 717 { 718 gimR3HvDisableApicAssistPage(pVM); 719 pHvCpu->uApicAssistPageMsr = uRawValue; 720 return VINF_SUCCESS; 721 } 722 723 /* Enable the APIC-assist page. */ 724 RTGCPHYS GCPhysApicAssist = MSR_GIM_HV_APICASSIST_GUEST_PFN(uRawValue) << PAGE_SHIFT; 725 int rc = gimR3HvEnableApicAssistPage(pVM, GCPhysApicAssist); 726 if (RT_SUCCESS(rc)) 727 { 728 pHvCpu->uApicAssistPageMsr = uRawValue; 729 return VINF_SUCCESS; 730 } 718 pHvCpu->uApicAssistPageMsr = uRawValue; 719 720 if (MSR_GIM_HV_APICASSIST_PAGE_IS_ENABLED(uRawValue)) 721 { 722 RTGCPHYS GCPhysApicAssistPage = MSR_GIM_HV_APICASSIST_GUEST_PFN(uRawValue) << PAGE_SHIFT; 723 if (PGMPhysIsGCPhysNormal(pVM, GCPhysApicAssistPage)) 724 { 725 int rc = gimR3HvEnableApicAssistPage(pVCpu, GCPhysApicAssistPage); 726 if (RT_SUCCESS(rc)) 727 { 728 pHvCpu->uApicAssistPageMsr = uRawValue; 729 return VINF_SUCCESS; 730 } 731 } 732 else 733 { 734 LogRelMax(5, ("GIM: HyperV%u: APIC-assist page address %#RGp invalid!\n", pVCpu->idCpu, 735 GCPhysApicAssistPage)); 736 } 737 } 738 else 739 gimR3HvDisableApicAssistPage(pVCpu); 731 740 732 741 return VERR_CPUM_RAISE_GP_0; … … 739 748 return VINF_CPUM_R3_MSR_WRITE; 740 749 #else 741 if (MSR_GIM_HV_RESET_IS_ SET(uRawValue))750 if (MSR_GIM_HV_RESET_IS_ENABLED(uRawValue)) 742 751 { 743 752 LogRel(("GIM: HyperV: Reset initiated through MSR\n")); … … 755 764 return VINF_CPUM_R3_MSR_WRITE; 756 765 #else 757 if (uRawValue & MSR_GIM_HV_CRASH_CTL_NOTIFY _BIT)766 if (uRawValue & MSR_GIM_HV_CRASH_CTL_NOTIFY) 758 767 { 759 768 LogRel(("GIM: HyperV: Guest indicates a fatal condition! P0=%#RX64 P1=%#RX64 P2=%#RX64 P3=%#RX64 P4=%#RX64\n", … … 851 860 if ( RT_SUCCESS(rc) 852 861 && cbWrite == cbWritten) 853 pHv->uDbgStatusMsr = MSR_GIM_HV_SYNTH_DEBUG_STATUS_W_SUCCESS _BIT;862 pHv->uDbgStatusMsr = MSR_GIM_HV_SYNTH_DEBUG_STATUS_W_SUCCESS; 854 863 else 855 864 pHv->uDbgStatusMsr = 0; … … 882 891 { 883 892 pHv->uDbgStatusMsr = ((uint16_t)cbReallyRead) << 16; 884 pHv->uDbgStatusMsr |= MSR_GIM_HV_SYNTH_DEBUG_STATUS_R_SUCCESS _BIT;893 pHv->uDbgStatusMsr |= MSR_GIM_HV_SYNTH_DEBUG_STATUS_R_SUCCESS; 885 894 } 886 895 else … … 907 916 return VINF_CPUM_R3_MSR_WRITE; 908 917 #else 909 PGIMHVCPU pHvCpu = &pVCpu->gim.s.u.HvCpu;910 uint8_t uVector = MSR_GIM_HV_SINT_VECTOR(uRawValue);918 PGIMHVCPU pHvCpu = &pVCpu->gim.s.u.HvCpu; 919 uint8_t uVector = MSR_GIM_HV_SINT_VECTOR(uRawValue); 911 920 if ( !MSR_GIM_HV_SINT_IS_MASKED(uRawValue) 912 && uVector < 16)913 { 914 LogRel(("GIM: HyperV: Programmed an invalid vector in SINT2 , uVector=%u -> #GP(0)\n", uVector));921 && uVector < GIM_HV_SINT_VECTOR_VALID_MIN) 922 { 923 LogRel(("GIM: HyperV: Programmed an invalid vector in SINT2 (VMBUS_MSG_SINT), uVector=%u -> #GP(0)\n", uVector)); 915 924 return VERR_CPUM_RAISE_GP_0; 916 925 } 917 926 918 pHvCpu-> uSint2Msr= uRawValue;927 pHvCpu->auSintXMsr[GIM_HV_VMBUS_MSG_SINT] = uRawValue; 919 928 if (MSR_GIM_HV_SINT_IS_MASKED(uRawValue)) 920 LogRel(("GIM: HyperV: Masked SINT2 \n"));929 LogRel(("GIM: HyperV: Masked SINT2 (VMBUS_MSG_SINT)\n")); 921 930 else 922 LogRel(("GIM: HyperV: Unmasked SINT2, uVector=%u\n", uVector)); 923 return VINF_SUCCESS; 924 #endif 931 LogRel(("GIM: HyperV: Unmasked SINT2 (VMBUS_MSG_SINT), uVector=%u\n", uVector)); 932 return VINF_SUCCESS; 933 #endif 934 } 935 936 case MSR_GIM_HV_SIEFP: 937 { 938 #ifndef IN_RING3 939 return VINF_CPUM_R3_MSR_WRITE; 940 #else 941 PGIMHVCPU pHvCpu = &pVCpu->gim.s.u.HvCpu; 942 pHvCpu->uSiefpMsr = uRawValue; 943 if (MSR_GIM_HV_SIEF_PAGE_IS_ENABLED(uRawValue)) 944 { 945 RTGCPHYS GCPhysSiefPage = MSR_GIM_HV_SIEF_GUEST_PFN(uRawValue) << PAGE_SHIFT; 946 if (PGMPhysIsGCPhysNormal(pVM, GCPhysSiefPage)) 947 { 948 int rc = gimR3HvEnableSiefPage(pVCpu, GCPhysSiefPage); 949 if (RT_SUCCESS(rc)) 950 { 951 /** @todo SIEF setup. */ 952 return VINF_SUCCESS; 953 } 954 } 955 else 956 LogRelMax(5, ("GIM: HyperV%u: SIEF page address %#RGp invalid!\n", pVCpu->idCpu, GCPhysSiefPage)); 957 } 958 else 959 gimR3HvDisableSiefPage(pVCpu); 960 961 return VERR_CPUM_RAISE_GP_0; 962 #endif 963 break; 925 964 } 926 965
Note:
See TracChangeset
for help on using the changeset viewer.