8#include <Library/BaseLib.h>
9#include <Library/DebugLib.h>
10#include <Library/MemoryAllocationLib.h>
14#include <Library/UefiBootServicesTableLib.h>
15#include <Library/UefiRuntimeServicesTableLib.h>
19#define BASE64_CHUNK_SIZE (52)
20#define NVRAM_PLIST_MAX_SIZE (BASE_1MB)
36#define OC_NVRAM_STORAGE_VERSION 1
41#define OC_NVRAM_STORAGE_MAP_FIELDS(_, __) \
42 OC_MAP (OC_STRING, OC_ASSOC, _, __)
45#define OC_NVRAM_STORAGE_FIELDS(_, __) \
46 _(UINT32 , Version , , 0 , () ) \
47 _(OC_NVRAM_STORAGE_MAP , Add , , OC_CONSTR (OC_NVRAM_STORAGE_MAP, _, __) , OC_DESTR (OC_NVRAM_STORAGE_MAP))
88 OUT EFI_FILE_PROTOCOL **NvramDir
92 EFI_FILE_PROTOCOL *Root;
103 if (EFI_ERROR (Status)) {
104 return EFI_NOT_FOUND;
111 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
123 IN OC_NVRAM_LEGACY_MAP *LegacyMap,
124 IN BOOLEAN LegacyOverwrite
128 EFI_FILE_PROTOCOL *NvramDir;
132 OC_NVRAM_STORAGE NvramStorage;
134 UINT32 VariableIndex;
136 OC_ASSOC *VariableMap;
137 OC_NVRAM_LEGACY_ENTRY *SchemaEntry;
140 return EFI_ALREADY_STARTED;
143 if ((StorageContext == NULL) || (LegacyMap == NULL)) {
144 return EFI_INVALID_PARAMETER;
151 if (EFI_ERROR (Status)) {
156 if (FileBuffer == NULL) {
160 NvramDir->Close (NvramDir);
161 if (FileBuffer == NULL) {
162 return EFI_NOT_FOUND;
165 OC_NVRAM_STORAGE_CONSTRUCT (&NvramStorage,
sizeof (NvramStorage));
167 FreePool (FileBuffer);
170 OC_NVRAM_STORAGE_DESTRUCT (&NvramStorage,
sizeof (NvramStorage));
171 return EFI_UNSUPPORTED;
175 OC_NVRAM_STORAGE_DESTRUCT (&NvramStorage,
sizeof (NvramStorage));
176 return EFI_UNSUPPORTED;
179 for (GuidIndex = 0; GuidIndex < NvramStorage.Add.Count; ++GuidIndex) {
187 if (EFI_ERROR (Status)) {
191 VariableMap = NvramStorage.Add.Values[GuidIndex];
205 for (VariableIndex = 0; VariableIndex < VariableMap->Count; ++VariableIndex) {
210 VariableMap->Values[VariableIndex]->Size,
218 OC_NVRAM_STORAGE_DESTRUCT (&NvramStorage,
sizeof (NvramStorage));
226 IN EFI_FILE_PROTOCOL *Directory,
227 IN CONST CHAR16 *FileName
233 if (EFI_ERROR (Status)) {
234 if (Status == EFI_NOT_FOUND) {
235 Status = EFI_SUCCESS;
262 SaveContext = Context;
274 Status =
gRT->GetVariable (
281 if (Status == EFI_BUFFER_TOO_SMALL) {
284 SaveContext->
Status = EFI_OUT_OF_RESOURCES;
292 SaveContext->
Status = EFI_OUT_OF_RESOURCES;
296 }
while (Status == EFI_BUFFER_TOO_SMALL);
298 if (EFI_ERROR (Status)) {
299 SaveContext->
Status = Status;
307 if ( ((Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0)
308 || ((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0))
310 DEBUG ((DEBUG_VERBOSE,
"NVRAM %g:%s skipped w/ attributes 0x%X\n", Guid, Name, Attributes));
315 Base64Encode (SaveContext->
DataBuffer, DataSize, NULL, &Base64Size);
319 SaveContext->
Status = EFI_OUT_OF_RESOURCES;
327 SaveContext->
Status = EFI_OUT_OF_RESOURCES;
339 "\t\t\t<key>%s</key>%c"
345 if (EFI_ERROR (Status)) {
346 SaveContext->
Status = Status;
350 for (Base64Pos = 0; Base64Pos < (Base64Size - 1); Base64Pos +=
BASE64_CHUNK_SIZE) {
355 if (EFI_ERROR (Status)) {
356 SaveContext->
Status = Status;
365 if (EFI_ERROR (Status)) {
366 SaveContext->
Status = Status;
374 if (EFI_ERROR (Status)) {
375 SaveContext->
Status = Status;
384 if (EFI_ERROR (Status)) {
385 SaveContext->
Status = Status;
400 EFI_FILE_PROTOCOL *NvramDir;
405 if (EFI_ERROR (Status)) {
409 Context.
Status = EFI_SUCCESS;
414 NvramDir->Close (NvramDir);
415 return EFI_OUT_OF_RESOURCES;
421 NvramDir->Close (NvramDir);
423 return EFI_OUT_OF_RESOURCES;
428 NvramDir->Close (NvramDir);
431 return EFI_OUT_OF_RESOURCES;
436 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
437 "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
438 "<plist version=\"1.0\">\n"
444 if (EFI_ERROR (Status)) {
445 NvramDir->Close (NvramDir);
452 for (GuidIndex = 0; GuidIndex <
mLegacyMap->Count; ++GuidIndex) {
459 if (EFI_ERROR (Status)) {
460 Status = EFI_SUCCESS;
466 "\t\t<key>%g</key>%c"
472 if (EFI_ERROR (Status)) {
478 if (EFI_ERROR (Status)) {
486 if (EFI_ERROR (Status)) {
494 if (!EFI_ERROR (Status)) {
498 "\t<key>Version</key>%c"
499 "\t<integer>%u</integer>%c"
511 if (EFI_ERROR (Status)) {
512 NvramDir->Close (NvramDir);
520 Status = EFI_OUT_OF_RESOURCES;
531 NvramDir->Close (NvramDir);
544 EFI_STATUS AltStatus;
545 EFI_FILE_PROTOCOL *NvramDir;
548 if (EFI_ERROR (Status)) {
555 NvramDir->Close (NvramDir);
557 return EFI_ERROR (Status) ? Status : AltStatus;
574 EFI_FILE_PROTOCOL *NvramDir;
579 if (EFI_ERROR (Status)) {
589 if (FileBuffer == NULL) {
590 NvramDir->Close (NvramDir);
591 return EFI_ALREADY_STARTED;
603 NvramDir->Close (NvramDir);
604 FreePool (FileBuffer);
622 IN EFI_HANDLE ImageHandle,
623 IN EFI_SYSTEM_TABLE *SystemTable
626 return gBS->InstallMultipleProtocolInterfaces (
#define ARRAY_SIZE(Array)
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
VOID * OcReadFileFromDirectory(IN CONST EFI_FILE_PROTOCOL *RootDirectory, IN CONST CHAR16 *FilePath, OUT UINT32 *FileSize OPTIONAL, IN UINT32 MaxFileSize OPTIONAL)
EFI_STATUS OcDeleteFile(IN EFI_FILE_PROTOCOL *Directory, IN CONST CHAR16 *FileName)
EFI_STATUS OcSetFileData(IN EFI_FILE_PROTOCOL *WritableFs OPTIONAL, IN CONST CHAR16 *FileName, IN CONST VOID *Buffer, IN UINT32 Size)
EFI_STATUS OcSafeFileOpen(IN CONST EFI_FILE_PROTOCOL *Directory, OUT EFI_FILE_PROTOCOL **NewHandle, IN CONST CHAR16 *FileName, IN CONST UINT64 OpenMode, IN CONST UINT64 Attributes)
EFI_STATUS OcAsciiStringBufferAppendN(IN OUT OC_ASCII_STRING_BUFFER *Buffer, IN CONST CHAR8 *AppendString, OPTIONAL IN CONST UINTN Length)
EFI_STATUS OcAsciiStringBufferAppend(IN OUT OC_ASCII_STRING_BUFFER *Buffer, IN CONST CHAR8 *AppendString OPTIONAL)
EFI_STATUS EFIAPI OcAsciiStringBufferSPrint(IN OUT OC_ASCII_STRING_BUFFER *Buffer, IN CONST CHAR8 *FormatString,...)
OC_ASCII_STRING_BUFFER * OcAsciiStringBufferInit(VOID)
VOID OcAsciiStringBufferFree(IN OUT OC_ASCII_STRING_BUFFER **StringBuffer)
#define OC_SCHEMA_MAP(Name, ChildSchema)
#define OC_SCHEMA_MAP_IN(Name, Type, Field, ChildSchema)
#define OC_SCHEMA_MDATA(Name)
BOOLEAN ParseSerialized(OUT VOID *Serialized, IN OC_SCHEMA_INFO *RootSchema, IN VOID *PlistBuffer, IN UINT32 PlistSize, IN OUT UINT32 *ErrorCount OPTIONAL)
#define OC_SCHEMA_INTEGER_IN(Name, Type, Field)
#define OC_STRUCTORS(Name, Destructor)
#define OC_MAP_STRUCTORS(Name)
#define OC_BLOB_GET(Blob)
#define OPEN_CORE_NVRAM_ROOT_PATH
enum _OC_PROCESS_VARIABLE_RESULT OC_PROCESS_VARIABLE_RESULT
BOOLEAN OcVariableIsAllowedBySchemaEntry(IN OC_NVRAM_LEGACY_ENTRY *SchemaEntry, IN EFI_GUID *VariableGuid OPTIONAL, IN CONST VOID *VariableName, IN OC_STRING_FORMAT StringFormat)
VOID OcScanVariables(IN OC_PROCESS_VARIABLE ProcessVariable, IN VOID *Context)
VOID OcSetNvramVariable(IN CONST CHAR8 *AsciiVariableName, IN EFI_GUID *VariableGuid, IN UINT32 Attributes, IN UINT32 VariableSize, IN VOID *VariableData, IN OC_NVRAM_LEGACY_ENTRY *SchemaEntry OPTIONAL, IN BOOLEAN Overwrite)
EFI_STATUS OcProcessVariableGuid(IN CONST CHAR8 *AsciiVariableGuid, OUT GUID *VariableGuid, IN OC_NVRAM_LEGACY_MAP *Schema OPTIONAL, OUT OC_NVRAM_LEGACY_ENTRY **SchemaEntry OPTIONAL)
#define OPEN_CORE_NVRAM_NV_ATTR
#define OPEN_CORE_NVRAM_FILENAME
@ OcProcessVariableContinue
#define OPEN_CORE_NVRAM_FALLBACK_FILENAME
#define OPEN_CORE_NVRAM_USED_FILENAME
EFI_GUID gOcVariableRuntimeProtocolGuid
#define OC_VARIABLE_RUNTIME_PROTOCOL_REVISION
STATIC EFI_STATUS EFIAPI LoadNvram(IN OC_STORAGE_CONTEXT *StorageContext, IN OC_NVRAM_LEGACY_MAP *LegacyMap, IN BOOLEAN LegacyOverwrite)
#define OC_NVRAM_STORAGE_VERSION
#define BASE64_CHUNK_SIZE
STATIC EFI_STATUS EFIAPI SwitchToFallback(VOID)
STATIC OC_SCHEMA mNvramStorageEntrySchema
STATIC OC_SCHEMA mNvramStorageAddSchema
STATIC OC_VARIABLE_RUNTIME_PROTOCOL mOcVariableRuntimeProtocol
STATIC EFI_STATUS EFIAPI ResetNvram(VOID)
STATIC EFI_STATUS DeleteFile(IN EFI_FILE_PROTOCOL *Directory, IN CONST CHAR16 *FileName)
STATIC EFI_STATUS LocateNvramDir(OUT EFI_FILE_PROTOCOL **NvramDir)
STATIC OC_PROCESS_VARIABLE_RESULT EFIAPI SerializeSectionVariables(IN EFI_GUID *Guid, IN CHAR16 *Name, IN VOID *Context)
STATIC EFI_STATUS EFIAPI SaveNvram(VOID)
STATIC OC_SCHEMA_INFO mNvramStorageRootSchema
STATIC OC_NVRAM_LEGACY_MAP * mLegacyMap
#define NVRAM_PLIST_MAX_SIZE
EFI_STATUS EFIAPI OcVariableRuntimeLibConstructor(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
STATIC OC_STORAGE_CONTEXT * mStorageContext
STATIC OC_SCHEMA mNvramStorageNodesSchema[]
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
EFI_RUNTIME_SERVICES * gRT
OC_NVRAM_LEGACY_ENTRY * SchemaEntry
OC_ASCII_STRING_BUFFER * StringBuffer
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL * FileSystem