VirtualBox

Changeset 43131 in vbox for trunk/src/VBox/Devices/EFI


Ignore:
Timestamp:
Aug 31, 2012 11:34:49 AM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
80500
Message:

EFI: permanent NVRAM storage.

File:
1 edited

Legend:

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

    r43021 r43131  
    2828#include <VBox/param.h>
    2929#include <VBox/vmm/dbgf.h>
     30#include <VBox/vmm/pdmnvram.h>
    3031
    3132#include <iprt/asm.h>
     
    147148    RTLISTANCHOR    NVRAMVariableList;
    148149    PEFIVAR         pCurrentVarOp;
     150    struct {
     151        PPDMIBASE    pDrvBase;
     152        PDMIBASE     IBase;
     153        PPDMINVRAM   pNvramDown;
     154    } Lun0;
    149155} DEVEFI;
    150156typedef DEVEFI *PDEVEFI;
     
    186192    return rc;
    187193}
     194
     195static int nvramLoad(PDEVEFI pThis)
     196{
     197    int rc = VINF_SUCCESS;
     198    PEFIVAR pEfiVar = NULL;
     199    int idxValue = 0;
     200    while(idxValue < 100)
     201    {
     202        pEfiVar = (PEFIVAR)RTMemAllocZ(sizeof(EFIVAR));
     203        if (!pEfiVar)
     204        {
     205            LogRel(("EFI: Can't allocate space for stored EFI variable\n"));
     206            return VERR_NO_MEMORY;
     207        }
     208        pEfiVar->cbVariableName = 512;
     209        pEfiVar->cbValue = 1024;
     210        rc = pThis->Lun0.pNvramDown->pfnLoadNvramValue(pThis->Lun0.pNvramDown,
     211                                                       idxValue,
     212                                                       &pEfiVar->uuid,
     213                                                       pEfiVar->szVariableName,
     214                                                       (size_t *)&pEfiVar->cbVariableName,
     215                                                       pEfiVar->au8Value,
     216                                                       (size_t *)&pEfiVar->cbValue);
     217        idxValue++;
     218        if (RT_FAILURE(rc))
     219        {
     220            RTMemFree(pEfiVar);
     221            break;
     222        }
     223        RTListAppend((PRTLISTNODE)&pThis->NVRAMVariableList, &pEfiVar->List);
     224    }
     225    if (   RT_FAILURE(rc)
     226        && rc == VERR_NOT_FOUND)
     227        rc  = VINF_SUCCESS;
     228    AssertRCReturn(rc, rc);
     229    return rc;
     230}
     231
     232static int nvramStore(PDEVEFI pThis)
     233{
     234    int rc = VINF_SUCCESS;
     235    PEFIVAR pEfiVar = NULL;
     236    int idxVar = 0;
     237    pThis->Lun0.pNvramDown->pfnFlushNvramStorage(pThis->Lun0.pNvramDown);
     238
     239    RTListForEach((PRTLISTNODE)&pThis->NVRAMVariableList, pEfiVar, EFIVAR, List)
     240    {
     241        pThis->Lun0.pNvramDown->pfnStoreNvramValue(pThis->Lun0.pNvramDown,
     242                                                   idxVar,
     243                                                   &pEfiVar->uuid,
     244                                                   pEfiVar->szVariableName,
     245                                                   pEfiVar->cbVariableName,
     246                                                   pEfiVar->au8Value,
     247                                                   pEfiVar->cbValue);
     248        idxVar++;
     249    }
     250    return VINF_SUCCESS;
     251}
     252
    188253static uint32_t efiInfoSize(PDEVEFI pThis)
    189254{
     
    758823{
    759824    PDEVEFI  pThis = PDMINS_2_DATA(pDevIns, PDEVEFI);
     825    nvramStore(pThis);
     826    PEFIVAR pEfiVar = NULL;
     827    while (!RTListIsEmpty(&pThis->NVRAMVariableList))
     828    {
     829        pEfiVar = RTListNodeGetNext(&pThis->NVRAMVariableList, EFIVAR, List);
     830        RTListNodeRemove(&pEfiVar->List);
     831        RTMemFree(pEfiVar);
     832    }
    760833
    761834    /*
     
    9901063
    9911064/**
     1065 * @copydoc(PDMIBASE::pfnQueryInterface)
     1066 */
     1067static DECLCALLBACK(void *) devEfi_pfnQueryInterface(PPDMIBASE pInterface, const char *pszIID)
     1068{
     1069    LogFlowFunc(("ENTER: pIBase: %p, pszIID:%p\n", __FUNCTION__, pInterface, pszIID));
     1070    PDEVEFI  pThis = RT_FROM_MEMBER(pInterface, DEVEFI, Lun0.IBase);
     1071
     1072    PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pThis->Lun0.IBase);
     1073    return NULL;
     1074}
     1075
     1076/**
    9921077 * @interface_method_impl{PDMDEVREG,pfnConstruct}
    9931078 */
     
    10411126                              "GopMode\0"
    10421127                              "UgaHorizontalResolution\0"
    1043                               "UgaVerticalResolution\0"
    1044                               ))
     1128                              "UgaVerticalResolution\0"))
    10451129        return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
    10461130                                N_("Configuration error: Invalid config value(s) for the EFI device"));
     
    10731157    memcpy(&pThis->aUuid, &uuid, sizeof pThis->aUuid);
    10741158    RTListInit((PRTLISTNODE)&pThis->NVRAMVariableList);
    1075     //pThis->pCurrentVarOp = RTListGetFirst((PRTLISTNODE)&pThis->NVRAMVariableList, List);
    10761159
    10771160
     
    11091192        pThis->pszEfiRomFile = NULL;
    11101193    }
     1194
     1195    /* NVRAM processing */
     1196    pThis->Lun0.IBase.pfnQueryInterface = devEfi_pfnQueryInterface;
     1197    rc = PDMDevHlpDriverAttach(pDevIns, 0, &pThis->Lun0.IBase, &pThis->Lun0.pDrvBase, "NvramStorage");
     1198    if (RT_FAILURE(rc))
     1199        return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS, N_("Can't attach Nvram Storage driver"));
     1200
     1201    pThis->Lun0.pNvramDown = (PPDMINVRAM)pThis->Lun0.pDrvBase->pfnQueryInterface(pThis->Lun0.pDrvBase, PDMINVRAM_IID);
     1202    AssertPtrReturn(pThis->Lun0.pNvramDown, VERR_PDM_MISSING_INTERFACE_BELOW);
    11111203
    11121204    /*
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