summaryrefslogtreecommitdiff
path: root/DuetPkg/FSVariable/MemStorage.c
diff options
context:
space:
mode:
authorklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>2008-04-18 03:09:54 +0000
committerklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>2008-04-18 03:09:54 +0000
commit9071550e8697ed9df3d24b369bd30e3f0e190d1f (patch)
treeae93a60e5311a6864330e72daee092255a2e64fb /DuetPkg/FSVariable/MemStorage.c
parent25ab7ab110193a0b5fc468fd3839acb8ae4d93df (diff)
downloadedk2-platforms-9071550e8697ed9df3d24b369bd30e3f0e190d1f.tar.xz
Add missing module for duet package.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5088 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'DuetPkg/FSVariable/MemStorage.c')
-rw-r--r--DuetPkg/FSVariable/MemStorage.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/DuetPkg/FSVariable/MemStorage.c b/DuetPkg/FSVariable/MemStorage.c
new file mode 100644
index 0000000000..ed72b898f0
--- /dev/null
+++ b/DuetPkg/FSVariable/MemStorage.c
@@ -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;
+}