]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/MemImage.c
add comments to function declarations and definitions and updated to match coding...
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / HexEdit / MemImage.c
CommitLineData
632820d1 1/** @file\r
2 Functions to deal with Mem buffer\r
3 \r
4 Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved. <BR>\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "HexEditor.h"\r
16\r
17extern EFI_HANDLE HImageHandleBackup;\r
18\r
19extern HEFI_EDITOR_BUFFER_IMAGE HBufferImage;\r
20\r
21extern BOOLEAN HBufferImageNeedRefresh;\r
22extern BOOLEAN HBufferImageOnlyLineNeedRefresh;\r
23extern BOOLEAN HBufferImageMouseNeedRefresh;\r
24\r
25extern HEFI_EDITOR_GLOBAL_EDITOR HMainEditor;\r
26\r
27HEFI_EDITOR_MEM_IMAGE HMemImage;\r
28HEFI_EDITOR_MEM_IMAGE HMemImageBackupVar;\r
29\r
30EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL DummyPciRootBridgeIo;\r
31\r
32//\r
33// for basic initialization of HDiskImage\r
34//\r
35HEFI_EDITOR_MEM_IMAGE HMemImageConst = {\r
36 NULL,\r
37 0,\r
38 0\r
39};\r
40\r
a1d4bfcc 41/**\r
42 Empty function. always returns the same.\r
43\r
44 @param[in] This Ignored.\r
45 @param[in] Width Ignored.\r
46 @param[in] Address Ignored.\r
47 @param[in] Count Ignored.\r
48 @param[in,out] Buffer Ignored.\r
49\r
50 @retval EFI_UNSUPPORTED.\r
51**/\r
632820d1 52EFI_STATUS\r
53DummyMemRead (\r
54 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * This,\r
55 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
56 IN UINT64 Address,\r
57 IN UINTN Count,\r
58 IN OUT VOID *Buffer\r
a1d4bfcc 59 )\r
60{\r
61 return EFI_UNSUPPORTED;\r
62}\r
63\r
64/**\r
65 Empty function. always returns the same.\r
66\r
67 @param[in] This Ignored.\r
68 @param[in] Width Ignored.\r
69 @param[in] Address Ignored.\r
70 @param[in] Count Ignored.\r
71 @param[in,out] Buffer Ignored.\r
632820d1 72\r
a1d4bfcc 73 @retval EFI_UNSUPPORTED.\r
74**/\r
632820d1 75EFI_STATUS\r
76DummyMemWrite (\r
77 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * This,\r
78 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
79 IN UINT64 Address,\r
80 IN UINTN Count,\r
81 IN OUT VOID *Buffer\r
a1d4bfcc 82 )\r
83{\r
84 return EFI_UNSUPPORTED;\r
85}\r
86\r
87/**\r
88 Initialization function for HDiskImage.\r
632820d1 89\r
a1d4bfcc 90 @retval EFI_SUCCESS The operation was successful.\r
91 @retval EFI_LOAD_ERROR A load error occured.\r
92**/\r
632820d1 93EFI_STATUS\r
94HMemImageInit (\r
95 VOID\r
96 )\r
632820d1 97{\r
98 EFI_STATUS Status;\r
99\r
100 //\r
101 // basically initialize the HMemImage\r
102 //\r
103 CopyMem (&HMemImage, &HMemImageConst, sizeof (HMemImage));\r
104\r
105 Status = gBS->LocateProtocol (\r
106 &gEfiPciRootBridgeIoProtocolGuid,\r
107 NULL,\r
108 (VOID**)&HMemImage.IoFncs\r
109 );\r
110 if (Status == EFI_NOT_FOUND) {\r
111 //\r
112 // For NT32, no EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL is available\r
113 // Use Dummy PciRootBridgeIo for memory access\r
114 //\r
115 ZeroMem (&DummyPciRootBridgeIo, sizeof (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL));\r
116 DummyPciRootBridgeIo.Mem.Read = DummyMemRead;\r
117 DummyPciRootBridgeIo.Mem.Write = DummyMemWrite;\r
118 HMemImage.IoFncs = &DummyPciRootBridgeIo;\r
119 Status = EFI_SUCCESS;\r
120 }\r
121 if (!EFI_ERROR (Status)) {\r
122 return EFI_SUCCESS;\r
123 } else {\r
124 return EFI_LOAD_ERROR;\r
125 }\r
126}\r
127\r
a1d4bfcc 128/**\r
129 Backup function for HDiskImage. Only a few fields need to be backup. \r
130 This is for making the Disk buffer refresh as few as possible.\r
131\r
132 @retval EFI_SUCCESS The operation was successful.\r
133**/\r
632820d1 134EFI_STATUS\r
135HMemImageBackup (\r
136 VOID\r
137 )\r
632820d1 138{\r
139 HMemImageBackupVar.Offset = HMemImage.Offset;\r
140 HMemImageBackupVar.Size = HMemImage.Size;\r
141\r
142 return EFI_SUCCESS;\r
143}\r
144\r
a1d4bfcc 145/**\r
146 Set FileName field in HFileImage.\r
632820d1 147\r
a1d4bfcc 148 @param[in] Offset The offset.\r
149 @param[in] Size The size.\r
632820d1 150\r
a1d4bfcc 151 @retval EFI_SUCCESS The operation was successful.\r
152 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
153**/\r
632820d1 154EFI_STATUS\r
155HMemImageSetMemOffsetSize (\r
156 IN UINTN Offset,\r
157 IN UINTN Size\r
158 )\r
632820d1 159{\r
160\r
161 HMemImage.Offset = Offset;\r
162 HMemImage.Size = Size;\r
163\r
164 return EFI_SUCCESS;\r
165}\r
166\r
a1d4bfcc 167/**\r
168 Read a disk from disk into HBufferImage.\r
169\r
170 @param[in] Offset The offset.\r
171 @param[in] Size The size.\r
172 @param[in] Recover if is for recover, no information print.\r
173\r
174 @retval EFI_LOAD_ERROR A load error occured.\r
175 @retval EFI_SUCCESS The operation was successful.\r
176 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
177**/\r
632820d1 178EFI_STATUS\r
179HMemImageRead (\r
a1d4bfcc 180 IN UINTN Offset,\r
181 IN UINTN Size,\r
182 IN BOOLEAN Recover\r
632820d1 183 )\r
632820d1 184{\r
185\r
186 EFI_STATUS Status;\r
187 void *Buffer;\r
188 CHAR16 *Str;\r
189 HEFI_EDITOR_LINE *Line;\r
190\r
191 EDIT_FILE_TYPE BufferTypeBackup;\r
192\r
193 BufferTypeBackup = HBufferImage.BufferType;\r
194 HBufferImage.BufferType = FileTypeMemBuffer;\r
195\r
196 Buffer = AllocateZeroPool (Size);\r
197 if (Buffer == NULL) {\r
198 StatusBarSetStatusString (L"Read Memory Failed");\r
199 return EFI_OUT_OF_RESOURCES;\r
200 }\r
201\r
202 Status = HMemImage.IoFncs->Mem.Read (\r
203 HMemImage.IoFncs,\r
204 EfiPciWidthUint8,\r
205 Offset,\r
206 Size,\r
207 Buffer\r
208 );\r
209\r
210 if (EFI_ERROR (Status)) {\r
211 FreePool (Buffer);\r
212 StatusBarSetStatusString (L"Memory Specified Not Accessible");\r
213 return EFI_LOAD_ERROR;\r
214 }\r
215\r
216 HBufferImageFree ();\r
217\r
218 Status = HBufferImageBufferToList (Buffer, Size);\r
219 FreePool (Buffer);\r
220\r
221 if (EFI_ERROR (Status)) {\r
222 StatusBarSetStatusString (L"Read Memory Failed");\r
223 return Status;\r
224 }\r
225\r
226 Status = HMemImageSetMemOffsetSize (Offset, Size);\r
227\r
228 HBufferImage.DisplayPosition.Row = 2;\r
229 HBufferImage.DisplayPosition.Column = 10;\r
230\r
231 HBufferImage.MousePosition.Row = 2;\r
232 HBufferImage.MousePosition.Column = 10;\r
233\r
234 HBufferImage.LowVisibleRow = 1;\r
235 HBufferImage.HighBits = TRUE;\r
236\r
237 HBufferImage.BufferPosition.Row = 1;\r
238 HBufferImage.BufferPosition.Column = 1;\r
239\r
240 if (!Recover) {\r
241 Str = CatSPrint(NULL, L"%d Lines Read", HBufferImage.NumLines);\r
242 if (Str == NULL) {\r
243 StatusBarSetStatusString (L"Read Memory Failed");\r
244 return EFI_OUT_OF_RESOURCES;\r
245 }\r
246\r
247 StatusBarSetStatusString (Str);\r
248 SHELL_FREE_NON_NULL (Str);\r
249\r
250 HMainEditor.SelectStart = 0;\r
251 HMainEditor.SelectEnd = 0;\r
252\r
253 }\r
254\r
255 //\r
256 // has line\r
257 //\r
258 if (HBufferImage.Lines != NULL) {\r
259 HBufferImage.CurrentLine = CR (HBufferImage.ListHead->ForwardLink, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
260 } else {\r
261 //\r
262 // create a dummy line\r
263 //\r
264 Line = HBufferImageCreateLine ();\r
265 if (Line == NULL) {\r
266 StatusBarSetStatusString (L"Read Memory Failed");\r
267 return EFI_OUT_OF_RESOURCES;\r
268 }\r
269\r
270 HBufferImage.CurrentLine = Line;\r
271 }\r
272\r
273 HBufferImage.Modified = FALSE;\r
274 HBufferImageNeedRefresh = TRUE;\r
275 HBufferImageOnlyLineNeedRefresh = FALSE;\r
276 HBufferImageMouseNeedRefresh = TRUE;\r
277\r
278 return EFI_SUCCESS;\r
279\r
280}\r
281\r
a1d4bfcc 282/**\r
283 Save lines in HBufferImage to disk.\r
284\r
285 @param[in] Offset The offset.\r
286 @param[in] Size The size.\r
287\r
288 @retval EFI_LOAD_ERROR A load error occured.\r
289 @retval EFI_SUCCESS The operation was successful.\r
290 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
291**/\r
632820d1 292EFI_STATUS\r
293HMemImageSave (\r
294 IN UINTN Offset,\r
295 IN UINTN Size\r
296 )\r
632820d1 297{\r
298\r
299 EFI_STATUS Status;\r
300 VOID *Buffer;\r
301\r
302 EDIT_FILE_TYPE BufferTypeBackup;\r
303\r
304 //\r
305 // not modified, so directly return\r
306 //\r
307 if (HBufferImage.Modified == FALSE) {\r
308 return EFI_SUCCESS;\r
309 }\r
310\r
311 BufferTypeBackup = HBufferImage.BufferType;\r
312 HBufferImage.BufferType = FileTypeMemBuffer;\r
313\r
314 Buffer = AllocateZeroPool (Size);\r
315\r
316 if (Buffer == NULL) {\r
317 return EFI_OUT_OF_RESOURCES;\r
318 }\r
319\r
320 Status = HBufferImageListToBuffer (Buffer, Size);\r
321 if (EFI_ERROR (Status)) {\r
322 FreePool (Buffer);\r
323 return Status;\r
324 }\r
325 //\r
326 // write back to memory\r
327 //\r
328 Status = HMemImage.IoFncs->Mem.Write (\r
329 HMemImage.IoFncs,\r
330 EfiPciWidthUint8,\r
331 Offset,\r
332 Size,\r
333 Buffer\r
334 );\r
335\r
336 FreePool (Buffer);\r
337\r
338 if (EFI_ERROR (Status)) {\r
339 return EFI_LOAD_ERROR;\r
340 }\r
341 //\r
342 // now not modified\r
343 //\r
344 HBufferImage.Modified = FALSE;\r
345\r
346 return EFI_SUCCESS;\r
347}\r
348\r
632820d1 349\r