VirtualBox

Changeset 44609 in vbox


Ignore:
Timestamp:
Feb 9, 2013 5:49:58 AM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
83694
Message:

DevEFI.cpp: EFI_VARIABLE_OP_QUERY and _OP_ADD optimizations, fixed status of EFI_VARIABLE_OP_QUERY_REWIND.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/EFI/DevEFI.cpp

    r44605 r44609  
    284284{
    285285    LogFlowFunc(("%RTuuid::'%s'\n", pUuid, pszVariableName));
    286 
    287     int      rc         = VERR_NOT_FOUND;
    288     uint32_t cVariables = 0;
    289     PEFIVAR  pEfiVar;
    290     RTListForEach(&pThis->NVRAM.VarList, pEfiVar, EFIVAR, ListNode)
    291     {
    292         LogFlowFunc(("pEfiVar:%p\n", pEfiVar));
    293         cVariables++;
    294         if (   pEfiVar
    295             && RTUuidCompare(pUuid, &pEfiVar->uuid) == 0
    296             && RTStrCmp(pszVariableName, pEfiVar->szName) == 0) /** @todo case sensitive or insensitive? */
     286    size_t const    cchVariableName = strlen(pszVariableName);
     287    int             rc              = VERR_NOT_FOUND;
     288
     289    /*
     290     * Start by checking the last variable queried.
     291     */
     292    if (   pThis->NVRAM.pCurVar
     293        && pThis->NVRAM.pCurVar->cchName == cchVariableName
     294        && memcmp(pThis->NVRAM.pCurVar->szName, pszVariableName, cchVariableName + 1) == 0
     295        && RTUuidCompare(&pThis->NVRAM.pCurVar->uuid, pUuid) == 0
     296        )
     297    {
     298        *ppEfiVar = pThis->NVRAM.pCurVar;
     299        rc = VINF_SUCCESS;
     300    }
     301    else
     302    {
     303        /*
     304         * Linear list search.
     305         */
     306        PEFIVAR pEfiVar;
     307        RTListForEach(&pThis->NVRAM.VarList, pEfiVar, EFIVAR, ListNode)
    297308        {
    298             *ppEfiVar = pEfiVar;
    299             rc = VINF_SUCCESS;
    300             break;
     309            Assert(strlen(pEfiVar->szName) == pEfiVar->cchName);
     310            if (   pEfiVar->cchName == cchVariableName
     311                && memcmp(pEfiVar->szName, pszVariableName, cchVariableName + 1) == 0
     312                && RTUuidCompare(&pEfiVar->uuid, pUuid) == 0)
     313            {
     314                *ppEfiVar = pEfiVar;
     315                rc = VINF_SUCCESS;
     316                break;
     317            }
    301318        }
    302319    }
    303     Assert(pThis->NVRAM.cVariables >= cVariables);
    304320
    305321    LogFlowFunc(("rc=%Rrc pEfiVar=%p\n", rc, *ppEfiVar));
     
    435451static int nvramWriteVariableOpQuery(PDEVEFI pThis)
    436452{
    437     LogRel(("EFI: Querying Variable %RTuuid::'%s'\n",
    438             &pThis->NVRAM.VarOpBuf.uuid, pThis->NVRAM.VarOpBuf.szName));
     453    Log(("EFI_VARIABLE_OP_QUERY: %RTuuid::'%s'\n", &pThis->NVRAM.VarOpBuf.uuid, pThis->NVRAM.VarOpBuf.szName));
    439454
    440455    PEFIVAR pEfiVar;
     
    457472static int nvramWriteVariableOpQueryNext(PDEVEFI pThis)
    458473{
    459     Log(("EFI: Querying next variable...\n"));
     474    Log(("EFI_VARIABLE_OP_QUERY_NEXT: pCurVar=%p\n", pThis->NVRAM.pCurVar));
    460475    PEFIVAR pEfiVar = pThis->NVRAM.pCurVar;
    461476    if (pEfiVar)
     
    475490static int nvramWriteVariableOpAdd(PDEVEFI pThis)
    476491{
    477     LogRel(("EFI: Adding variable %RTuuid::'%s'\n", &pThis->NVRAM.VarOpBuf.uuid, pThis->NVRAM.VarOpBuf.szName));
    478     LogFlowFunc(("fAttributes=%#x abValue=%.*Rhxs\n", pThis->NVRAM.VarOpBuf.fAttributes,
    479                  pThis->NVRAM.VarOpBuf.cbValue, pThis->NVRAM.VarOpBuf.abValue));
     492    LogRel(("EFI_VARIABLE_OP_ADD: %RTuuid::'%s' fAttributes=%#x abValue=%.*Rhxs\n",
     493            &pThis->NVRAM.VarOpBuf.uuid, pThis->NVRAM.VarOpBuf.szName, pThis->NVRAM.VarOpBuf.fAttributes,
     494            pThis->NVRAM.VarOpBuf.cbValue, pThis->NVRAM.VarOpBuf.abValue));
    480495
    481496    /*
     
    516531             * Delete it.
    517532             */
    518             LogFlow(("nvramWriteVariableOpAdd: Delete\n"));
     533            LogRel(("EFI: Deleting variable %RTuuid::'%s'\n", &pThis->NVRAM.VarOpBuf.uuid, pThis->NVRAM.VarOpBuf.szName));
    519534            RTListNodeRemove(&pEfiVar->ListNode);
    520535            pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_OK;
     
    531546             * Update/replace it. (The name and UUID are unchanged, of course.)
    532547             */
    533             LogFlow(("nvramWriteVariableOpAdd: Replace\n"));
     548            LogRel(("EFI: Replacing variable %RTuuid::'%s' fAttrib=%#x cbValue=%#x\n", &pThis->NVRAM.VarOpBuf.uuid,
     549                    pThis->NVRAM.VarOpBuf.szName, pThis->NVRAM.VarOpBuf.fAttributes, pThis->NVRAM.VarOpBuf.cbValue));
    534550            pEfiVar->fAttributes   = pThis->NVRAM.VarOpBuf.fAttributes;
    535551            pEfiVar->cbValue       = pThis->NVRAM.VarOpBuf.cbValue;
     
    549565         * Add a new variable.
    550566         */
    551         LogFlow(("nvramWriteVariableOpAdd: New\n"));
     567        LogRel(("EFI: Adding variable %RTuuid::'%s' fAttrib=%#x cbValue=%#x\n", &pThis->NVRAM.VarOpBuf.uuid,
     568                pThis->NVRAM.VarOpBuf.szName, pThis->NVRAM.VarOpBuf.fAttributes, pThis->NVRAM.VarOpBuf.cbValue));
    552569        pEfiVar = (PEFIVAR)RTMemAllocZ(sizeof(EFIVAR));
    553570        if (pEfiVar)
     
    574591        static unsigned s_cWarnings = 0;
    575592        if (s_cWarnings++ < 5)
    576             LogRel(("EFI: Too many variables.\n"));
     593            LogRel(("EFI: Too many variables (%RTuuid::'%s' fAttrib=%#x cbValue=%#x)\n", &pThis->NVRAM.VarOpBuf.uuid,
     594                    pThis->NVRAM.VarOpBuf.szName, pThis->NVRAM.VarOpBuf.fAttributes, pThis->NVRAM.VarOpBuf.cbValue));
    577595        pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_ERROR;
    578596        Log(("nvramWriteVariableOpAdd: Too many variabled.\n"));
     
    608626                case EFI_VARIABLE_OP_QUERY_REWIND:
    609627                    Log2(("EFI_VARIABLE_OP_QUERY_REWIND\n"));
    610                     pThis->NVRAM.pCurVar = NULL;
     628                    pThis->NVRAM.pCurVar   = NULL;
     629                    pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_OK;
    611630                    break;
    612631
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