]> git.proxmox.com Git - mirror_edk2.git/blob - DuetPkg/FSVariable/MemStorage.c
cb8c864fce21799802b283e9ab1fba7111936051
[mirror_edk2.git] / DuetPkg / FSVariable / MemStorage.c
1 /*++
2
3 Copyright (c) 2006 - 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 MemStorage.c
15
16 Abstract:
17
18 handles variable store/reads with emulated memory
19
20 Revision History
21
22 --*/
23 #include "FSVariable.h"
24
25 VOID
26 EFIAPI
27 OnVirtualAddressChangeMs (
28 IN EFI_EVENT Event,
29 IN VOID *Context
30 );
31
32 EFI_STATUS
33 EFIAPI
34 MemEraseStore(
35 IN VARIABLE_STORAGE *This
36 );
37
38 EFI_STATUS
39 EFIAPI
40 MemWriteStore (
41 IN VARIABLE_STORAGE *This,
42 IN UINTN Offset,
43 IN UINTN BufferSize,
44 IN VOID *Buffer
45 );
46
47 EFI_STATUS
48 MemStorageConstructor (
49 OUT VARIABLE_STORAGE **VarStore,
50 OUT EFI_EVENT_NOTIFY *GoVirtualEvent,
51 IN UINTN Size
52 )
53 {
54 EFI_STATUS Status;
55 VS_DEV *Dev;
56
57 Status = gBS->AllocatePool (EfiRuntimeServicesData, sizeof(VS_DEV), (VOID **) &Dev);
58 ASSERT_EFI_ERROR (Status);
59
60 ZeroMem (Dev, sizeof(VS_DEV));
61
62 Dev->Signature = VARIABLE_STORE_SIGNATURE;
63 Dev->Size = Size;
64
65 Dev->VarStore.Erase = MemEraseStore;
66 Dev->VarStore.Write = MemWriteStore;
67
68 Status = gBS->AllocatePool (EfiRuntimeServicesData, Size, (VOID **) &VAR_DATA_PTR (Dev));
69 ASSERT_EFI_ERROR (Status);
70
71 DEBUG ((EFI_D_ERROR, "VStorage: Size = 0x%x\n", Size));
72
73 *VarStore = &Dev->VarStore;
74 *GoVirtualEvent = OnVirtualAddressChangeMs;
75
76 return EFI_SUCCESS;
77 }
78
79 VOID
80 EFIAPI
81 OnVirtualAddressChangeMs (
82 IN EFI_EVENT Event,
83 IN VOID *Context
84 )
85 {
86 VS_DEV *Dev;
87
88 Dev = DEV_FROM_THIS (Context);
89
90 EfiConvertPointer (0, (VOID **)&VAR_DATA_PTR (Dev));
91 EfiConvertPointer (0, (VOID **)&Dev->VarStore.Erase);
92 EfiConvertPointer (0, (VOID **)&Dev->VarStore.Write);
93 }
94
95 EFI_STATUS
96 EFIAPI
97 MemEraseStore(
98 IN VARIABLE_STORAGE *This
99 )
100 {
101 VS_DEV *Dev;
102
103 Dev = DEV_FROM_THIS(This);
104 SetMem (VAR_DATA_PTR (Dev), Dev->Size, VAR_DEFAULT_VALUE);
105 return EFI_SUCCESS;
106 }
107
108
109 EFI_STATUS
110 EFIAPI
111 MemWriteStore (
112 IN VARIABLE_STORAGE *This,
113 IN UINTN Offset,
114 IN UINTN BufferSize,
115 IN VOID *UserBuffer
116 )
117 {
118 VS_DEV *Dev;
119
120 Dev = DEV_FROM_THIS(This);
121
122 ASSERT (Offset + BufferSize < Dev->Size);
123
124 // For better performance
125 if (VAR_DATA_PTR (Dev) + Offset != UserBuffer) {
126 CopyMem (VAR_DATA_PTR (Dev) + Offset, UserBuffer, BufferSize);
127 }
128 return EFI_SUCCESS;
129 }