OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
MmapDump.c
Go to the documentation of this file.
1
15#include <Uefi.h>
16#include <Library/UefiLib.h>
17#include <Library/DebugLib.h>
18#include <Library/BaseMemoryLib.h>
19#include <Library/MemoryAllocationLib.h>
20#include <Library/OcMemoryLib.h>
21#include <Library/OcMiscLib.h>
22#include <Library/UefiBootServicesTableLib.h>
23#include <Library/UefiApplicationEntryPoint.h>
25
26EFI_STATUS
27EFIAPI
29 IN EFI_HANDLE ImageHandle,
30 IN EFI_SYSTEM_TABLE *SystemTable
31 )
32{
33 EFI_STATUS Status;
35 EFI_PHYSICAL_ADDRESS Address;
36 UINTN Pages;
37 UINTN MemoryMapSize;
38 UINTN OriginalSize;
39 UINTN DescriptorSize;
40 EFI_MEMORY_DESCRIPTOR *MemoryMap;
41
42 Address = 0;
43 Status = gBS->LocateProtocol (&gOcFirmwareRuntimeProtocolGuid, NULL, (VOID **)&FwRuntime);
44 if (!EFI_ERROR (Status) && (FwRuntime->Revision == OC_FIRMWARE_RUNTIME_REVISION)) {
45 Status = FwRuntime->GetExecArea (&Address, &Pages);
46 DEBUG ((
47 DEBUG_WARN,
48 "MMDD: OpenRuntime r%u resides at %X - %r\n",
49 (UINT32)FwRuntime->Revision,
50 (UINT32)Address,
51 Status
52 ));
53 } else if (!EFI_ERROR (Status) && (FwRuntime->Revision != OC_FIRMWARE_RUNTIME_REVISION)) {
54 DEBUG ((
55 DEBUG_WARN,
56 "MMDD: OpenRuntime has unexpected revision r%u instead of r%u\n",
57 (UINT32)FwRuntime->Revision,
59 ));
60 } else {
61 DEBUG ((
62 DEBUG_WARN,
63 "MMDD: OpenRuntime is missing - %r\n",
64 Status
65 ));
66 }
67
68 DEBUG ((
69 DEBUG_WARN,
70 "MMDD: Note, that DEBUG version of the tool prints more\n"
71 ));
72
73 MemoryMap = OcGetCurrentMemoryMap (
74 &MemoryMapSize,
75 &DescriptorSize,
76 NULL,
77 NULL,
78 &OriginalSize,
79 TRUE
80 );
81
82 if (MemoryMap != NULL) {
84 OcSortMemoryMap (MemoryMapSize, MemoryMap, DescriptorSize);
85 DEBUG ((DEBUG_INFO, "MMDD: Dumping the original memory map\n"));
86 OcPrintMemoryMap (MemoryMapSize, MemoryMap, DescriptorSize);
87 DEBUG ((DEBUG_INFO, "MMDD: Dumping patched attributes\n"));
88 OcRebuildAttributes (Address, NULL);
89 Status = OcSplitMemoryMapByAttributes (OriginalSize, &MemoryMapSize, MemoryMap, DescriptorSize);
90 if (!EFI_ERROR (Status)) {
92 DEBUG ((DEBUG_INFO, "MMDD: Dumping patched memory map\n"));
93 OcPrintMemoryMap (MemoryMapSize, MemoryMap, DescriptorSize);
94 } else {
95 DEBUG ((DEBUG_INFO, "MMDD: Cannot patch memory map - %r\n", Status));
96 }
97
98 DEBUG ((DEBUG_INFO, "MMDD: Dumping shrinked memory map\n"));
99 OcShrinkMemoryMap (&MemoryMapSize, MemoryMap, DescriptorSize);
100 OcPrintMemoryMap (MemoryMapSize, MemoryMap, DescriptorSize);
101 FreePool (MemoryMap);
102 } else {
103 DEBUG ((DEBUG_INFO, "MMDD: Unable to obtain memory map\n"));
104 }
105
106 gBS->Stall (SECONDS_TO_MICROSECONDS (3));
107
108 return EFI_SUCCESS;
109}
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
Definition MmapDump.c:28
EFI_BOOT_SERVICES * gBS
#define OC_FIRMWARE_RUNTIME_REVISION
EFI_GUID gOcFirmwareRuntimeProtocolGuid
EFI_MEMORY_DESCRIPTOR * OcGetCurrentMemoryMap(OUT UINTN *MemoryMapSize, OUT UINTN *DescriptorSize, OUT UINTN *MapKey OPTIONAL, OUT UINT32 *DescriptorVersion OPTIONAL, OUT UINTN *OriginalMemoryMapSize OPTIONAL, IN BOOLEAN IncludeSplitSpace)
Definition MemoryMap.c:116
EFI_STATUS OcShrinkMemoryMap(IN OUT UINTN *MemoryMapSize, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, IN UINTN DescriptorSize)
Definition MemoryMap.c:333
EFI_STATUS OcRebuildAttributes(IN EFI_PHYSICAL_ADDRESS Address, IN EFI_GET_MEMORY_MAP GetMemoryMap OPTIONAL)
VOID OcSortMemoryMap(IN UINTN MemoryMapSize, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, IN UINTN DescriptorSize)
Definition MemoryMap.c:302
VOID OcPrintMemoryMap(IN UINTN MemoryMapSize, IN EFI_MEMORY_DESCRIPTOR *MemoryMap, IN UINTN DescriptorSize)
EFI_STATUS OcSplitMemoryMapByAttributes(IN UINTN MaxMemoryMapSize, IN OUT UINTN *MemoryMapSize, IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, IN UINTN DescriptorSize)
VOID OcPrintMemoryAttributesTable(VOID)
Definition MemoryDebug.c:96
#define SECONDS_TO_MICROSECONDS(x)
Definition OcMiscLib.h:30
OC_FWRT_GET_EXEC_AREA GetExecArea