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