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