]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/MemImage.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / HexEdit / MemImage.c
CommitLineData
632820d1 1/** @file\r
2 Functions to deal with Mem buffer\r
ba0014b9
LG
3\r
4 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>\r
56ba3746 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
632820d1 6\r
7**/\r
8\r
9#include "HexEditor.h"\r
10\r
47d20b54 11extern EFI_HANDLE HImageHandleBackup;\r
632820d1 12\r
47d20b54 13extern HEFI_EDITOR_BUFFER_IMAGE HBufferImage;\r
632820d1 14\r
47d20b54
MK
15extern BOOLEAN HBufferImageNeedRefresh;\r
16extern BOOLEAN HBufferImageOnlyLineNeedRefresh;\r
17extern BOOLEAN HBufferImageMouseNeedRefresh;\r
632820d1 18\r
19extern HEFI_EDITOR_GLOBAL_EDITOR HMainEditor;\r
20\r
47d20b54
MK
21HEFI_EDITOR_MEM_IMAGE HMemImage;\r
22HEFI_EDITOR_MEM_IMAGE HMemImageBackupVar;\r
632820d1 23\r
632820d1 24//\r
25// for basic initialization of HDiskImage\r
26//\r
47d20b54 27HEFI_EDITOR_MEM_IMAGE HMemImageConst = {\r
632820d1 28 NULL,\r
29 0,\r
30 0\r
31};\r
32\r
a1d4bfcc 33/**\r
34 Initialization function for HDiskImage.\r
632820d1 35\r
a1d4bfcc 36 @retval EFI_SUCCESS The operation was successful.\r
a048af3c 37 @retval EFI_LOAD_ERROR A load error occurred.\r
a1d4bfcc 38**/\r
632820d1 39EFI_STATUS\r
40HMemImageInit (\r
41 VOID\r
42 )\r
632820d1 43{\r
44 EFI_STATUS Status;\r
45\r
46 //\r
47 // basically initialize the HMemImage\r
48 //\r
49 CopyMem (&HMemImage, &HMemImageConst, sizeof (HMemImage));\r
50\r
51 Status = gBS->LocateProtocol (\r
47d20b54
MK
52 &gEfiCpuIo2ProtocolGuid,\r
53 NULL,\r
54 (VOID **)&HMemImage.IoFncs\r
55 );\r
632820d1 56 if (!EFI_ERROR (Status)) {\r
57 return EFI_SUCCESS;\r
58 } else {\r
59 return EFI_LOAD_ERROR;\r
60 }\r
61}\r
62\r
a1d4bfcc 63/**\r
ba0014b9 64 Backup function for HDiskImage. Only a few fields need to be backup.\r
a1d4bfcc 65 This is for making the Disk buffer refresh as few as possible.\r
66\r
67 @retval EFI_SUCCESS The operation was successful.\r
68**/\r
632820d1 69EFI_STATUS\r
70HMemImageBackup (\r
71 VOID\r
72 )\r
632820d1 73{\r
74 HMemImageBackupVar.Offset = HMemImage.Offset;\r
75 HMemImageBackupVar.Size = HMemImage.Size;\r
76\r
77 return EFI_SUCCESS;\r
78}\r
79\r
a1d4bfcc 80/**\r
81 Set FileName field in HFileImage.\r
632820d1 82\r
a1d4bfcc 83 @param[in] Offset The offset.\r
84 @param[in] Size The size.\r
632820d1 85\r
a1d4bfcc 86 @retval EFI_SUCCESS The operation was successful.\r
87 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
88**/\r
632820d1 89EFI_STATUS\r
90HMemImageSetMemOffsetSize (\r
47d20b54
MK
91 IN UINTN Offset,\r
92 IN UINTN Size\r
632820d1 93 )\r
632820d1 94{\r
47d20b54
MK
95 HMemImage.Offset = Offset;\r
96 HMemImage.Size = Size;\r
632820d1 97\r
98 return EFI_SUCCESS;\r
99}\r
100\r
a1d4bfcc 101/**\r
102 Read a disk from disk into HBufferImage.\r
103\r
104 @param[in] Offset The offset.\r
105 @param[in] Size The size.\r
106 @param[in] Recover if is for recover, no information print.\r
107\r
a048af3c 108 @retval EFI_LOAD_ERROR A load error occurred.\r
a1d4bfcc 109 @retval EFI_SUCCESS The operation was successful.\r
110 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
111**/\r
632820d1 112EFI_STATUS\r
113HMemImageRead (\r
47d20b54
MK
114 IN UINTN Offset,\r
115 IN UINTN Size,\r
116 IN BOOLEAN Recover\r
632820d1 117 )\r
632820d1 118{\r
47d20b54
MK
119 EFI_STATUS Status;\r
120 void *Buffer;\r
121 CHAR16 *Str;\r
122 HEFI_EDITOR_LINE *Line;\r
632820d1 123\r
632820d1 124 HBufferImage.BufferType = FileTypeMemBuffer;\r
125\r
47d20b54 126 Buffer = AllocateZeroPool (Size);\r
632820d1 127 if (Buffer == NULL) {\r
128 StatusBarSetStatusString (L"Read Memory Failed");\r
129 return EFI_OUT_OF_RESOURCES;\r
130 }\r
131\r
132 Status = HMemImage.IoFncs->Mem.Read (\r
47d20b54
MK
133 HMemImage.IoFncs,\r
134 EfiCpuIoWidthUint8,\r
135 Offset,\r
136 Size,\r
137 Buffer\r
138 );\r
632820d1 139\r
140 if (EFI_ERROR (Status)) {\r
141 FreePool (Buffer);\r
142 StatusBarSetStatusString (L"Memory Specified Not Accessible");\r
143 return EFI_LOAD_ERROR;\r
144 }\r
145\r
146 HBufferImageFree ();\r
147\r
148 Status = HBufferImageBufferToList (Buffer, Size);\r
149 FreePool (Buffer);\r
150\r
151 if (EFI_ERROR (Status)) {\r
152 StatusBarSetStatusString (L"Read Memory Failed");\r
153 return Status;\r
154 }\r
155\r
47d20b54 156 Status = HMemImageSetMemOffsetSize (Offset, Size);\r
632820d1 157\r
158 HBufferImage.DisplayPosition.Row = 2;\r
159 HBufferImage.DisplayPosition.Column = 10;\r
160\r
47d20b54
MK
161 HBufferImage.MousePosition.Row = 2;\r
162 HBufferImage.MousePosition.Column = 10;\r
632820d1 163\r
47d20b54
MK
164 HBufferImage.LowVisibleRow = 1;\r
165 HBufferImage.HighBits = TRUE;\r
632820d1 166\r
47d20b54
MK
167 HBufferImage.BufferPosition.Row = 1;\r
168 HBufferImage.BufferPosition.Column = 1;\r
632820d1 169\r
170 if (!Recover) {\r
47d20b54 171 Str = CatSPrint (NULL, L"%d Lines Read", HBufferImage.NumLines);\r
632820d1 172 if (Str == NULL) {\r
173 StatusBarSetStatusString (L"Read Memory Failed");\r
174 return EFI_OUT_OF_RESOURCES;\r
175 }\r
176\r
177 StatusBarSetStatusString (Str);\r
178 SHELL_FREE_NON_NULL (Str);\r
179\r
180 HMainEditor.SelectStart = 0;\r
181 HMainEditor.SelectEnd = 0;\r
632820d1 182 }\r
183\r
184 //\r
185 // has line\r
186 //\r
187 if (HBufferImage.Lines != NULL) {\r
188 HBufferImage.CurrentLine = CR (HBufferImage.ListHead->ForwardLink, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
189 } else {\r
190 //\r
191 // create a dummy line\r
192 //\r
193 Line = HBufferImageCreateLine ();\r
194 if (Line == NULL) {\r
195 StatusBarSetStatusString (L"Read Memory Failed");\r
196 return EFI_OUT_OF_RESOURCES;\r
197 }\r
198\r
199 HBufferImage.CurrentLine = Line;\r
200 }\r
201\r
202 HBufferImage.Modified = FALSE;\r
203 HBufferImageNeedRefresh = TRUE;\r
204 HBufferImageOnlyLineNeedRefresh = FALSE;\r
205 HBufferImageMouseNeedRefresh = TRUE;\r
206\r
207 return EFI_SUCCESS;\r
632820d1 208}\r
209\r
a1d4bfcc 210/**\r
211 Save lines in HBufferImage to disk.\r
212\r
213 @param[in] Offset The offset.\r
214 @param[in] Size The size.\r
215\r
a048af3c 216 @retval EFI_LOAD_ERROR A load error occurred.\r
a1d4bfcc 217 @retval EFI_SUCCESS The operation was successful.\r
218 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
219**/\r
632820d1 220EFI_STATUS\r
221HMemImageSave (\r
47d20b54
MK
222 IN UINTN Offset,\r
223 IN UINTN Size\r
632820d1 224 )\r
632820d1 225{\r
47d20b54
MK
226 EFI_STATUS Status;\r
227 VOID *Buffer;\r
632820d1 228\r
632820d1 229 //\r
230 // not modified, so directly return\r
231 //\r
232 if (HBufferImage.Modified == FALSE) {\r
233 return EFI_SUCCESS;\r
234 }\r
235\r
632820d1 236 HBufferImage.BufferType = FileTypeMemBuffer;\r
237\r
47d20b54 238 Buffer = AllocateZeroPool (Size);\r
632820d1 239\r
240 if (Buffer == NULL) {\r
241 return EFI_OUT_OF_RESOURCES;\r
242 }\r
243\r
244 Status = HBufferImageListToBuffer (Buffer, Size);\r
245 if (EFI_ERROR (Status)) {\r
246 FreePool (Buffer);\r
247 return Status;\r
248 }\r
47d20b54 249\r
632820d1 250 //\r
251 // write back to memory\r
252 //\r
253 Status = HMemImage.IoFncs->Mem.Write (\r
47d20b54
MK
254 HMemImage.IoFncs,\r
255 EfiCpuIoWidthUint8,\r
256 Offset,\r
257 Size,\r
258 Buffer\r
259 );\r
632820d1 260\r
261 FreePool (Buffer);\r
262\r
263 if (EFI_ERROR (Status)) {\r
264 return EFI_LOAD_ERROR;\r
265 }\r
47d20b54 266\r
632820d1 267 //\r
268 // now not modified\r
269 //\r
270 HBufferImage.Modified = FALSE;\r
271\r
272 return EFI_SUCCESS;\r
273}\r