VirtualBox

Changeset 23099 in vbox for trunk/src


Ignore:
Timestamp:
Sep 17, 2009 2:39:06 PM (15 years ago)
Author:
vboxsync
Message:

PATM: implemented couple tweaks to make NetBSD bootable (still some spurious segfaults)

Location:
trunk/src/VBox
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/ConsoleImpl2.cpp

    r23008 r23099  
    244244    rc = CFGMR3InsertInteger(pRoot, "CSAMEnabled",          1);     /* boolean */   RC_CHECK();
    245245
     246    PCFGMNODE pCPUM;
     247    rc = CFGMR3InsertNode(pRoot, "CPUM", &pCPUM);                                   RC_CHECK();
     248
    246249    if (osTypeId == "WindowsNT4")
    247250    {
     
    251254         */
    252255        LogRel(("Limiting CPUID leaf count for NT4 guests\n"));
    253         PCFGMNODE pCPUM;
    254         rc = CFGMR3InsertNode(pRoot, "CPUM", &pCPUM);                               RC_CHECK();
    255256        rc = CFGMR3InsertInteger(pCPUM, "NT4LeafLimit", true);                      RC_CHECK();
    256257    }
     
    273274    rc = CFGMR3InsertInteger(pRoot, "HwVirtExtForced",      fHwVirtExtForced);      RC_CHECK();
    274275#endif
     276
     277    if (!fHWVirtExEnabled && osTypeId == "NetBSD")
     278    {
     279        /*
     280         * Use additional NetBSD-specific raw mode heuristics in PATM and CPUM,
     281         * see #4291.
     282         */
     283        PCFGMNODE pPATM;
     284        rc = CFGMR3InsertNode(pRoot, "PATM", &pPATM);                               RC_CHECK();
     285        rc = CFGMR3InsertInteger(pPATM, "SearchImmediatesBackward", 1);                      RC_CHECK();
     286        rc = CFGMR3InsertInteger(pCPUM, "HideCX8", 1);                      RC_CHECK();
     287    }
     288
    275289
    276290    PCFGMNODE pHWVirtExt;
  • trunk/src/VBox/VMM/CPUM.cpp

    r22891 r23099  
    528528    }
    529529
     530    PCFGMNODE pCpum = CFGMR3GetChild(CFGMR3GetRoot(pVM), "CPUM");
    530531    /** @cfgm{/CPUM/NT4LeafLimit, boolean, false}
    531532     * Limit the number of standard CPUID leafs to 0..2 to prevent NT4 from
     
    535536     */
    536537    bool fNt4LeafLimit;
    537     CFGMR3QueryBoolDef(CFGMR3GetChild(CFGMR3GetRoot(pVM), "CPUM"), "NT4LeafLimit", &fNt4LeafLimit, false);
     538    CFGMR3QueryBoolDef(pCpum, "NT4LeafLimit", &fNt4LeafLimit, false);
    538539    if (fNt4LeafLimit)
    539540        pCPUM->aGuestCpuIdStd[0].eax = 2;
     541
     542    /**
     543     * @todo: very hacky, may need to change, once better understand real reason
     544     */
     545    bool fHideCX8;
     546    CFGMR3QueryBoolDef(pCpum, "HideCX8", &fHideCX8, false);
     547    if (fHideCX8)
     548        pCPUM->aGuestCpuIdStd[1].edx &= ~X86_CPUID_FEATURE_EDX_CX8;
    540549
    541550    /*
  • trunk/src/VBox/VMM/PATM/PATM.cpp

    r22890 r23099  
    167167# endif
    168168#endif
     169    pVM->patm.s.uPATMFlags = 0;
     170    bool fSearchBackward;
     171    CFGMR3QueryBoolDef(CFGMR3GetChild(CFGMR3GetRoot(pVM), "PATM"), "SearchImmediatesBackward", &fSearchBackward, false);
     172    if (fSearchBackward)
     173        pVM->patm.s.uPATMFlags |= PATMGFL_SEARCH_IMM_BACKWARD;
    169174
    170175    rc = patmReinit(pVM);
     
    15461551
    15471552/**
     1553 * Checks if few instructions before patch contain something
     1554 * which looks like immediate referring potential patch instruction
     1555 *
     1556 * @returns boolean
     1557 * @param   pVM         The VM to operate on.
     1558 * @param   pInstrGC    Guest context pointer to instruction
     1559 */
     1560static bool patmHasImmsReferringPatch(PVM pVM, RCPTRTYPE(uint8_t *) pInstrGC)
     1561{
     1562    int rc;
     1563    uint32_t value;
     1564
     1565    if (!(pVM->patm.s.uPATMFlags & PATMGFL_SEARCH_IMM_BACKWARD))
     1566        return false;
     1567
     1568    PVMCPU pCpu = VMMGetCpu0(pVM);
     1569    for (int i = 4; i < 12; i++)
     1570    {
     1571        rc = PGMPhysSimpleReadGCPtr(pCpu, &value, pInstrGC - i, 4);
     1572        if (rc == VINF_SUCCESS)
     1573        {
     1574            if ((uint32_t)(value-(uint32_t)pInstrGC) < 6)
     1575                return true;
     1576        }
     1577        else
     1578            break;
     1579    }
     1580    return false;
     1581}
     1582
     1583/**
    15481584 * Recompiles the instructions in a code block
    15491585 *
     
    15731609        Log(("patmRecompileCallback: jump to code we've recompiled before %RRv!\n", pCurInstrGC));
    15741610        return patmPatchGenRelJump(pVM, pPatch, pCurInstrGC, OP_JMP, !!(pCpu->prefix & PREFIX_OPSIZE));
     1611    }
     1612
     1613
     1614    if (patmHasImmsReferringPatch(pVM, pInstrGC))
     1615    {
     1616        pPatch->flags |= PATMFL_INT3_REPLACEMENT_BLOCK;
    15751617    }
    15761618
  • trunk/src/VBox/VMM/PATM/PATMInternal.h

    r22793 r23099  
    7979#define PATMFL_EXTERNAL_JUMP_INSIDE         RT_BIT_64(33) /** A trampoline patch was created that jumps to an instruction in the patch block */
    8080#define PATMFL_CODE_REFERENCED              RT_BIT_64(34) /** patch block referenced (called, jumped to) by another patch. */
     81
     82/* Global flags, affect PATM behavior */
     83#define PATMGFL_SEARCH_IMM_BACKWARD         RT_BIT_32(0)  /** search backward from priveledged insn for immediates referring inside patch */
    8184
    8285#define SIZEOF_NEARJUMP8                   2 //opcode byte + 1 byte relative offset
     
    520523    STAMCOUNTER             StatFunctionLookupInsert;
    521524    uint32_t                StatU32FunctionMaxSlotsUsed;
    522     uint32_t                Alignment0; /**< Align the structure size on a 8-byte boundrary. */
     525    uint32_t                uPATMFlags;
    523526} PATM, *PPATM;
    524527
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