VirtualBox

Changeset 43143 in vbox


Ignore:
Timestamp:
Sep 1, 2012 3:32:37 AM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
80516
Message:

EFI: expose NVRAM stuff in dedicated structure, lightweighted EFIVAR structure.

File:
1 edited

Legend:

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

    r43131 r43143  
    6161typedef struct {
    6262        RTLISTNODE List;
    63         EFIVAROP enmOp;
    64         uint32_t u32Status;
    6563        RTUUID   uuid;
    6664        char     szVariableName[1024];
     
    6967        uint32_t cbValue;
    7068        uint32_t u32Attribute;
    71         uint32_t idxOpBuffer;
    7269} EFIVAR, *PEFIVAR;
    7370
     
    144141    uint32_t        u32UgaHorisontal;
    145142    uint32_t        u32UgaVertical;
    146     uint32_t        idxVariableName;
    147     EFIVAR          OperationVarOp;
    148     RTLISTANCHOR    NVRAMVariableList;
    149     PEFIVAR         pCurrentVarOp;
     143    struct {
     144        uint32_t        idxVariableName;
     145        EFIVAROP        enmOp;
     146        uint32_t        u32Status;
     147        uint32_t idxOpBuffer;
     148        EFIVAR          OperationVarOp;
     149        RTLISTANCHOR    NVRAMVariableList;
     150        PEFIVAR         pCurrentVarOp;
     151    } NVRAM;
    150152    struct {
    151153        PPDMIBASE    pDrvBase;
     
    177179    PEFIVAR pEfiVar = NULL;
    178180    LogFlowFunc(("pszVariableName:%s, pUuid:%RTuuid\n", pszVariableName, pUuid));
    179     RTListForEach((PRTLISTNODE)&pThis->NVRAMVariableList, pEfiVar, EFIVAR, List)
     181    RTListForEach((PRTLISTNODE)&pThis->NVRAM.NVRAMVariableList, pEfiVar, EFIVAR, List)
    180182    {
    181183        LogFlowFunc(("pEfiVar:%p\n", pEfiVar));
     
    221223            break;
    222224        }
    223         RTListAppend((PRTLISTNODE)&pThis->NVRAMVariableList, &pEfiVar->List);
     225        RTListAppend((PRTLISTNODE)&pThis->NVRAM.NVRAMVariableList, &pEfiVar->List);
    224226    }
    225227    if (   RT_FAILURE(rc)
     
    237239    pThis->Lun0.pNvramDown->pfnFlushNvramStorage(pThis->Lun0.pNvramDown);
    238240
    239     RTListForEach((PRTLISTNODE)&pThis->NVRAMVariableList, pEfiVar, EFIVAR, List)
     241    RTListForEach((PRTLISTNODE)&pThis->NVRAM.NVRAMVariableList, pEfiVar, EFIVAR, List)
    240242    {
    241243        pThis->Lun0.pNvramDown->pfnStoreNvramValue(pThis->Lun0.pNvramDown,
     
    383385#endif
    384386        case EFI_VARIABLE_OP:
    385             switch (pThis->OperationVarOp.enmOp)
     387            switch (pThis->NVRAM.enmOp)
    386388            {
    387389                case EFI_VM_VARIABLE_OP_START:
    388390                /* @todo: nop ? */
    389                     *pu32 = pThis->OperationVarOp.u32Status;
     391                    *pu32 = pThis->NVRAM.u32Status;
    390392                break;
    391393                case EFI_VM_VARIABLE_OP_END:
     
    394396                break;
    395397                case EFI_VM_VARIABLE_OP_GUID:
    396                     *pu32 = pThis->OperationVarOp.uuid.au8[pThis->OperationVarOp.idxOpBuffer];
    397                     pThis->OperationVarOp.idxOpBuffer++;
     398                    *pu32 = pThis->NVRAM.OperationVarOp.uuid.au8[pThis->NVRAM.idxOpBuffer];
     399                    pThis->NVRAM.idxOpBuffer++;
    398400                break;
    399401                case EFI_VM_VARIABLE_OP_ATTRIBUTE:
    400                     *pu32 = pThis->OperationVarOp.u32Attribute;
     402                    *pu32 = pThis->NVRAM.OperationVarOp.u32Attribute;
    401403                break;
    402404                case EFI_VM_VARIABLE_OP_NAME:
    403                     *pu32 = pThis->OperationVarOp.szVariableName[pThis->OperationVarOp.idxOpBuffer];
    404                     pThis->OperationVarOp.idxOpBuffer++;
     405                    *pu32 = pThis->NVRAM.OperationVarOp.szVariableName[pThis->NVRAM.idxOpBuffer];
     406                    pThis->NVRAM.idxOpBuffer++;
    405407                break;
    406408                case EFI_VM_VARIABLE_OP_NAME_LENGTH:
    407                     *pu32 = pThis->OperationVarOp.cbVariableName;
     409                    *pu32 = pThis->NVRAM.OperationVarOp.cbVariableName;
    408410                break;
    409411                case EFI_VM_VARIABLE_OP_VALUE:
    410                     //LogFlowFunc(("OperationVarOp:idxOpBuffer:%d\n", pThis->OperationVarOp.idxOpBuffer));
    411                     *pu32 = pThis->OperationVarOp.au8Value[pThis->OperationVarOp.idxOpBuffer];
    412                     pThis->OperationVarOp.idxOpBuffer++;
     412                    *pu32 = pThis->NVRAM.OperationVarOp.au8Value[pThis->NVRAM.idxOpBuffer];
     413                    pThis->NVRAM.idxOpBuffer++;
    413414                break;
    414415                case EFI_VM_VARIABLE_OP_VALUE_LENGTH:
    415                     LogFlowFunc(("cbValue: %d\n", pThis->OperationVarOp.cbValue));
    416                     *pu32 = pThis->OperationVarOp.cbValue;
     416                    *pu32 = pThis->NVRAM.OperationVarOp.cbValue;
    417417                break;
    418418                default:
    419419                break;
    420420            }
    421             //*pu32 = pThis->OperationVarOp.u32Status;
    422421            return VINF_SUCCESS;
    423422        case EFI_VARIABLE_PARAM:
     
    564563                break;
    565564            }
    566             pThis->OperationVarOp.idxOpBuffer = 0;
    567             pThis->OperationVarOp.enmOp = (EFIVAROP)u32;
     565            pThis->NVRAM.idxOpBuffer = 0;
     566            pThis->NVRAM.enmOp = (EFIVAROP)u32;
    568567        }
    569568        break;
    570569        case EFI_VARIABLE_PARAM:
    571570        {
    572             switch (pThis->OperationVarOp.enmOp)
     571            switch (pThis->NVRAM.enmOp)
    573572            {
    574573                case EFI_VM_VARIABLE_OP_START:
    575574                {
    576                     pThis->OperationVarOp.u32Status = EFI_VARIABLE_OP_STATUS_BSY;
     575                    pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_BSY;
    577576                    switch (u32)
    578577                    {
     
    580579                        {
    581580                            LogRel(("EFI: variable lookup %RTuuid, %s\n",
    582                                     &pThis->OperationVarOp.uuid,
    583                                     pThis->OperationVarOp.szVariableName));
    584                             pThis->OperationVarOp.u32Status = EFI_VARIABLE_OP_STATUS_BSY;
     581                                    &pThis->NVRAM.OperationVarOp.uuid,
     582                                    pThis->NVRAM.OperationVarOp.szVariableName));
     583                            pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_BSY;
    585584                            PEFIVAR pEfiVar = NULL;
    586                             memset(pThis->OperationVarOp.au8Value, 0, 1024);
     585                            memset(pThis->NVRAM.OperationVarOp.au8Value, 0, 1024);
    587586                            int nvramRc = nvramLookupVariableByUuidAndName(
    588587                                                pThis,
    589                                                 pThis->OperationVarOp.szVariableName,
    590                                                 &pThis->OperationVarOp.uuid,
     588                                                pThis->NVRAM.OperationVarOp.szVariableName,
     589                                                &pThis->NVRAM.OperationVarOp.uuid,
    591590                                                &pEfiVar);
    592591                            if (RT_SUCCESS(nvramRc))
    593592                            {
    594                                 pThis->OperationVarOp.u32Attribute = pEfiVar->u32Attribute;
    595                                 pThis->OperationVarOp.cbVariableName = pEfiVar->cbVariableName;
    596                                 pThis->OperationVarOp.cbValue = pEfiVar->cbValue;
    597                                 memcpy(pThis->OperationVarOp.au8Value,
     593                                pThis->NVRAM.OperationVarOp.u32Attribute = pEfiVar->u32Attribute;
     594                                pThis->NVRAM.OperationVarOp.cbVariableName = pEfiVar->cbVariableName;
     595                                pThis->NVRAM.OperationVarOp.cbValue = pEfiVar->cbValue;
     596                                memcpy(pThis->NVRAM.OperationVarOp.au8Value,
    598597                                       pEfiVar->au8Value, pEfiVar->cbValue);
    599                                 pThis->OperationVarOp.u32Status = EFI_VARIABLE_OP_STATUS_OK;
    600                                 pThis->pCurrentVarOp = pEfiVar;
     598                                pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_OK;
     599                                pThis->NVRAM.pCurrentVarOp = pEfiVar;
    601600                                LogFlowFunc(("OperationVar: au8Value:%.*Rhxs\n",
    602                                               pThis->OperationVarOp.cbValue,
    603                                               pThis->OperationVarOp.au8Value));
     601                                              pThis->NVRAM.OperationVarOp.cbValue,
     602                                              pThis->NVRAM.OperationVarOp.au8Value));
    604603                            }
    605604                            else
    606                                 pThis->OperationVarOp.u32Status = EFI_VARIABLE_OP_STATUS_NOT_FOUND;
     605                                pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_NOT_FOUND;
    607606                        }
    608607                        break;
    609608                        case EFI_VARIABLE_OP_ADD:
    610609                        {
    611                             LogRel(("EFI: variable add %RTuuid, %s\n", &pThis->OperationVarOp.uuid, pThis->OperationVarOp.szVariableName));
     610                            LogRel(("EFI: variable add %RTuuid, %s\n", &pThis->NVRAM.OperationVarOp.uuid, pThis->NVRAM.OperationVarOp.szVariableName));
    612611                            PEFIVAR pEfiVar = NULL;
    613612                            LogFlowFunc(("OperationVar: au8Value:%.*Rhxs\n",
    614                                           pThis->OperationVarOp.cbValue,
    615                                           pThis->OperationVarOp.au8Value));
     613                                          pThis->NVRAM.OperationVarOp.cbValue,
     614                                          pThis->NVRAM.OperationVarOp.au8Value));
    616615                            int nvramRc = nvramLookupVariableByUuidAndName(
    617616                                                pThis,
    618                                                 pThis->OperationVarOp.szVariableName,
    619                                                 &pThis->OperationVarOp.uuid,
     617                                                pThis->NVRAM.OperationVarOp.szVariableName,
     618                                                &pThis->NVRAM.OperationVarOp.uuid,
    620619                                                &pEfiVar);
    621620                            if (RT_SUCCESS(nvramRc))
     
    626625                                             pEfiVar->cbValue,
    627626                                             pEfiVar->au8Value));
    628                                 if (pThis->OperationVarOp.cbValue == 0)
     627                                if (pThis->NVRAM.OperationVarOp.cbValue == 0)
    629628                                {
    630629                                    /* delete */
    631630                                    RTListNodeRemove(&pEfiVar->List);
    632631                                    RTMemFree(pEfiVar);
    633                                     pThis->OperationVarOp.u32Status = EFI_VARIABLE_OP_STATUS_OK;
     632                                    pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_OK;
    634633                                }
    635634                                else
    636635                                {
    637636                                    /* update */
    638                                     pEfiVar->cbValue = pThis->OperationVarOp.cbValue;
    639                                     memcpy(pEfiVar->au8Value, pThis->OperationVarOp.au8Value, pEfiVar->cbValue);
    640                                     pThis->OperationVarOp.u32Status = EFI_VARIABLE_OP_STATUS_OK;
     637                                    pEfiVar->cbValue = pThis->NVRAM.OperationVarOp.cbValue;
     638                                    memcpy(pEfiVar->au8Value, pThis->NVRAM.OperationVarOp.au8Value, pEfiVar->cbValue);
     639                                    pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_OK;
    641640                                }
    642641                            }
    643642                            else
    644643                            {
    645                                 if (pThis->OperationVarOp.cbValue != 0)
     644                                if (pThis->NVRAM.OperationVarOp.cbValue != 0)
    646645                                {
    647646                                    pEfiVar = (PEFIVAR)RTMemAllocZ(sizeof(EFIVAR));
    648647                                    if (!pEfiVar)
    649648                                    {
    650                                         pThis->OperationVarOp.u32Status = EFI_VARIABLE_OP_STATUS_ERROR;
     649                                        pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_ERROR;
    651650                                        break;
    652651                                    }
     
    654653                                else
    655654                                {
    656                                     pThis->OperationVarOp.u32Status = EFI_VARIABLE_OP_STATUS_OK;
     655                                    pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_OK;
    657656                                    break;
    658657                                }
    659658
    660                                 memcpy(pEfiVar, &pThis->OperationVarOp, sizeof(EFIVAR));
     659                                memcpy(pEfiVar, &pThis->NVRAM.OperationVarOp, sizeof(EFIVAR));
    661660                                RTListInit(&pEfiVar->List);
    662                                 RTListAppend(&pThis->NVRAMVariableList, &pEfiVar->List);
    663                                 pThis->OperationVarOp.u32Status = EFI_VARIABLE_OP_STATUS_OK;
     661                                RTListAppend(&pThis->NVRAM.NVRAMVariableList, &pEfiVar->List);
     662                                pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_OK;
    664663                            }
    665664                        }
     
    667666                        case EFI_VARIABLE_OP_QUERY_NEXT:
    668667                        {
    669                             PEFIVAR pEfiVar = RTListNodeGetNext(&pThis->pCurrentVarOp->List, EFIVAR, List);
     668                            PEFIVAR pEfiVar = RTListNodeGetNext(&pThis->NVRAM.pCurrentVarOp->List, EFIVAR, List);
    670669                            if (pEfiVar)
    671670                            {
    672                                 memcpy(&pThis->OperationVarOp, pEfiVar, sizeof(EFIVAR));
    673                                 pThis->OperationVarOp.u32Status = EFI_VARIABLE_OP_STATUS_OK;
     671                                memcpy(&pThis->NVRAM.OperationVarOp, pEfiVar, sizeof(EFIVAR));
     672                                pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_OK;
    674673                            }
    675674                            else
    676                                 pThis->OperationVarOp.u32Status = EFI_VARIABLE_OP_STATUS_NOT_FOUND;
     675                                pThis->NVRAM.u32Status = EFI_VARIABLE_OP_STATUS_NOT_FOUND;
    677676                        }
    678677                        break;
     
    687686                break;
    688687                case EFI_VM_VARIABLE_OP_GUID:
    689                     pThis->OperationVarOp.uuid.au8[pThis->OperationVarOp.idxOpBuffer] = (uint8_t)u32;
    690                     pThis->OperationVarOp.idxOpBuffer++;
     688                    pThis->NVRAM.OperationVarOp.uuid.au8[pThis->NVRAM.idxOpBuffer] = (uint8_t)u32;
     689                    pThis->NVRAM.idxOpBuffer++;
    691690                break;
    692691                case EFI_VM_VARIABLE_OP_ATTRIBUTE:
    693                     pThis->OperationVarOp.u32Attribute = u32;
     692                    pThis->NVRAM.OperationVarOp.u32Attribute = u32;
    694693                break;
    695694                case EFI_VM_VARIABLE_OP_NAME:
    696                     pThis->OperationVarOp.szVariableName[pThis->OperationVarOp.idxOpBuffer] = (uint8_t)u32;
    697                     pThis->OperationVarOp.idxOpBuffer++;
     695                    pThis->NVRAM.OperationVarOp.szVariableName[pThis->NVRAM.idxOpBuffer] = (uint8_t)u32;
     696                    pThis->NVRAM.idxOpBuffer++;
    698697                break;
    699698                case EFI_VM_VARIABLE_OP_NAME_LENGTH:
    700                     pThis->OperationVarOp.cbVariableName = u32;
    701                     memset(pThis->OperationVarOp.szVariableName, 0, 1024);
     699                    pThis->NVRAM.OperationVarOp.cbVariableName = u32;
     700                    memset(pThis->NVRAM.OperationVarOp.szVariableName, 0, 1024);
    702701                break;
    703702                case EFI_VM_VARIABLE_OP_VALUE:
    704                     pThis->OperationVarOp.au8Value[pThis->OperationVarOp.idxOpBuffer] = (uint8_t)u32;
    705                     pThis->OperationVarOp.idxOpBuffer++;
     703                    pThis->NVRAM.OperationVarOp.au8Value[pThis->NVRAM.idxOpBuffer] = (uint8_t)u32;
     704                    pThis->NVRAM.idxOpBuffer++;
    706705                break;
    707706                case EFI_VM_VARIABLE_OP_VALUE_LENGTH:
    708                     pThis->OperationVarOp.cbValue = u32;
    709                     memset(pThis->OperationVarOp.au8Value, 0, 1024);
     707                    pThis->NVRAM.OperationVarOp.cbValue = u32;
     708                    memset(pThis->NVRAM.OperationVarOp.au8Value, 0, 1024);
    710709                break;
    711710                default:
     
    825824    nvramStore(pThis);
    826825    PEFIVAR pEfiVar = NULL;
    827     while (!RTListIsEmpty(&pThis->NVRAMVariableList))
    828     {
    829         pEfiVar = RTListNodeGetNext(&pThis->NVRAMVariableList, EFIVAR, List);
     826    while (!RTListIsEmpty(&pThis->NVRAM.NVRAMVariableList))
     827    {
     828        pEfiVar = RTListNodeGetNext(&pThis->NVRAM.NVRAMVariableList, EFIVAR, List);
    830829        RTListNodeRemove(&pEfiVar->List);
    831830        RTMemFree(pEfiVar);
     
    11561155    uuid.Gen.u16TimeHiAndVersion = RT_H2BE_U16(uuid.Gen.u16TimeHiAndVersion);
    11571156    memcpy(&pThis->aUuid, &uuid, sizeof pThis->aUuid);
    1158     RTListInit((PRTLISTNODE)&pThis->NVRAMVariableList);
     1157    RTListInit((PRTLISTNODE)&pThis->NVRAM.NVRAMVariableList);
    11591158
    11601159
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