VirtualBox

Changeset 21649 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Jul 16, 2009 1:44:57 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
50182
Message:

Patching updates (not enabled)

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/HWACCM.cpp

    r21645 r21649  
    13871387 * @returns VBox status code.
    13881388 * @param   pVM         The VM to operate on.
    1389  */
    1390 VMMR3DECL(int)  HWACMMR3EnablePatching(PVM pVM)
    1391 {
     1389 * @param   pPatchMem   Patch memory range
     1390 * @param   cbPatchMem  Size of the memory range
     1391 */
     1392VMMR3DECL(int)  HWACMMR3EnablePatching(PVM pVM, RTGCPTR pPatchMem, unsigned cbPatchMem)
     1393{
     1394    /* Current TPR patching only applies to AMD cpus.
     1395     * May need to be extended to Intel CPUs without the APIC TPR hardware optimization.
     1396     */
     1397    if (CPUMGetCPUVendor(pVM) != CPUMCPUVENDOR_AMD)
     1398        return VERR_NOT_SUPPORTED;
     1399
     1400    pVM->hwaccm.s.pGuestPatchMem  = pPatchMem;
     1401    pVM->hwaccm.s.cbGuestPatchMem = cbPatchMem;
    13921402    return VINF_SUCCESS;
    13931403}
     
    13981408 * @returns VBox status code.
    13991409 * @param   pVM         The VM to operate on.
    1400  */
    1401 VMMR3DECL(int)  HWACMMR3DisablePatching(PVM pVM)
    1402 {
     1410 * @param   pPatchMem   Patch memory range
     1411 * @param   cbPatchMem  Size of the memory range
     1412 */
     1413VMMR3DECL(int)  HWACMMR3DisablePatching(PVM pVM, RTGCPTR pPatchMem, unsigned cbPatchMem)
     1414{
     1415    pVM->hwaccm.s.pGuestPatchMem  = 0;
     1416    pVM->hwaccm.s.cbGuestPatchMem = 0;
    14031417    return VINF_SUCCESS;
    14041418}
     
    18001814        AssertRCReturn(rc, rc);
    18011815    }
    1802 
     1816#ifdef VBOX_HWACCM_WITH_GUEST_PATCHING
     1817    rc = SSMR3PutGCPtr(pSSM, pVM->hwaccm.s.pGuestPatchMem);
     1818    AssertRCReturn(rc, rc);
     1819    rc = SSMR3PutGCPtr(pSSM, pVM->hwaccm.s.pFreeGuestPatchMem);
     1820    AssertRCReturn(rc, rc);
     1821    rc = SSMR3PutU32(pSSM, pVM->hwaccm.s.cbGuestPatchMem);
     1822    AssertRCReturn(rc, rc);
     1823
     1824    /* Store all the guest patch records too. */
     1825    rc = SSMR3GetU32(pSSM, &pVM->hwaccm.s.svm.cPatches);
     1826    AssertRCReturn(rc, rc);
     1827
     1828    for (unsigned i = 0; i < pVM->hwaccm.s.svm.cPatches; i++)
     1829    {
     1830        PHWACCMTPRPATCH pPatch = &pVM->hwaccm.s.svm.aPatches[i];
     1831
     1832        rc = SSMR3PutU32(pSSM, pPatch->Core.Key);
     1833        AssertRCReturn(rc, rc);
     1834
     1835        rc = SSMR3PutU32(pSSM, pPatch->cbOp);
     1836        AssertRCReturn(rc, rc);
     1837
     1838        AssertCompile(sizeof(HWACCMTPRINSTR) == sizeof(uint32_t));
     1839        rc = SSMR3PutU32(pSSM, (uint32_t)&pPatch->enmType);
     1840        AssertRCReturn(rc, rc);
     1841
     1842        rc = SSMR3PutU32(pSSM, pPatch->uSrcOperand);
     1843        AssertRCReturn(rc, rc);
     1844
     1845        rc = SSMR3PutU32(pSSM, pPatch->uDstOperand);
     1846        AssertRCReturn(rc, rc);
     1847
     1848        rc = SSMR3PutU32(pSSM, pPatch->pJumpTarget);
     1849        AssertRCReturn(rc, rc);
     1850
     1851        rc = SSMR3PutU32(pSSM, pPatch->cFaults);
     1852        AssertRCReturn(rc, rc);
     1853    }
     1854#endif
    18031855    return VINF_SUCCESS;
    18041856}
     
    18221874     */
    18231875    if (   u32Version != HWACCM_SSM_VERSION
     1876        && u32Version != HWACCM_SSM_VERSION_NO_PATCHING
    18241877        && u32Version != HWACCM_SSM_VERSION_2_0_X)
    18251878    {
     
    18361889        AssertRCReturn(rc, rc);
    18371890
    1838         if (u32Version >= HWACCM_SSM_VERSION)
     1891        if (u32Version >= HWACCM_SSM_VERSION_NO_PATCHING)
    18391892        {
    18401893            uint32_t val;
     
    18531906        }
    18541907    }
     1908#ifdef VBOX_HWACCM_WITH_GUEST_PATCHING
     1909    if (u32Version > HWACCM_SSM_VERSION_NO_PATCHING)
     1910    {
     1911        rc = SSMR3GetGCPtr(pSSM, &pVM->hwaccm.s.pGuestPatchMem);
     1912        AssertRCReturn(rc, rc);
     1913        rc = SSMR3GetGCPtr(pSSM, &pVM->hwaccm.s.pFreeGuestPatchMem);
     1914        AssertRCReturn(rc, rc);
     1915        rc = SSMR3GetU32(pSSM, &pVM->hwaccm.s.cbGuestPatchMem);
     1916        AssertRCReturn(rc, rc);
     1917
     1918        /* Fetch all TPR patch records. */
     1919        rc = SSMR3GetU32(pSSM, &pVM->hwaccm.s.svm.cPatches);
     1920        AssertRCReturn(rc, rc);
     1921
     1922        for (unsigned i = 0; i < pVM->hwaccm.s.svm.cPatches; i++)
     1923        {
     1924            PHWACCMTPRPATCH pPatch = &pVM->hwaccm.s.svm.aPatches[i];
     1925
     1926            rc = SSMR3GetU32(pSSM, &pPatch->Core.Key);
     1927            AssertRCReturn(rc, rc);
     1928
     1929            rc = SSMR3GetU32(pSSM, &pPatch->cbOp);
     1930            AssertRCReturn(rc, rc);
     1931
     1932            AssertCompile(sizeof(HWACCMTPRINSTR) == sizeof(uint32_t));
     1933            rc = SSMR3GetU32(pSSM, (uint32_t *)&pPatch->enmType);
     1934            AssertRCReturn(rc, rc);
     1935
     1936            rc = SSMR3GetU32(pSSM, &pPatch->uSrcOperand);
     1937            AssertRCReturn(rc, rc);
     1938
     1939            rc = SSMR3GetU32(pSSM, &pPatch->uDstOperand);
     1940            AssertRCReturn(rc, rc);
     1941
     1942            rc = SSMR3GetU32(pSSM, &pPatch->cFaults);
     1943            AssertRCReturn(rc, rc);
     1944
     1945            rc = SSMR3GetU32(pSSM, &pPatch->pJumpTarget);
     1946            AssertRCReturn(rc, rc);
     1947           
     1948            rc = RTAvloU32Insert(&pVM->hwaccm.s.svm.PatchTree, &pPatch->Core);
     1949            AssertRC(rc);
     1950        }
     1951    }
     1952#endif
    18551953    return VINF_SUCCESS;
    18561954}
  • trunk/src/VBox/VMM/HWACCMInternal.h

    r21620 r21649  
    132132#define HWACCM_VTX_TOTAL_DEVHEAP_MEM        (HWACCM_EPT_IDENTITY_PG_TABLE_SIZE + HWACCM_VTX_TSS_SIZE)
    133133
     134/* Enable for TPR guest patching. */
     135//#define VBOX_HWACCM_WITH_GUEST_PATCHING
     136
    134137/** HWACCM SSM version
    135138 */
     139#ifdef VBOX_HWACCM_WITH_GUEST_PATCHING
     140#define HWACCM_SSM_VERSION                  5
     141#define HWACCM_SSM_VERSION_NO_PATCHING      4
     142#else
    136143#define HWACCM_SSM_VERSION                  4
     144#define HWACCM_SSM_VERSION_NO_PATCHING      4
     145#endif
    137146#define HWACCM_SSM_VERSION_2_0_X            3
    138147
     
    188197    HWACCMTPRINSTR_WRITE_REG,
    189198    HWACCMTPRINSTR_WRITE_IMM,
    190     HWACCMTPRINSTR_MOV,
     199    HWACCMTPRINSTR_JUMP_REPLACEMENT,
    191200    /** The usual 32-bit paranoia. */
    192201    HWACCMTPRINSTR_32BIT_HACK   = 0x7fffffff
     
    209218    /** Number of times the instruction caused a fault. */
    210219    uint32_t                cFaults;
     220    /** Patch address of the jump replacement. */
     221    RTGCPTR32               pJumpTarget;
    211222} HWACCMTPRPATCH;
    212223/** Pointer to HWACCMTPRPATCH. */
     
    260271     * This number is set much higher when RTThreadPreemptIsPending is reliable. */
    261272    uint32_t                    cMaxResumeLoops;
     273
     274    /** Guest allocated memory for patching purposes. */
     275    RTGCPTR                     pGuestPatchMem;
     276    /** Current free pointer inside the patch block. */
     277    RTGCPTR                     pFreeGuestPatchMem;
     278    /** Size of the guest patch memory block. */
     279    uint32_t                    cbGuestPatchMem;
     280    uint32_t                    uPadding1;
    262281
    263282#if HC_ARCH_BITS == 32 && defined(VBOX_ENABLE_64_BITS_GUESTS) && !defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
     
    411430         */
    412431        AVLOU32TREE                 PatchTree;
    413 
    414432        uint32_t                    cPatches;
    415433        HWACCMTPRPATCH              aPatches[64];
  • trunk/src/VBox/VMM/VMM.cpp

    r21645 r21649  
    13151315{
    13161316    if (HWACCMIsEnabled(pVM))
    1317         HWACMMR3EnablePatching(pVM);
    1318 
    1319     return VERR_ACCESS_DENIED;
     1317        return HWACMMR3EnablePatching(pVM, pPatchMem, cbPatchMem);
     1318
     1319    return VERR_NOT_SUPPORTED;
    13201320}
    13211321
     
    13311331{
    13321332    if (HWACCMIsEnabled(pVM))
    1333     {
    1334         int rc = HWACMMR3DisablePatching(pVM);
    1335         if (VBOX_FAILURE(rc))
    1336             return rc;
    1337     }
     1333        return HWACMMR3DisablePatching(pVM, pPatchMem, cbPatchMem);
    13381334
    13391335    return VINF_SUCCESS;
  • trunk/src/VBox/VMM/VMMAll/VMMAll.cpp

    r19476 r21649  
    153153    return pVM->vmm.s.enmSwitcher;
    154154}
    155 
  • trunk/src/VBox/VMM/VMMR0/HWSVMR0.cpp

    r21620 r21649  
    17371737            &&  pVM->hwaccm.s.fHasIoApic
    17381738            &&  !(errCode & X86_TRAP_PF_P)  /* not present */
    1739             &&  CPUMGetGuestCPL(pVCpu, CPUMCTX2CORE(pCtx)) == 0
    17401739            &&  !CPUMIsGuestInLongModeEx(pCtx))
    17411740        {
     
    17431742            PDMApicGetBase(pVM, &GCPhysApicBase);   /* @todo cache this */
    17441743            GCPhysApicBase &= PAGE_BASE_GC_MASK;
     1744
     1745            Assert(CPUMGetGuestCPL(pVCpu, CPUMCTX2CORE(pCtx)) == 0);
    17451746
    17461747            if (uFaultAddress == GCPhysApicBase + 0x80)
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