Changeset 43131 in vbox for trunk/src/VBox/Devices/EFI
- Timestamp:
- Aug 31, 2012 11:34:49 AM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 80500
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/EFI/DevOVMF.cpp
r43021 r43131 28 28 #include <VBox/param.h> 29 29 #include <VBox/vmm/dbgf.h> 30 #include <VBox/vmm/pdmnvram.h> 30 31 31 32 #include <iprt/asm.h> … … 147 148 RTLISTANCHOR NVRAMVariableList; 148 149 PEFIVAR pCurrentVarOp; 150 struct { 151 PPDMIBASE pDrvBase; 152 PDMIBASE IBase; 153 PPDMINVRAM pNvramDown; 154 } Lun0; 149 155 } DEVEFI; 150 156 typedef DEVEFI *PDEVEFI; … … 186 192 return rc; 187 193 } 194 195 static 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 232 static 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 188 253 static uint32_t efiInfoSize(PDEVEFI pThis) 189 254 { … … 758 823 { 759 824 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 } 760 833 761 834 /* … … 990 1063 991 1064 /** 1065 * @copydoc(PDMIBASE::pfnQueryInterface) 1066 */ 1067 static 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 /** 992 1077 * @interface_method_impl{PDMDEVREG,pfnConstruct} 993 1078 */ … … 1041 1126 "GopMode\0" 1042 1127 "UgaHorizontalResolution\0" 1043 "UgaVerticalResolution\0" 1044 )) 1128 "UgaVerticalResolution\0")) 1045 1129 return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES, 1046 1130 N_("Configuration error: Invalid config value(s) for the EFI device")); … … 1073 1157 memcpy(&pThis->aUuid, &uuid, sizeof pThis->aUuid); 1074 1158 RTListInit((PRTLISTNODE)&pThis->NVRAMVariableList); 1075 //pThis->pCurrentVarOp = RTListGetFirst((PRTLISTNODE)&pThis->NVRAMVariableList, List);1076 1159 1077 1160 … … 1109 1192 pThis->pszEfiRomFile = NULL; 1110 1193 } 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); 1111 1203 1112 1204 /*
Note:
See TracChangeset
for help on using the changeset viewer.