Add missing module for duet package.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5088 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
klu2
2008-04-18 03:09:54 +00:00
parent 25ab7ab110
commit 9071550e86
29 changed files with 7005 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,26 @@
/*++
Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
FSVariable.dxs
Abstract:
Dependency expression source file.
--*/
#include "EfiDepex.h"
#include EFI_ARCH_PROTOCOL_DEFINITION (StatusCode)
DEPENDENCY_START
EFI_STATUS_CODE_RUNTIME_PROTOCOL_GUID
DEPENDENCY_END

View File

@@ -0,0 +1,162 @@
/*++
Copyright (c) 2006 - 2007, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
FSVariable.h
Abstract:
--*/
#ifndef _FS_VARIABLE_H
#define _FS_VARIABLE_H
//
// Statements that include other header files
//
#include <PiDxe.h>
#include <Library/BaseLib.h>
#include <Library/PcdLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeLib.h>
#include <Library/DebugLib.h>
#include <Library/UefiLib.h>
#include <Library/HobLib.h>
#include <Library/DxeServicesTableLib.h>
#include <Library/DevicePathLib.h>
#include <Guid/HobList.h>
#include <Guid/FlashMapHob.h>
#include <Protocol/Variable.h>
#include <Protocol/VariableWrite.h>
#include <Protocol/SimpleFileSystem.h>
#include <Protocol/BlockIo.h>
#include "EfiFlashMap.h"
#include "VariableFormat.h"
#include "VariableStorage.h"
#define VOLATILE_VARIABLE_STORE_SIZE (64 * 1024)
#define VARIABLE_SCRATCH_SIZE (4 * 1024)
#define VARIABLE_RECLAIM_THRESHOLD (1024)
//
// Define GET_PAD_SIZE to optimize compiler
//
#if ((ALIGNMENT == 0) || (ALIGNMENT == 1))
#define GET_PAD_SIZE(a) (0)
#else
#define GET_PAD_SIZE(a) (((~a) + 1) & (ALIGNMENT - 1))
#endif
#define GET_VARIABLE_NAME_PTR(a) (CHAR16 *) ((UINTN) (a) + sizeof (VARIABLE_HEADER))
typedef enum {
Physical,
Virtual
} VARIABLE_POINTER_TYPE;
typedef enum {
NonVolatile,
Volatile,
MaxType
} VARIABLE_STORAGE_TYPE;
typedef struct {
VARIABLE_HEADER *CurrPtr;
VARIABLE_HEADER *EndPtr;
VARIABLE_HEADER *StartPtr;
VARIABLE_STORAGE_TYPE Type;
} VARIABLE_POINTER_TRACK;
#define VARIABLE_MEMBER_OFFSET(Member, StartOffset) \
( sizeof (VARIABLE_STORE_HEADER) + (StartOffset) + \
(UINTN) ((UINT8 *) &((VARIABLE_HEADER*) 0)->Member - (UINT8 *) &((VARIABLE_HEADER*) 0)->StartId) \
)
typedef struct {
EFI_EVENT_NOTIFY GoVirtualChildEvent[MaxType];
VARIABLE_STORAGE *VariableStore[MaxType]; // Instance of VariableStorage
VOID *VariableBase[MaxType]; // Start address of variable storage
UINTN LastVariableOffset[MaxType]; // The position to write new variable to (index from VariableBase)
VOID *Scratch; // Buffer used during reclaim
} VARIABLE_GLOBAL;
//
// Functions
//
EFI_STATUS
EFIAPI
VariableServiceInitialize (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
;
VOID
EFIAPI
VariableClassAddressChangeEvent (
IN EFI_EVENT Event,
IN VOID *Context
)
;
EFI_STATUS
EFIAPI
GetVariable (
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
OUT UINT32 *Attributes OPTIONAL,
IN OUT UINTN *DataSize,
OUT VOID *Data
)
;
EFI_STATUS
EFIAPI
GetNextVariableName (
IN OUT UINTN *VariableNameSize,
IN OUT CHAR16 *VariableName,
IN OUT EFI_GUID *VendorGuid
)
;
EFI_STATUS
EFIAPI
SetVariable (
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN UINT32 Attributes,
IN UINTN DataSize,
IN VOID *Data
)
;
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
EFI_STATUS
EFIAPI
QueryVariableInfo (
IN UINT32 Attributes,
OUT UINT64 *MaximumVariableStorageSize,
OUT UINT64 *RemainingVariableStorageSize,
OUT UINT64 *MaximumVariableSize
)
;
#endif // EFI_SPECIFICATION_VERSION >= 0x00020000
#endif

View File

@@ -0,0 +1,69 @@
#/*++
#
# Copyright (c) 2006 - 2007, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
# Module Name:
#
# FSVariable.inf
#
# Abstract:
#
# Component description file for variable module
#
#--*/
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = FSVariable
FILE_GUID = A36495C1-C205-414e-B71F-4BE3476D699C
MODULE_TYPE = DXE_RUNTIME_DRIVER
VERSION_STRING = 1.0
EDK_RELEASE_VERSION = 0x00020000
EFI_SPECIFICATION_VERSION = 0x00020000
ENTRY_POINT = VariableServiceInitialize
[Packages]
MdePkg/MdePkg.dec
DuetPkg/DuetPkg.dec
MdeModulePkg/MdeModulePkg.dec
[Sources.common]
FSVariable.h
VariableStorage.h
FSVariable.c
FileStorage.c
MemStorage.c
[LibraryClasses.common]
PcdLib
BaseMemoryLib
BaseLib
UefiBootServicesTableLib
UefiRuntimeLib
DebugLib
UefiLib
HobLib
DxeServicesTableLib
DevicePathLib
UefiDriverEntryPoint
[Guids]
gEfiHobListGuid
gEfiFlashMapHobGuid
[Protocols]
gEfiVariableArchProtocolGuid
gEfiVariableWriteArchProtocolGuid
gEfiSimpleFileSystemProtocolGuid
gEfiBlockIoProtocolGuid
[Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize

View File

@@ -0,0 +1,441 @@
/*++
Copyright (c) 2006 - 2007, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
FileStorage.c
Abstract:
handles variable store/reads on file
Revision History
--*/
#include "FSVariable.h"
VOID *mSFSRegistration;
//
// Prototypes
//
STATIC
VOID
EFIAPI
OnVirtualAddressChange (
IN EFI_EVENT Event,
IN VOID *Context
);
STATIC
EFI_STATUS
EFIAPI
FileEraseStore(
IN VARIABLE_STORAGE *This
);
STATIC
EFI_STATUS
EFIAPI
FileWriteStore (
IN VARIABLE_STORAGE *This,
IN UINTN Offset,
IN UINTN BufferSize,
IN VOID *Buffer
);
STATIC
EFI_STATUS
OpenStore (
IN EFI_DEVICE_PATH_PROTOCOL *Device,
IN CHAR16 *FilePathName,
IN UINT64 OpenMode,
OUT EFI_FILE **File
);
//
// Implementation below:
//
STATIC
VOID
FileClose (
IN EFI_FILE *File
)
{
EFI_STATUS Status;
Status = File->Flush (File);
ASSERT_EFI_ERROR (Status);
Status = File->Close (File);
ASSERT_EFI_ERROR (Status);
}
EFI_STATUS
CheckStore (
IN EFI_HANDLE SimpleFileSystemHandle,
IN UINT32 VolumeId,
OUT EFI_DEVICE_PATH_PROTOCOL **Device
)
{
#define BLOCK_SIZE 0x200
#define FAT16_VOLUME_ID_OFFSET 39
#define FAT32_VOLUME_ID_OFFSET 67
EFI_STATUS Status;
EFI_BLOCK_IO_PROTOCOL *BlkIo;
UINT8 BootSector[BLOCK_SIZE];
*Device = NULL;
Status = gBS->HandleProtocol (
SimpleFileSystemHandle,
&gEfiBlockIoProtocolGuid, // BlockIo should be supported if it supports SimpleFileSystem
(VOID*)&BlkIo
);
if (EFI_ERROR (Status)) {
goto ErrHandle;
}
if (!BlkIo->Media->MediaPresent) {
DEBUG ((EFI_D_ERROR, "FileStorage: Media not present!\n"));
Status = EFI_NO_MEDIA;
goto ErrHandle;
}
if (BlkIo->Media->ReadOnly) {
DEBUG ((EFI_D_ERROR, "FileStorage: Media is read-only!\n"));
Status = EFI_ACCESS_DENIED;
goto ErrHandle;
}
Status = BlkIo->ReadBlocks(
BlkIo,
BlkIo->Media->MediaId,
0,
BLOCK_SIZE,
BootSector
);
ASSERT_EFI_ERROR (Status);
if ((*(UINT32 *) &BootSector[FAT16_VOLUME_ID_OFFSET] != VolumeId) &&
(*(UINT32 *) &BootSector[FAT32_VOLUME_ID_OFFSET] != VolumeId)
) {
Status = EFI_NOT_FOUND;
goto ErrHandle;
}
*Device = DuplicateDevicePath (DevicePathFromHandle (SimpleFileSystemHandle));
ASSERT (*Device != NULL);
ErrHandle:
return Status;
}
EFI_STATUS
CheckStoreExists (
IN EFI_DEVICE_PATH_PROTOCOL *Device
)
{
EFI_HANDLE Handle;
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Volume;
EFI_STATUS Status;
Status = gBS->LocateDevicePath (
&gEfiSimpleFileSystemProtocolGuid,
&Device,
&Handle
);
if (EFI_ERROR (Status)) {
return Status;
}
Status = gBS->HandleProtocol (
Handle,
&gEfiSimpleFileSystemProtocolGuid,
&Volume
);
if (EFI_ERROR (Status)) {
return Status;
}
return EFI_SUCCESS;
}
// this routine is still running in BS period, no limitation
// call FileInitStorage(), which load variable content file to memory
// read the store_header, init store_header if it has not been inited (read sth. about format/heathy)
// reclaim space using scratch memory
STATIC
VOID
EFIAPI
OnSimpleFileSystemInstall (
IN EFI_EVENT Event,
IN VOID *Context
)
{
EFI_STATUS Status;
UINTN HandleSize;
EFI_HANDLE Handle;
EFI_DEVICE_PATH_PROTOCOL *Device;
VS_DEV *Dev;
EFI_FILE *File;
UINTN NumBytes;
Dev = (VS_DEV *) Context;
if (VAR_FILE_DEVICEPATH (Dev) != NULL &&
!EFI_ERROR (CheckStoreExists (VAR_FILE_DEVICEPATH (Dev)))
) {
DEBUG ((EFI_D_ERROR, "FileStorage: Already mapped!\n"));
return ;
}
while (TRUE) {
HandleSize = sizeof (EFI_HANDLE);
Status = gBS->LocateHandle (
ByRegisterNotify,
NULL,
mSFSRegistration,
&HandleSize,
&Handle
);
if (EFI_ERROR (Status)) {
return ;
}
Status = CheckStore (Handle, VAR_FILE_VOLUMEID (Dev), &Device);
if (!EFI_ERROR (Status)) {
break;
}
}
VAR_FILE_DEVICEPATH (Dev) = Device;
Status = OpenStore (
VAR_FILE_DEVICEPATH (Dev),
VAR_FILE_FILEPATH (Dev),
EFI_FILE_MODE_WRITE | EFI_FILE_MODE_READ | EFI_FILE_MODE_CREATE,
&File
);
ASSERT_EFI_ERROR (Status);
NumBytes = Dev->Size;
Status = File->Write (File, &NumBytes, VAR_DATA_PTR (Dev));
ASSERT_EFI_ERROR (Status);
FileClose (File);
DEBUG ((EFI_D_ERROR, "FileStorage: Mapped to file!\n"));
}
EFI_STATUS
FileStorageConstructor (
OUT VARIABLE_STORAGE **VarStore,
OUT EFI_EVENT_NOTIFY *GoVirtualEvent,
IN EFI_PHYSICAL_ADDRESS NvStorageBase,
IN UINTN Size,
IN UINT32 VolumeId,
IN CHAR16 *FilePath
)
{
VS_DEV *Dev;
EFI_STATUS Status;
EFI_EVENT Event;
Status = gBS->AllocatePool (EfiRuntimeServicesData, sizeof(VS_DEV), &Dev);
ASSERT_EFI_ERROR (Status);
ZeroMem (Dev, sizeof(VS_DEV));
Dev->Signature = VARIABLE_STORE_SIGNATURE;
Dev->Size = Size;
VAR_DATA_PTR (Dev) = (UINT8 *) (UINTN) NvStorageBase;
VAR_FILE_VOLUMEID (Dev) = VolumeId;
StrCpy (VAR_FILE_FILEPATH (Dev), FilePath);
Dev->VarStore.Erase = FileEraseStore;
Dev->VarStore.Write = FileWriteStore;
DEBUG ((EFI_D_ERROR, "FileStorageConstructor(0x%0x:0x%0x): added!\n", NvStorageBase, Size));
// add notify on SFS's installation.
Status = gBS->CreateEvent (
EFI_EVENT_NOTIFY_SIGNAL,
TPL_CALLBACK,
OnSimpleFileSystemInstall,
Dev,
&Event
);
ASSERT_EFI_ERROR (Status);
Status = gBS->RegisterProtocolNotify (
&gEfiSimpleFileSystemProtocolGuid,
Event,
&mSFSRegistration
);
ASSERT_EFI_ERROR (Status);
*VarStore = &Dev->VarStore;
*GoVirtualEvent = OnVirtualAddressChange;
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
EFIAPI
FileEraseStore(
IN VARIABLE_STORAGE *This
)
{
EFI_STATUS Status;
VS_DEV *Dev;
EFI_FILE *File;
UINTN NumBytes;
Status = EFI_SUCCESS;
Dev = DEV_FROM_THIS(This);
SetMem (VAR_DATA_PTR (Dev), Dev->Size, VAR_DEFAULT_VALUE);
if (!EfiAtRuntime () && VAR_FILE_DEVICEPATH (Dev) != NULL) {
Status = OpenStore (
VAR_FILE_DEVICEPATH (Dev),
VAR_FILE_FILEPATH (Dev),
EFI_FILE_MODE_WRITE | EFI_FILE_MODE_READ,
&File
);
ASSERT_EFI_ERROR (Status);
NumBytes = Dev->Size;
Status = File->Write (File, &NumBytes, VAR_DATA_PTR (Dev));
ASSERT_EFI_ERROR (Status);
FileClose (File);
}
return Status;
}
STATIC
EFI_STATUS
EFIAPI
FileWriteStore (
IN VARIABLE_STORAGE *This,
IN UINTN Offset,
IN UINTN BufferSize,
IN VOID *Buffer
)
{
EFI_STATUS Status;
VS_DEV *Dev;
EFI_FILE *File;
Status = EFI_SUCCESS;
Dev = DEV_FROM_THIS(This);
ASSERT (Buffer != NULL);
ASSERT (Offset + BufferSize <= Dev->Size);
CopyMem (VAR_DATA_PTR (Dev) + Offset, Buffer, BufferSize);
if (!EfiAtRuntime () && VAR_FILE_DEVICEPATH (Dev) != NULL) {
Status = OpenStore (
VAR_FILE_DEVICEPATH (Dev),
VAR_FILE_FILEPATH (Dev),
EFI_FILE_MODE_WRITE | EFI_FILE_MODE_READ,
&File
);
Status = File->SetPosition (File, Offset);
ASSERT_EFI_ERROR (Status);
Status = File->Write (File, &BufferSize, Buffer);
ASSERT_EFI_ERROR (Status);
FileClose (File);
}
return Status;
}
STATIC
VOID
EFIAPI
OnVirtualAddressChange (
IN EFI_EVENT Event,
IN VOID *Context
)
{
VS_DEV *Dev;
Dev = DEV_FROM_THIS (Context);
EfiConvertPointer (0, &VAR_DATA_PTR (Dev));
EfiConvertPointer (0, (VOID **) &Dev->VarStore.Erase);
EfiConvertPointer (0, (VOID **) &Dev->VarStore.Write);
}
STATIC
EFI_STATUS
OpenStore (
IN EFI_DEVICE_PATH_PROTOCOL *Device,
IN CHAR16 *FilePathName,
IN UINT64 OpenMode,
OUT EFI_FILE **File
)
{
EFI_HANDLE Handle;
EFI_FILE_HANDLE Root;
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Volume;
EFI_STATUS Status;
*File = NULL;
Status = gBS->LocateDevicePath (
&gEfiSimpleFileSystemProtocolGuid,
&Device,
&Handle
);
if (EFI_ERROR (Status)) {
return Status;
}
Status = gBS->HandleProtocol (
Handle,
&gEfiSimpleFileSystemProtocolGuid,
&Volume
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Open the root directory of the volume
//
Root = NULL;
Status = Volume->OpenVolume (
Volume,
&Root
);
ASSERT_EFI_ERROR (Status);
ASSERT (Root != NULL);
//
// Open file
//
Status = Root->Open (
Root,
File,
FilePathName,
OpenMode,
0
);
if (EFI_ERROR (Status)) {
*File = NULL;
}
//
// Close the Root directory
//
Root->Close (Root);
return Status;
}

View File

@@ -0,0 +1,135 @@
/*++
Copyright (c) 2006 - 2007, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
MemStorage.c
Abstract:
handles variable store/reads with emulated memory
Revision History
--*/
#include "FSVariable.h"
STATIC
VOID
EFIAPI
OnVirtualAddressChange (
IN EFI_EVENT Event,
IN VOID *Context
);
STATIC
EFI_STATUS
EFIAPI
MemEraseStore(
IN VARIABLE_STORAGE *This
);
STATIC
EFI_STATUS
EFIAPI
MemWriteStore (
IN VARIABLE_STORAGE *This,
IN UINTN Offset,
IN UINTN BufferSize,
IN VOID *Buffer
);
EFI_STATUS
MemStorageConstructor (
OUT VARIABLE_STORAGE **VarStore,
OUT EFI_EVENT_NOTIFY *GoVirtualEvent,
IN UINTN Size
)
{
EFI_STATUS Status;
VS_DEV *Dev;
Status = gBS->AllocatePool (EfiRuntimeServicesData, sizeof(VS_DEV), &Dev);
ASSERT_EFI_ERROR (Status);
ZeroMem (Dev, sizeof(VS_DEV));
Dev->Signature = VARIABLE_STORE_SIGNATURE;
Dev->Size = Size;
Dev->VarStore.Erase = MemEraseStore;
Dev->VarStore.Write = MemWriteStore;
Status = gBS->AllocatePool (EfiRuntimeServicesData, Size, &VAR_DATA_PTR (Dev));
ASSERT_EFI_ERROR (Status);
DEBUG ((EFI_D_ERROR, "VStorage: Size = 0x%x\n", Size));
*VarStore = &Dev->VarStore;
*GoVirtualEvent = OnVirtualAddressChange;
return EFI_SUCCESS;
}
STATIC
VOID
EFIAPI
OnVirtualAddressChange (
IN EFI_EVENT Event,
IN VOID *Context
)
{
VS_DEV *Dev;
Dev = DEV_FROM_THIS (Context);
EfiConvertPointer (0, &VAR_DATA_PTR (Dev));
EfiConvertPointer (0, (VOID**)&Dev->VarStore.Erase);
EfiConvertPointer (0, (VOID**)&Dev->VarStore.Write);
}
STATIC
EFI_STATUS
EFIAPI
MemEraseStore(
IN VARIABLE_STORAGE *This
)
{
VS_DEV *Dev;
Dev = DEV_FROM_THIS(This);
SetMem (VAR_DATA_PTR (Dev), Dev->Size, VAR_DEFAULT_VALUE);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
EFIAPI
MemWriteStore (
IN VARIABLE_STORAGE *This,
IN UINTN Offset,
IN UINTN BufferSize,
IN VOID *UserBuffer
)
{
VS_DEV *Dev;
Dev = DEV_FROM_THIS(This);
ASSERT (Offset + BufferSize < Dev->Size);
// For better performance
if (VAR_DATA_PTR (Dev) + Offset != UserBuffer) {
CopyMem (VAR_DATA_PTR (Dev) + Offset, UserBuffer, BufferSize);
}
return EFI_SUCCESS;
}

View File

@@ -0,0 +1,111 @@
/*++
Copyright (c) 2006 - 2007, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name:
VariableStorage.h
Abstract:
handles variable store/reads with memory and file
Revision History
--*/
#ifndef _VARIABLE_STORAGE_H_
#define _VARIABLE_STORAGE_H_
#define VAR_DEFAULT_VALUE (0xff)
#define VAR_DEFAULT_VALUE_16 EFI_SIGNATURE_16 (VAR_DEFAULT_VALUE, VAR_DEFAULT_VALUE)
#define VAR_DEFAULT_VALUE_32 EFI_SIGNATURE_32 (VAR_DEFAULT_VALUE, VAR_DEFAULT_VALUE, \
VAR_DEFAULT_VALUE, VAR_DEFAULT_VALUE)
typedef struct _VARIABLE_STORAGE VARIABLE_STORAGE;
EFI_STATUS
FileStorageConstructor (
OUT VARIABLE_STORAGE **VarStore,
OUT EFI_EVENT_NOTIFY *GoVirtualEvent,
IN EFI_PHYSICAL_ADDRESS NvStorageBase,
IN UINTN Size,
IN UINT32 VolumeId,
IN CHAR16 *FilePath
);
EFI_STATUS
MemStorageConstructor (
OUT VARIABLE_STORAGE **VarStore,
OUT EFI_EVENT_NOTIFY *GoVirtualEvent,
IN UINTN Size
);
typedef
EFI_STATUS
(EFIAPI *ERASE_STORE) (
IN VARIABLE_STORAGE *This
);
typedef
EFI_STATUS
(EFIAPI *WRITE_STORE) (
IN VARIABLE_STORAGE *This,
IN UINTN Offset,
IN UINTN BufferSize,
IN VOID *Buffer
);
struct _VARIABLE_STORAGE {
//
// Functions to access the storage
//
ERASE_STORE Erase;
WRITE_STORE Write;
};
typedef struct _VS_FILE_INFO {
UINT8 *FileData; // local buffer for reading acceleration
EFI_DEVICE_PATH_PROTOCOL *DevicePath; // device having storage file
UINT32 VolumeId;
CHAR16 FilePath[256];
} VS_FILE_INFO;
typedef struct _VS_MEM_INFO {
UINT8 *MemData;
} VS_MEM_INFO;
typedef struct _VS_DEV {
UINT32 Signature;
VARIABLE_STORAGE VarStore;
UINTN Size;
union {
//
// finally visit FileInfo.FileData or MemInfo.MemData
//
UINT8 *Data;
VS_FILE_INFO FileInfo;
VS_MEM_INFO MemInfo;
} Info;
} VS_DEV;
#define DEV_FROM_THIS(a) CR (a, VS_DEV, VarStore, VARIABLE_STORE_SIGNATURE)
#define VAR_DATA_PTR(a) ((a)->Info.Data)
#define VAR_FILE_DEVICEPATH(a) ((a)->Info.FileInfo.DevicePath)
#define VAR_FILE_VOLUMEID(a) ((a)->Info.FileInfo.VolumeId)
#define VAR_FILE_FILEPATH(a) ((a)->Info.FileInfo.FilePath)
#endif