Detecting Memory (x86): Difference between revisions

Jump to navigation Jump to search
[unchecked revision][unchecked revision]
m (Added UEFI Memory Map code example)
Line 527:
===Getting an UEFI Memory Map===
<source lang="c">
EFI_STATUS memory_map_setup() Status;{
EFI_STATUS Status = EFI_SUCCESS;
EFI_MEMORY_DESCRIPTOR *EfiMemoryMap;
UINTN EfiMemoryMapSize;
UINTN EfiMapKeyEfiMemoryMapSize;
UINTN EfiMapKey;
UINTN EfiDescriptorSize;
UINTN EfiDescriptorSize;
UINT32 EfiDescriptorVersion;
UINT32 EfiDescriptorVersion;
 
EfiMemoryMapSize = sizeof(EFI_MEMORY_DESCRIPTOR) * 31;
//
get_map:
// Get the EFI memory map.
EfiMemoryMapSize += sizeof(EFI_MEMORY_DESCRIPTOR);
//
Status = uefi_call_wrapper(BS->AllocatePool, 3, EfiLoaderData, EfiMemoryMapSize, (void =**) 0&EfiMemoryMap);
if (Status != EFI_SUCCESS) {
EfiMemoryMap = NULL;
Print(L"ERROR: Failed to allocate pool for memory map");
Status = gBS->GetMemoryMap (
return Status;
&EfiMemoryMapSize,
//}
EfiMemoryMap,
Status = gBSuefi_call_wrapper(BS->GetMemoryMap (,
&EfiMapKey,
&EfiDescriptorSize 5,
&EfiDescriptorVersionEfiMemoryMapSize,
); EfiMemoryMap,
UINTN EfiMemoryMapSize; &EfiMapKey,
ASSERT (Status == EFI_BUFFER_TOO_SMALL);
UINTN &EfiDescriptorSize;,
 
UINT32 &EfiDescriptorVersion);
//
if (Status != EFI_SUCCESS) {
// Use size returned for the AllocatePool.
ASSERT if (Status == EFI_BUFFER_TOO_SMALL); {
//
uefi_call_wrapper(BS->FreePool, 1, (void *) EfiMemoryMap);
EfiMemoryMap = (EFI_MEMORY_DESCRIPTOR *) AllocatePool (EfiMemoryMapSize + 2 * EfiDescriptorSize);
goto get_map;
ASSERT (EfiMemoryMap != NULL);
}
Status = gBS->GetMemoryMap (
Print(L"ERROR: Failed to get memory map");
&EfiMemoryMapSize,
EfiMemoryMap,
&EfiMapKey,
&EfiDescriptorSize,
&EfiDescriptorVersion
);
if (EFI_ERROR (Status)) {
FreePool (EfiMemoryMap);
}
 
//
// Get descriptors
//
EFI_MEMORY_DESCRIPTOR *EfiEntry = EfiMemoryMap;
do {
// ... do something with EfiEntry ...
EfiEntry = NEXT_MEMORY_DESCRIPTOR NextMemoryDescriptor(EfiEntry, EfiDescriptorSize);
} while ((UINT8 *) EfiEntry < (UINT8 *) EfiMemoryMap + EfiMemoryMapSize);
return Status;
}
</source>
 
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.

Navigation menu