VirtualBox

Changeset 62417 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jul 22, 2016 10:09:53 AM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
108968
Message:

VMM/GIM/HyperV: Synthetic interrupt controller bits and some cleanup.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/GIMAllHv.cpp

    r62357 r62417  
    286286                        if (    pMsgIn->uConnectionId  == GIM_HV_VMBUS_MSG_CONNECTION_ID
    287287                            &&  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])
    289289                            &&  MSR_GIM_HV_SIMP_IS_ENABLED(pHvCpu->uSimpMsr))
    290290                        {
     
    483483            return VINF_SUCCESS;
    484484
    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:
    486489        {
    487490            PGIMHVCPU pHvCpu = &pVCpu->gim.s.u.HvCpu;
    488             *puValue = pHvCpu->uSint2Msr;
     491            *puValue = pHvCpu->auSintXMsr[idMsr - MSR_GIM_HV_SINT0];
    489492            return VINF_SUCCESS;
    490493        }
     
    496499            return VINF_SUCCESS;
    497500        }
     501
     502        case MSR_GIM_HV_SVERSION:
     503            *puValue = GIM_HV_SVERSION;
     504            return VINF_SUCCESS;
    498505
    499506        case MSR_GIM_HV_RESET:
     
    590597                {
    591598                    gimR3HvDisableHypercallPage(pVM);
    592                     pHv->u64HypercallMsr &= ~MSR_GIM_HV_HYPERCALL_PAGE_ENABLE_BIT;
     599                    pHv->u64HypercallMsr &= ~MSR_GIM_HV_HYPERCALL_PAGE_ENABLE;
    593600                    LogRel(("GIM: HyperV: Hypercall page disabled via Guest OS ID MSR\n"));
    594601                }
     
    642649             *  see @bugref{7270#c116}. */
    643650            /* 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);
    645652
    646653            /* 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);
    648655            if (   fEnable
    649656                && !gimHvAreHypercallsEnabled(pVCpu))
     
    679686#else  /* IN_RING3 */
    680687            /* 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);
    682689
    683690            /* 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);
    685692            if (!fEnable)
    686693            {
     
    709716#else  /* IN_RING3 */
    710717            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);
    731740
    732741            return VERR_CPUM_RAISE_GP_0;
     
    739748            return VINF_CPUM_R3_MSR_WRITE;
    740749#else
    741             if (MSR_GIM_HV_RESET_IS_SET(uRawValue))
     750            if (MSR_GIM_HV_RESET_IS_ENABLED(uRawValue))
    742751            {
    743752                LogRel(("GIM: HyperV: Reset initiated through MSR\n"));
     
    755764            return VINF_CPUM_R3_MSR_WRITE;
    756765#else
    757             if (uRawValue & MSR_GIM_HV_CRASH_CTL_NOTIFY_BIT)
     766            if (uRawValue & MSR_GIM_HV_CRASH_CTL_NOTIFY)
    758767            {
    759768                LogRel(("GIM: HyperV: Guest indicates a fatal condition! P0=%#RX64 P1=%#RX64 P2=%#RX64 P3=%#RX64 P4=%#RX64\n",
     
    851860                            if (   RT_SUCCESS(rc)
    852861                                && 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;
    854863                            else
    855864                                pHv->uDbgStatusMsr = 0;
     
    882891                        {
    883892                            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;
    885894                        }
    886895                        else
     
    907916            return VINF_CPUM_R3_MSR_WRITE;
    908917#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);
    911920            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));
    915924                return VERR_CPUM_RAISE_GP_0;
    916925            }
    917926
    918             pHvCpu->uSint2Msr = uRawValue;
     927            pHvCpu->auSintXMsr[GIM_HV_VMBUS_MSG_SINT] = uRawValue;
    919928            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"));
    921930            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;
    925964        }
    926965
Note: See TracChangeset for help on using the changeset viewer.

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