]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/MemImage.c
ShellPkg: Fixed build error 'variable set but not used'
[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
4ff7e37b
ED
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
a1d4bfcc 49\r
50 @retval EFI_UNSUPPORTED.\r
51**/\r
632820d1 52EFI_STATUS\r
2b578de0 53EFIAPI\r
632820d1 54DummyMemRead (\r
55 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * This,\r
56 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
57 IN UINT64 Address,\r
58 IN UINTN Count,\r
59 IN OUT VOID *Buffer\r
a1d4bfcc 60 )\r
61{\r
62 return EFI_UNSUPPORTED;\r
63}\r
64\r
65/**\r
66 Empty function. always returns the same.\r
67\r
4ff7e37b
ED
68 @param[in] This Ignored.\r
69 @param[in] Width Ignored.\r
70 @param[in] Address Ignored.\r
71 @param[in] Count Ignored.\r
72 @param[in, out] Buffer Ignored.\r
632820d1 73\r
a1d4bfcc 74 @retval EFI_UNSUPPORTED.\r
75**/\r
632820d1 76EFI_STATUS\r
2b578de0 77EFIAPI\r
632820d1 78DummyMemWrite (\r
79 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL * This,\r
80 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,\r
81 IN UINT64 Address,\r
82 IN UINTN Count,\r
83 IN OUT VOID *Buffer\r
a1d4bfcc 84 )\r
85{\r
86 return EFI_UNSUPPORTED;\r
87}\r
88\r
89/**\r
90 Initialization function for HDiskImage.\r
632820d1 91\r
a1d4bfcc 92 @retval EFI_SUCCESS The operation was successful.\r
93 @retval EFI_LOAD_ERROR A load error occured.\r
94**/\r
632820d1 95EFI_STATUS\r
96HMemImageInit (\r
97 VOID\r
98 )\r
632820d1 99{\r
100 EFI_STATUS Status;\r
101\r
102 //\r
103 // basically initialize the HMemImage\r
104 //\r
105 CopyMem (&HMemImage, &HMemImageConst, sizeof (HMemImage));\r
106\r
107 Status = gBS->LocateProtocol (\r
108 &gEfiPciRootBridgeIoProtocolGuid,\r
109 NULL,\r
110 (VOID**)&HMemImage.IoFncs\r
111 );\r
112 if (Status == EFI_NOT_FOUND) {\r
113 //\r
114 // For NT32, no EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL is available\r
115 // Use Dummy PciRootBridgeIo for memory access\r
116 //\r
117 ZeroMem (&DummyPciRootBridgeIo, sizeof (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL));\r
118 DummyPciRootBridgeIo.Mem.Read = DummyMemRead;\r
119 DummyPciRootBridgeIo.Mem.Write = DummyMemWrite;\r
120 HMemImage.IoFncs = &DummyPciRootBridgeIo;\r
121 Status = EFI_SUCCESS;\r
122 }\r
123 if (!EFI_ERROR (Status)) {\r
124 return EFI_SUCCESS;\r
125 } else {\r
126 return EFI_LOAD_ERROR;\r
127 }\r
128}\r
129\r
a1d4bfcc 130/**\r
131 Backup function for HDiskImage. Only a few fields need to be backup. \r
132 This is for making the Disk buffer refresh as few as possible.\r
133\r
134 @retval EFI_SUCCESS The operation was successful.\r
135**/\r
632820d1 136EFI_STATUS\r
137HMemImageBackup (\r
138 VOID\r
139 )\r
632820d1 140{\r
141 HMemImageBackupVar.Offset = HMemImage.Offset;\r
142 HMemImageBackupVar.Size = HMemImage.Size;\r
143\r
144 return EFI_SUCCESS;\r
145}\r
146\r
a1d4bfcc 147/**\r
148 Set FileName field in HFileImage.\r
632820d1 149\r
a1d4bfcc 150 @param[in] Offset The offset.\r
151 @param[in] Size The size.\r
632820d1 152\r
a1d4bfcc 153 @retval EFI_SUCCESS The operation was successful.\r
154 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
155**/\r
632820d1 156EFI_STATUS\r
157HMemImageSetMemOffsetSize (\r
158 IN UINTN Offset,\r
159 IN UINTN Size\r
160 )\r
632820d1 161{\r
162\r
163 HMemImage.Offset = Offset;\r
164 HMemImage.Size = Size;\r
165\r
166 return EFI_SUCCESS;\r
167}\r
168\r
a1d4bfcc 169/**\r
170 Read a disk from disk into HBufferImage.\r
171\r
172 @param[in] Offset The offset.\r
173 @param[in] Size The size.\r
174 @param[in] Recover if is for recover, no information print.\r
175\r
176 @retval EFI_LOAD_ERROR A load error occured.\r
177 @retval EFI_SUCCESS The operation was successful.\r
178 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
179**/\r
632820d1 180EFI_STATUS\r
181HMemImageRead (\r
a1d4bfcc 182 IN UINTN Offset,\r
183 IN UINTN Size,\r
184 IN BOOLEAN Recover\r
632820d1 185 )\r
632820d1 186{\r
187\r
188 EFI_STATUS Status;\r
189 void *Buffer;\r
190 CHAR16 *Str;\r
191 HEFI_EDITOR_LINE *Line;\r
192\r
632820d1 193 HBufferImage.BufferType = FileTypeMemBuffer;\r
194\r
195 Buffer = AllocateZeroPool (Size);\r
196 if (Buffer == NULL) {\r
197 StatusBarSetStatusString (L"Read Memory Failed");\r
198 return EFI_OUT_OF_RESOURCES;\r
199 }\r
200\r
201 Status = HMemImage.IoFncs->Mem.Read (\r
202 HMemImage.IoFncs,\r
203 EfiPciWidthUint8,\r
204 Offset,\r
205 Size,\r
206 Buffer\r
207 );\r
208\r
209 if (EFI_ERROR (Status)) {\r
210 FreePool (Buffer);\r
211 StatusBarSetStatusString (L"Memory Specified Not Accessible");\r
212 return EFI_LOAD_ERROR;\r
213 }\r
214\r
215 HBufferImageFree ();\r
216\r
217 Status = HBufferImageBufferToList (Buffer, Size);\r
218 FreePool (Buffer);\r
219\r
220 if (EFI_ERROR (Status)) {\r
221 StatusBarSetStatusString (L"Read Memory Failed");\r
222 return Status;\r
223 }\r
224\r
225 Status = HMemImageSetMemOffsetSize (Offset, Size);\r
226\r
227 HBufferImage.DisplayPosition.Row = 2;\r
228 HBufferImage.DisplayPosition.Column = 10;\r
229\r
230 HBufferImage.MousePosition.Row = 2;\r
231 HBufferImage.MousePosition.Column = 10;\r
232\r
233 HBufferImage.LowVisibleRow = 1;\r
234 HBufferImage.HighBits = TRUE;\r
235\r
236 HBufferImage.BufferPosition.Row = 1;\r
237 HBufferImage.BufferPosition.Column = 1;\r
238\r
239 if (!Recover) {\r
240 Str = CatSPrint(NULL, L"%d Lines Read", HBufferImage.NumLines);\r
241 if (Str == NULL) {\r
242 StatusBarSetStatusString (L"Read Memory Failed");\r
243 return EFI_OUT_OF_RESOURCES;\r
244 }\r
245\r
246 StatusBarSetStatusString (Str);\r
247 SHELL_FREE_NON_NULL (Str);\r
248\r
249 HMainEditor.SelectStart = 0;\r
250 HMainEditor.SelectEnd = 0;\r
251\r
252 }\r
253\r
254 //\r
255 // has line\r
256 //\r
257 if (HBufferImage.Lines != NULL) {\r
258 HBufferImage.CurrentLine = CR (HBufferImage.ListHead->ForwardLink, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
259 } else {\r
260 //\r
261 // create a dummy line\r
262 //\r
263 Line = HBufferImageCreateLine ();\r
264 if (Line == NULL) {\r
265 StatusBarSetStatusString (L"Read Memory Failed");\r
266 return EFI_OUT_OF_RESOURCES;\r
267 }\r
268\r
269 HBufferImage.CurrentLine = Line;\r
270 }\r
271\r
272 HBufferImage.Modified = FALSE;\r
273 HBufferImageNeedRefresh = TRUE;\r
274 HBufferImageOnlyLineNeedRefresh = FALSE;\r
275 HBufferImageMouseNeedRefresh = TRUE;\r
276\r
277 return EFI_SUCCESS;\r
278\r
279}\r
280\r
a1d4bfcc 281/**\r
282 Save lines in HBufferImage to disk.\r
283\r
284 @param[in] Offset The offset.\r
285 @param[in] Size The size.\r
286\r
287 @retval EFI_LOAD_ERROR A load error occured.\r
288 @retval EFI_SUCCESS The operation was successful.\r
289 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
290**/\r
632820d1 291EFI_STATUS\r
292HMemImageSave (\r
293 IN UINTN Offset,\r
294 IN UINTN Size\r
295 )\r
632820d1 296{\r
297\r
298 EFI_STATUS Status;\r
299 VOID *Buffer;\r
300\r
632820d1 301 //\r
302 // not modified, so directly return\r
303 //\r
304 if (HBufferImage.Modified == FALSE) {\r
305 return EFI_SUCCESS;\r
306 }\r
307\r
632820d1 308 HBufferImage.BufferType = FileTypeMemBuffer;\r
309\r
310 Buffer = AllocateZeroPool (Size);\r
311\r
312 if (Buffer == NULL) {\r
313 return EFI_OUT_OF_RESOURCES;\r
314 }\r
315\r
316 Status = HBufferImageListToBuffer (Buffer, Size);\r
317 if (EFI_ERROR (Status)) {\r
318 FreePool (Buffer);\r
319 return Status;\r
320 }\r
321 //\r
322 // write back to memory\r
323 //\r
324 Status = HMemImage.IoFncs->Mem.Write (\r
325 HMemImage.IoFncs,\r
326 EfiPciWidthUint8,\r
327 Offset,\r
328 Size,\r
329 Buffer\r
330 );\r
331\r
332 FreePool (Buffer);\r
333\r
334 if (EFI_ERROR (Status)) {\r
335 return EFI_LOAD_ERROR;\r
336 }\r
337 //\r
338 // now not modified\r
339 //\r
340 HBufferImage.Modified = FALSE;\r
341\r
342 return EFI_SUCCESS;\r
343}\r
344\r
632820d1 345\r