TianoCore EDK2 master
Loading...
Searching...
No Matches
MemoryAttributesTable.c
Go to the documentation of this file.
1
9#include <PiDxe.h>
10#include <Library/BaseLib.h>
15#include <Library/DebugLib.h>
16#include <Library/PcdLib.h>
18
19#include <Library/PeCoffLib.h>
21
23
24#include "PiSmmCore.h"
25
26#define PREVIOUS_MEMORY_DESCRIPTOR(MemoryDescriptor, Size) \
27 ((EFI_MEMORY_DESCRIPTOR *)((UINT8 *)(MemoryDescriptor) - (Size)))
28
29#define IMAGE_PROPERTIES_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('I','P','P','D')
30
31typedef struct {
32 UINT32 Signature;
33 UINTN ImageRecordCount;
34 UINTN CodeSegmentCountMax;
35 LIST_ENTRY ImageRecordList;
37
38IMAGE_PROPERTIES_PRIVATE_DATA mImagePropertiesPrivateData = {
39 IMAGE_PROPERTIES_PRIVATE_DATA_SIGNATURE,
40 0,
41 0,
42 INITIALIZE_LIST_HEAD_VARIABLE (mImagePropertiesPrivateData.ImageRecordList)
43};
44
45#define EFI_MEMORY_ATTRIBUTES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA BIT0
46
47UINT64 mMemoryProtectionAttribute = EFI_MEMORY_ATTRIBUTES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA;
48
49//
50// Below functions are for MemoryMap
51//
52
65VOID
67 IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
68 IN OUT UINTN *MemoryMapSize,
69 IN UINTN DescriptorSize
70 )
71{
72 EFI_MEMORY_DESCRIPTOR *MemoryMapEntry;
73 EFI_MEMORY_DESCRIPTOR *MemoryMapEnd;
74 UINT64 MemoryBlockLength;
75 EFI_MEMORY_DESCRIPTOR *NewMemoryMapEntry;
76 EFI_MEMORY_DESCRIPTOR *NextMemoryMapEntry;
77
78 MemoryMapEntry = MemoryMap;
79 NewMemoryMapEntry = MemoryMap;
80 MemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)MemoryMap + *MemoryMapSize);
81 while ((UINTN)MemoryMapEntry < (UINTN)MemoryMapEnd) {
82 CopyMem (NewMemoryMapEntry, MemoryMapEntry, sizeof (EFI_MEMORY_DESCRIPTOR));
83 NextMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);
84
85 do {
86 MemoryBlockLength = LShiftU64 (MemoryMapEntry->NumberOfPages, EFI_PAGE_SHIFT);
87 if (((UINTN)NextMemoryMapEntry < (UINTN)MemoryMapEnd) &&
88 (MemoryMapEntry->Type == NextMemoryMapEntry->Type) &&
89 (MemoryMapEntry->Attribute == NextMemoryMapEntry->Attribute) &&
90 ((MemoryMapEntry->PhysicalStart + MemoryBlockLength) == NextMemoryMapEntry->PhysicalStart))
91 {
92 MemoryMapEntry->NumberOfPages += NextMemoryMapEntry->NumberOfPages;
93 if (NewMemoryMapEntry != MemoryMapEntry) {
94 NewMemoryMapEntry->NumberOfPages += NextMemoryMapEntry->NumberOfPages;
95 }
96
97 NextMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (NextMemoryMapEntry, DescriptorSize);
98 continue;
99 } else {
100 MemoryMapEntry = PREVIOUS_MEMORY_DESCRIPTOR (NextMemoryMapEntry, DescriptorSize);
101 break;
102 }
103 } while (TRUE);
104
105 MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);
106 NewMemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (NewMemoryMapEntry, DescriptorSize);
107 }
108
109 *MemoryMapSize = (UINTN)NewMemoryMapEntry - (UINTN)MemoryMap;
110
111 return;
112}
113
123STATIC
124VOID
126 IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
127 IN UINTN MemoryMapSize,
128 IN UINTN DescriptorSize
129 )
130{
131 EFI_MEMORY_DESCRIPTOR *MemoryMapEntry;
132 EFI_MEMORY_DESCRIPTOR *MemoryMapEnd;
133
134 MemoryMapEntry = MemoryMap;
135 MemoryMapEnd = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)MemoryMap + MemoryMapSize);
136 while ((UINTN)MemoryMapEntry < (UINTN)MemoryMapEnd) {
137 if (MemoryMapEntry->Attribute != 0) {
138 // It is PE image, the attribute is already set.
139 } else {
140 switch (MemoryMapEntry->Type) {
142 MemoryMapEntry->Attribute = EFI_MEMORY_RO;
143 break;
145 default:
146 MemoryMapEntry->Attribute |= EFI_MEMORY_XP;
147 break;
148 }
149 }
150
151 MemoryMapEntry = NEXT_MEMORY_DESCRIPTOR (MemoryMapEntry, DescriptorSize);
152 }
153
154 return;
155}
156
189STATIC
191EFIAPI
193 IN OUT UINTN *MemoryMapSize,
194 IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
195 OUT UINTN *MapKey,
196 OUT UINTN *DescriptorSize,
197 OUT UINT32 *DescriptorVersion
198 )
199{
200 EFI_STATUS Status;
201 UINTN OldMemoryMapSize;
202 UINTN AdditionalRecordCount;
203
204 //
205 // If PE code/data is not aligned, just return.
206 //
207 if ((mMemoryProtectionAttribute & EFI_MEMORY_ATTRIBUTES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA) == 0) {
208 return SmmCoreGetMemoryMap (MemoryMapSize, MemoryMap, MapKey, DescriptorSize, DescriptorVersion);
209 }
210
211 if (MemoryMapSize == NULL) {
212 return EFI_INVALID_PARAMETER;
213 }
214
215 AdditionalRecordCount = (2 * mImagePropertiesPrivateData.CodeSegmentCountMax + 3) * mImagePropertiesPrivateData.ImageRecordCount;
216
217 OldMemoryMapSize = *MemoryMapSize;
218 Status = SmmCoreGetMemoryMap (MemoryMapSize, MemoryMap, MapKey, DescriptorSize, DescriptorVersion);
219 if (Status == EFI_BUFFER_TOO_SMALL) {
220 *MemoryMapSize = *MemoryMapSize + (*DescriptorSize) * AdditionalRecordCount;
221 } else if (Status == EFI_SUCCESS) {
222 if (OldMemoryMapSize - *MemoryMapSize < (*DescriptorSize) * AdditionalRecordCount) {
223 *MemoryMapSize = *MemoryMapSize + (*DescriptorSize) * AdditionalRecordCount;
224 //
225 // Need update status to buffer too small
226 //
227 Status = EFI_BUFFER_TOO_SMALL;
228 } else {
229 //
230 // Split PE code/data
231 //
232 ASSERT (MemoryMap != NULL);
233 SplitTable (MemoryMapSize, MemoryMap, *DescriptorSize, &mImagePropertiesPrivateData.ImageRecordList, AdditionalRecordCount);
234
235 //
236 // Set RuntimeData to XP
237 //
238 EnforceMemoryMapAttribute (MemoryMap, *MemoryMapSize, *DescriptorSize);
239
240 //
241 // Merge same type to save entry size
242 //
243 MergeMemoryMap (MemoryMap, MemoryMapSize, *DescriptorSize);
244 }
245 }
246
247 return Status;
248}
249
250//
251// Below functions are for ImageRecord
252//
253
259VOID
262 )
263{
264 EFI_STATUS Status;
265 IMAGE_PROPERTIES_RECORD *ImageRecord;
266 CHAR8 *PdbPointer;
267 UINT32 RequiredAlignment;
268
269 DEBUG ((DEBUG_VERBOSE, "SMM InsertImageRecord - 0x%x\n", DriverEntry));
270
271 ImageRecord = AllocatePool (sizeof (*ImageRecord));
272 if (ImageRecord == NULL) {
273 return;
274 }
275
276 InitializeListHead (&ImageRecord->Link);
277 InitializeListHead (&ImageRecord->CodeSegmentList);
278
279 PdbPointer = PeCoffLoaderGetPdbPointer ((VOID *)(UINTN)DriverEntry->ImageBuffer);
280 if (PdbPointer != NULL) {
281 DEBUG ((DEBUG_VERBOSE, "SMM Image - %a\n", PdbPointer));
282 }
283
284 RequiredAlignment = RUNTIME_PAGE_ALLOCATION_GRANULARITY;
286 (VOID *)(UINTN)DriverEntry->ImageBuffer,
287 LShiftU64 (DriverEntry->NumberOfPage, EFI_PAGE_SHIFT),
288 &RequiredAlignment,
289 ImageRecord
290 );
291
292 if (EFI_ERROR (Status)) {
293 if (Status == EFI_ABORTED) {
294 mMemoryProtectionAttribute &=
295 ~((UINT64)EFI_MEMORY_ATTRIBUTES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA);
296 }
297
298 goto Finish;
299 }
300
301 if (ImageRecord->CodeSegmentCount == 0) {
302 mMemoryProtectionAttribute &=
303 ~((UINT64)EFI_MEMORY_ATTRIBUTES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA);
304 DEBUG ((DEBUG_ERROR, "SMM !!!!!!!! InsertImageRecord - CodeSegmentCount is 0 !!!!!!!!\n"));
305 if (PdbPointer != NULL) {
306 DEBUG ((DEBUG_ERROR, "SMM !!!!!!!! Image - %a !!!!!!!!\n", PdbPointer));
307 }
308
309 Status = EFI_ABORTED;
310 goto Finish;
311 }
312
313 //
314 // Check overlap all section in ImageBase/Size
315 //
316 if (!IsImageRecordCodeSectionValid (ImageRecord)) {
317 DEBUG ((DEBUG_ERROR, "SMM IsImageRecordCodeSectionValid - FAIL\n"));
318 Status = EFI_ABORTED;
319 goto Finish;
320 }
321
322 InsertTailList (&mImagePropertiesPrivateData.ImageRecordList, &ImageRecord->Link);
323 mImagePropertiesPrivateData.ImageRecordCount++;
324
325 if (mImagePropertiesPrivateData.CodeSegmentCountMax < ImageRecord->CodeSegmentCount) {
326 mImagePropertiesPrivateData.CodeSegmentCountMax = ImageRecord->CodeSegmentCount;
327 }
328
329 SortImageRecord (&mImagePropertiesPrivateData.ImageRecordList);
330
331Finish:
332 if (EFI_ERROR (Status) && (ImageRecord != NULL)) {
333 DeleteImagePropertiesRecord (ImageRecord);
334 }
335
336 return;
337}
338
342VOID
344 VOID
345 )
346{
347 UINTN MemoryMapSize;
348 EFI_MEMORY_DESCRIPTOR *MemoryMap;
349 UINTN MapKey;
350 UINTN DescriptorSize;
351 UINT32 DescriptorVersion;
352 UINTN Index;
353 EFI_STATUS Status;
354 UINTN RuntimeEntryCount;
355 EDKII_PI_SMM_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable;
356 EFI_MEMORY_DESCRIPTOR *MemoryAttributesEntry;
357 UINTN MemoryAttributesTableSize;
358
359 MemoryMapSize = 0;
360 MemoryMap = NULL;
362 &MemoryMapSize,
363 MemoryMap,
364 &MapKey,
365 &DescriptorSize,
366 &DescriptorVersion
367 );
368 ASSERT (Status == EFI_BUFFER_TOO_SMALL);
369
370 do {
371 DEBUG ((DEBUG_VERBOSE, "MemoryMapSize - 0x%x\n", MemoryMapSize));
372 MemoryMap = AllocatePool (MemoryMapSize);
373 ASSERT (MemoryMap != NULL);
374 DEBUG ((DEBUG_VERBOSE, "MemoryMap - 0x%x\n", MemoryMap));
375
377 &MemoryMapSize,
378 MemoryMap,
379 &MapKey,
380 &DescriptorSize,
381 &DescriptorVersion
382 );
383 if (EFI_ERROR (Status)) {
384 FreePool (MemoryMap);
385 }
386 } while (Status == EFI_BUFFER_TOO_SMALL);
387
388 //
389 // Allocate MemoryAttributesTable
390 //
391 RuntimeEntryCount = MemoryMapSize/DescriptorSize;
392 MemoryAttributesTableSize = sizeof (EDKII_PI_SMM_MEMORY_ATTRIBUTES_TABLE) + DescriptorSize * RuntimeEntryCount;
393 MemoryAttributesTable = AllocatePool (sizeof (EDKII_PI_SMM_MEMORY_ATTRIBUTES_TABLE) + DescriptorSize * RuntimeEntryCount);
394 ASSERT (MemoryAttributesTable != NULL);
395 MemoryAttributesTable->Version = EDKII_PI_SMM_MEMORY_ATTRIBUTES_TABLE_VERSION;
396 MemoryAttributesTable->NumberOfEntries = (UINT32)RuntimeEntryCount;
397 MemoryAttributesTable->DescriptorSize = (UINT32)DescriptorSize;
398 MemoryAttributesTable->Reserved = 0;
399 DEBUG ((DEBUG_VERBOSE, "MemoryAttributesTable:\n"));
400 DEBUG ((DEBUG_VERBOSE, " Version - 0x%08x\n", MemoryAttributesTable->Version));
401 DEBUG ((DEBUG_VERBOSE, " NumberOfEntries - 0x%08x\n", MemoryAttributesTable->NumberOfEntries));
402 DEBUG ((DEBUG_VERBOSE, " DescriptorSize - 0x%08x\n", MemoryAttributesTable->DescriptorSize));
403 MemoryAttributesEntry = (EFI_MEMORY_DESCRIPTOR *)(MemoryAttributesTable + 1);
404 for (Index = 0; Index < MemoryMapSize/DescriptorSize; Index++) {
405 CopyMem (MemoryAttributesEntry, MemoryMap, DescriptorSize);
406 DEBUG ((DEBUG_VERBOSE, "Entry (0x%x)\n", MemoryAttributesEntry));
407 DEBUG ((DEBUG_VERBOSE, " Type - 0x%x\n", MemoryAttributesEntry->Type));
408 DEBUG ((DEBUG_VERBOSE, " PhysicalStart - 0x%016lx\n", MemoryAttributesEntry->PhysicalStart));
409 DEBUG ((DEBUG_VERBOSE, " VirtualStart - 0x%016lx\n", MemoryAttributesEntry->VirtualStart));
410 DEBUG ((DEBUG_VERBOSE, " NumberOfPages - 0x%016lx\n", MemoryAttributesEntry->NumberOfPages));
411 DEBUG ((DEBUG_VERBOSE, " Attribute - 0x%016lx\n", MemoryAttributesEntry->Attribute));
412 MemoryAttributesEntry = NEXT_MEMORY_DESCRIPTOR (MemoryAttributesEntry, DescriptorSize);
413
414 MemoryMap = NEXT_MEMORY_DESCRIPTOR (MemoryMap, DescriptorSize);
415 }
416
417 Status = gSmst->SmmInstallConfigurationTable (gSmst, &gEdkiiPiSmmMemoryAttributesTableGuid, MemoryAttributesTable, MemoryAttributesTableSize);
418 ASSERT_EFI_ERROR (Status);
419}
420
424VOID
426 VOID
427 )
428{
429 EFI_STATUS Status;
430 UINTN NoHandles;
431 EFI_HANDLE *HandleBuffer;
432 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
433 UINTN Index;
435
436 Status = SmmLocateHandleBuffer (
438 &gEfiLoadedImageProtocolGuid,
439 NULL,
440 &NoHandles,
441 &HandleBuffer
442 );
443 if (EFI_ERROR (Status)) {
444 return;
445 }
446
447 for (Index = 0; Index < NoHandles; Index++) {
448 Status = gSmst->SmmHandleProtocol (
449 HandleBuffer[Index],
450 &gEfiLoadedImageProtocolGuid,
451 (VOID **)&LoadedImage
452 );
453 if (EFI_ERROR (Status)) {
454 continue;
455 }
456
457 DEBUG ((DEBUG_VERBOSE, "LoadedImage - 0x%x 0x%x ", LoadedImage->ImageBase, LoadedImage->ImageSize));
458 {
459 VOID *PdbPointer;
460 PdbPointer = PeCoffLoaderGetPdbPointer (LoadedImage->ImageBase);
461 if (PdbPointer != NULL) {
462 DEBUG ((DEBUG_VERBOSE, "(%a) ", PdbPointer));
463 }
464 }
465 DEBUG ((DEBUG_VERBOSE, "\n"));
466 ZeroMem (&DriverEntry, sizeof (DriverEntry));
467 DriverEntry.ImageBuffer = (UINTN)LoadedImage->ImageBase;
468 DriverEntry.NumberOfPage = EFI_SIZE_TO_PAGES ((UINTN)LoadedImage->ImageSize);
470 }
471
472 if (HandleBuffer != NULL) {
473 FreePool (HandleBuffer);
474 }
475}
476
487EFIAPI
489 IN CONST EFI_GUID *Protocol,
490 IN VOID *Interface,
491 IN EFI_HANDLE Handle
492 )
493{
495
496 DEBUG ((DEBUG_VERBOSE, "SMM MemoryProtectionAttribute - 0x%016lx\n", mMemoryProtectionAttribute));
497 if ((mMemoryProtectionAttribute & EFI_MEMORY_ATTRIBUTES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA) == 0) {
498 return EFI_SUCCESS;
499 }
500
502 if ( mImagePropertiesPrivateData.ImageRecordCount > 0) {
503 DEBUG ((DEBUG_INFO, "SMM - Total Runtime Image Count - 0x%x\n", mImagePropertiesPrivateData.ImageRecordCount));
504 DEBUG ((DEBUG_INFO, "SMM - Dump Runtime Image Records:\n"));
505 DumpImageRecords (&mImagePropertiesPrivateData.ImageRecordList);
506 }
507
509
511
512 return EFI_SUCCESS;
513}
514
518VOID
519EFIAPI
521 VOID
522 )
523{
524 EFI_STATUS Status;
525 VOID *Registration;
526
527 Status = gSmst->SmmRegisterProtocolNotify (
528 &gEfiSmmEndOfDxeProtocolGuid,
530 &Registration
531 );
532 ASSERT_EFI_ERROR (Status);
533
534 return;
535}
UINT64 UINTN
LIST_ENTRY *EFIAPI InitializeListHead(IN OUT LIST_ENTRY *ListHead)
Definition: LinkedList.c:182
#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead)
Definition: BaseLib.h:2884
UINT64 EFIAPI LShiftU64(IN UINT64 Operand, IN UINTN Count)
Definition: LShiftU64.c:28
LIST_ENTRY *EFIAPI InsertTailList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
Definition: LinkedList.c:259
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
VOID EFIAPI FreePool(IN VOID *Buffer)
EFI_STATUS EFIAPI SplitTable(IN OUT UINTN *MemoryMapSize, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, IN UINTN DescriptorSize, IN LIST_ENTRY *ImageRecordList, IN UINTN NumberOfAdditionalDescriptors)
VOID EFIAPI DeleteImagePropertiesRecord(IN IMAGE_PROPERTIES_RECORD *ImageRecord)
BOOLEAN EFIAPI IsImageRecordCodeSectionValid(IN IMAGE_PROPERTIES_RECORD *ImageRecord)
EFI_STATUS EFIAPI CreateImagePropertiesRecord(IN CONST VOID *ImageBase, IN CONST UINT64 ImageSize, IN CONST UINT32 *Alignment OPTIONAL, OUT IMAGE_PROPERTIES_RECORD *ImageRecord)
VOID EFIAPI DumpImageRecords(IN LIST_ENTRY *ImageRecordList)
EFI_STATUS EFIAPI SortImageRecord(IN LIST_ENTRY *ImageRecordList)
VOID MergeMemoryMap(IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, IN OUT UINTN *MemoryMapSize, IN UINTN DescriptorSize)
STATIC VOID EnforceMemoryMapAttribute(IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, IN UINTN MemoryMapSize, IN UINTN DescriptorSize)
EFI_STATUS EFIAPI SmmLocateHandleBuffer(IN EFI_LOCATE_SEARCH_TYPE SearchType, IN EFI_GUID *Protocol OPTIONAL, IN VOID *SearchKey OPTIONAL, IN OUT UINTN *NumberHandles, OUT EFI_HANDLE **Buffer)
Definition: Locate.c:435
VOID SmmInstallImageRecord(VOID)
EFI_STATUS EFIAPI SmmInstallMemoryAttributesTable(IN CONST EFI_GUID *Protocol, IN VOID *Interface, IN EFI_HANDLE Handle)
VOID PublishMemoryAttributesTable(VOID)
VOID SmmInsertImageRecord(IN EFI_SMM_DRIVER_ENTRY *DriverEntry)
VOID EFIAPI SmmCoreInitializeMemoryAttributesTable(VOID)
STATIC EFI_STATUS EFIAPI SmmCoreGetMemoryMapMemoryAttributesTable(IN OUT UINTN *MemoryMapSize, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, OUT UINTN *MapKey, OUT UINTN *DescriptorSize, OUT UINT32 *DescriptorVersion)
EFI_STATUS EFIAPI SmmCoreGetMemoryMap(IN OUT UINTN *MemoryMapSize, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, OUT UINTN *MapKey, OUT UINTN *DescriptorSize, OUT UINT32 *DescriptorVersion)
Definition: Page.c:1046
#define NULL
Definition: Base.h:319
#define CONST
Definition: Base.h:259
#define STATIC
Definition: Base.h:264
#define VOID
Definition: Base.h:269
#define TRUE
Definition: Base.h:301
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
#define ASSERT_EFI_ERROR(StatusParameter)
Definition: DebugLib.h:463
#define DEBUG_CODE_BEGIN()
Definition: DebugLib.h:565
#define DEBUG(Expression)
Definition: DebugLib.h:435
#define DEBUG_CODE_END()
Definition: DebugLib.h:579
EFI_SMM_SYSTEM_TABLE2 * gSmst
VOID *EFIAPI AllocatePool(IN UINTN AllocationSize)
EFI_STATUS EFIAPI DriverEntry(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
Definition: TdTcg2Dxe.c:2387
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:29
#define EFI_SIZE_TO_PAGES(Size)
Definition: UefiBaseType.h:200
VOID * EFI_HANDLE
Definition: UefiBaseType.h:33
#define EFI_SUCCESS
Definition: UefiBaseType.h:112
@ EfiRuntimeServicesCode
@ EfiRuntimeServicesData
@ ByProtocol
Definition: UefiSpec.h:1528
EFI_VIRTUAL_ADDRESS VirtualStart
Definition: UefiSpec.h:171
EFI_PHYSICAL_ADDRESS PhysicalStart
Definition: UefiSpec.h:165
Definition: Base.h:213