VirtualBox

Changeset 54761 in vbox for trunk


Ignore:
Timestamp:
Mar 13, 2015 9:35:30 PM (10 years ago)
Author:
vboxsync
Message:

PATM: Only fix up constants when loading state.

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/PATM.cpp

    r54746 r54761  
    763763        {
    764764        case FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL:
    765             Assert(pRec->pDest == pRec->pSource);
     765            Assert(pRec->pDest == pRec->pSource); Assert(PATM_IS_FIXUP_TYPE(pRec->pSource));
    766766            Log(("Absolute patch template fixup type %#x at %RHv -> %RHv at %RRv\n", pRec->pSource, *(RTRCUINTPTR *)pRec->pRelocPos, *(RTRCINTPTR*)pRec->pRelocPos + delta, pRec->pRelocPos));
    767767            *(RTRCUINTPTR *)pRec->pRelocPos += delta;
     
    916916            break;
    917917        }
     918
     919        case FIXUP_CONSTANT_IN_PATCH_ASM_TMPL:
     920            /* Only applicable when loading state. */
     921            Assert(pRec->pDest == pRec->pSource);
     922            Assert(PATM_IS_FIXUP_TYPE(pRec->pSource));
     923            break;
    918924
    919925        default:
  • trunk/src/VBox/VMM/VMMR3/PATMPatch.cpp

    r54746 r54761  
    177177                 * A SAVED STATE WITH A DIFFERENT HYPERVISOR LAYOUT.
    178178                 */
     179                uint32_t uRelocType = FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL;
    179180                switch (pAsmRecord->aRelocs[i].uType)
    180181                {
     
    353354                    /*
    354355                     * The following fixups needs to be recalculated when loading saved state
    355                      * Note! Earlier saved state versions had different hacks for detecting these.
     356                     * Note! Earlier saved state versions had different hacks for detecting some of these.
    356357                     */
    357358                    case PATM_VM_FORCEDACTIONS:
     
    367368                        dest = CPUMR3GetGuestCpuIdPatmArrayEndRCPtr(pVM);
    368369                        break;
     370
     371                    case PATM_CPUID_STD_PTR: /* saved state only */
     372                        dest = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM);
     373                        break;
     374                    case PATM_CPUID_EXT_PTR: /* saved state only */
     375                        dest = CPUMR3GetGuestCpuIdPatmExtRCPtr(pVM);
     376                        break;
     377                    case PATM_CPUID_CENTAUR_PTR: /* saved state only */
     378                        dest = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM);
     379                        break;
     380
     381                    /*
     382                     * The following fixups are constants that needs to be corrected when
     383                     * loading saved state as these may change between VBox versions.
     384                     */
    369385                    case PATM_CPUID_ARRAY_ENTRY_SIZE:
    370386                        dest = sizeof(CPUMCPUIDLEAF);
     387                        uRelocType = FIXUP_CONSTANT_IN_PATCH_ASM_TMPL;
    371388                        break;
    372389                    case PATM_CPUID_UNKNOWN_METHOD:
    373390                        dest = CPUMR3GetGuestCpuIdPatmUnknownLeafMethod(pVM);
    374                         break;
    375 
    376                     case PATM_CPUID_STD_PTR: /* saved state only */
    377                         dest = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM);
    378                         break;
    379                     case PATM_CPUID_EXT_PTR: /* saved state only */
    380                         dest = CPUMR3GetGuestCpuIdPatmExtRCPtr(pVM);
    381                         break;
    382                     case PATM_CPUID_CENTAUR_PTR: /* saved state only */
    383                         dest = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM);
    384                         break;
    385 
     391                        uRelocType = FIXUP_CONSTANT_IN_PATCH_ASM_TMPL;
     392                        break;
     393
     394                    /*
     395                     * Unknown fixup.
     396                     */
    386397                    default:
     398                        AssertReleaseMsgFailed(("Unknown fixup: %#x\n", pAsmRecord->aRelocs[i].uType));
    387399                        dest = PATM_ILLEGAL_DESTINATION;
    388                         AssertReleaseFailed();
    389400                        break;
    390401                }
     
    393404                if (pAsmRecord->aRelocs[i].uType < PATM_NO_FIXUP)
    394405                {
    395                     patmPatchAddReloc32(pVM, pPatch, &pPB[j], FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL,
     406                    patmPatchAddReloc32(pVM, pPatch, &pPB[j], uRelocType,
    396407                                        pAsmRecord->aRelocs[i].uType /*pSources*/, pAsmRecord->aRelocs[i].uType /*pDest*/);
    397408                }
  • trunk/src/VBox/VMM/VMMR3/PATMSSM.cpp

    r54737 r54761  
    142142*   Internal Functions                                                         *
    143143*******************************************************************************/
    144 static void patmCorrectFixup(PVM pVM, unsigned ulSSMVersion, PATM &patmInfo, PPATCHINFO pPatch, PRELOCREC pRec, int32_t offset, RTRCPTR *pFixup);
     144static int patmCorrectFixup(PVM pVM, unsigned ulSSMVersion, PATM &patmInfo, PPATCHINFO pPatch, PRELOCREC pRec,
     145                            int32_t offset, RTRCPTR *pFixup);
     146
    145147
    146148/*******************************************************************************
     
    981983                    }
    982984
    983                     patmCorrectFixup(pVM, uVersion, patmInfo, &pPatchRec->patch, &rec, offset, pFixup);
     985                    rc = patmCorrectFixup(pVM, uVersion, patmInfo, &pPatchRec->patch, &rec, offset, pFixup);
     986                    AssertRCReturn(rc, rc);
    984987                }
    985988
     
    10671070
    10681071        /* Correct fixups that refer to PATM structures in the hypervisor region (their addresses might have changed). */
    1069         patmCorrectFixup(pVM, uVersion, patmInfo, &pVM->patm.s.pGlobalPatchRec->patch, pRec, offset, pFixup);
     1072        rc = patmCorrectFixup(pVM, uVersion, patmInfo, &pVM->patm.s.pGlobalPatchRec->patch, pRec, offset, pFixup);
     1073        AssertRCReturn(rc, rc);
    10701074    }
    10711075
     
    10951099 * @param   pFixup          Fixup address
    10961100 */
    1097 static void patmCorrectFixup(PVM pVM, unsigned uVersion, PATM &patmInfo, PPATCHINFO pPatch, PRELOCREC pRec,
    1098                              int32_t offset, RTRCPTR *pFixup)
     1101static int patmCorrectFixup(PVM pVM, unsigned uVersion, PATM &patmInfo, PPATCHINFO pPatch, PRELOCREC pRec,
     1102                            int32_t offset, RTRCPTR *pFixup)
    10991103{
    11001104    int32_t delta = pVM->patm.s.pPatchMemGC - patmInfo.pPatchMemGC;
     
    13631367                    *pFixup = CPUMR3GetGuestCpuIdPatmArrayEndRCPtr(pVM);
    13641368                    break;
    1365                 case PATM_CPUID_ARRAY_ENTRY_SIZE:
    1366                     *pFixup = sizeof(CPUMCPUIDLEAF);
    1367                     break;
    1368                 case PATM_CPUID_UNKNOWN_METHOD:
    1369                     *pFixup = CPUMR3GetGuestCpuIdPatmUnknownLeafMethod(pVM);
    1370                     break;
    13711369                case PATM_CPUID_STD_PTR: /* Saved again patches only. */
    13721370                    *pFixup = CPUMR3GetGuestCpuIdPatmStdRCPtr(pVM);
     
    13781376                    *pFixup = CPUMR3GetGuestCpuIdPatmCentaurRCPtr(pVM);
    13791377                    break;
     1378            }
     1379        }
     1380        /*
     1381         * Constant that may change between VM version needs fixing up.
     1382         */
     1383        else if (pRec->uType == FIXUP_CONSTANT_IN_PATCH_ASM_TMPL)
     1384        {
     1385            AssertLogRelReturn(uVersion > PATM_SAVED_STATE_VERSION_NO_RAW_MEM, VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
     1386            Assert(pRec->pSource == pRec->pDest); Assert(PATM_IS_FIXUP_TYPE(pRec->pSource));
     1387            switch (pRec->pSource)
     1388            {
     1389                case PATM_CPUID_ARRAY_ENTRY_SIZE:
     1390                    *pFixup = sizeof(CPUMCPUIDLEAF);
     1391                    break;
     1392                case PATM_CPUID_UNKNOWN_METHOD:
     1393                    *pFixup = CPUMR3GetGuestCpuIdPatmUnknownLeafMethod(pVM);
     1394                    break;
     1395                default:
     1396                    AssertLogRelMsgFailed(("Unknown FIXUP_CONSTANT_IN_PATCH_ASM_TMPL fixup: %#x\n", pRec->pSource));
     1397                    return VERR_SSM_DATA_UNIT_FORMAT_CHANGED;
    13801398            }
    13811399        }
     
    14801498    }
    14811499}
     1500    return VINF_SUCCESS;
    14821501}
    14831502
  • trunk/src/VBox/VMM/include/PATMInternal.h

    r54714 r54761  
    114114 * as FIXUP_ABSOLUTE. */
    115115#define FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL   3
     116/** Constant value that only needs fixing up when loading state.  Structure
     117 * size, member offset, or similar.  The source and destination address are set
     118 * like for FIXUP_ABSOLUTE_IN_PATCH_ASM_TMPL.  */
     119#define FIXUP_CONSTANT_IN_PATCH_ASM_TMPL   4
    116120/** @} */
    117121
Note: See TracChangeset for help on using the changeset viewer.

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