156 lines
3.6 KiB
C
156 lines
3.6 KiB
C
/**
|
|
* PROJECT: ExectOS
|
|
* COPYRIGHT: See COPYING.md in the top level directory
|
|
* FILE: xtldr/memory.c
|
|
* DESCRIPTION: XT Boot Loader memory management
|
|
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
|
*/
|
|
|
|
#include <xtldr.h>
|
|
|
|
|
|
/**
|
|
* This routine allocates one or more 4KB pages.
|
|
*
|
|
* @param Pages
|
|
* The number of contiguous 4KB pages to allocate.
|
|
*
|
|
* @param Memory
|
|
* The pointer to a physical address.
|
|
*
|
|
* @return This routine returns a status code.
|
|
*
|
|
* @since XT 1.0
|
|
*/
|
|
XTCDECL
|
|
EFI_STATUS
|
|
BlAllocateMemoryPages(IN UINT64 Pages,
|
|
OUT PEFI_PHYSICAL_ADDRESS Memory)
|
|
{
|
|
return EfiSystemTable->BootServices->AllocatePages(AllocateAnyPages, EfiLoaderData, Pages, Memory);
|
|
}
|
|
|
|
/**
|
|
* This routine allocates a pool memory.
|
|
*
|
|
* @param Size
|
|
* The number of bytes to allocate from the pool.
|
|
*
|
|
* @param Memory
|
|
* The pointer to a physical address.
|
|
*
|
|
* @return This routine returns a status code.
|
|
*
|
|
* @since XT 1.0
|
|
*/
|
|
XTCDECL
|
|
EFI_STATUS
|
|
BlAllocateMemoryPool(IN UINT_PTR Size,
|
|
OUT PVOID *Memory)
|
|
{
|
|
/* Allocate pool */
|
|
return EfiSystemTable->BootServices->AllocatePool(EfiLoaderData, Size, Memory);
|
|
}
|
|
|
|
/**
|
|
* This routine frees memory pages.
|
|
*
|
|
* @param Pages
|
|
* The number of contiguous 4 KB pages to free.
|
|
*
|
|
* @param Memory
|
|
* The base physical address of the pages to be freed.
|
|
*
|
|
* @return This routine returns a status code.
|
|
*
|
|
* @since XT 1.0
|
|
*/
|
|
XTCDECL
|
|
EFI_STATUS
|
|
BlFreeMemoryPages(IN UINT64 Pages,
|
|
IN EFI_PHYSICAL_ADDRESS Memory)
|
|
{
|
|
return EfiSystemTable->BootServices->FreePages(Memory, Pages);
|
|
}
|
|
|
|
/**
|
|
* Returns pool memory to the system.
|
|
*
|
|
* @param Memory
|
|
* The pointer to the buffer to free.
|
|
*
|
|
* @return This routine returns a status code.
|
|
*
|
|
* @since XT 1.0
|
|
*/
|
|
XTCDECL
|
|
EFI_STATUS
|
|
BlFreeMemoryPool(IN PVOID Memory)
|
|
{
|
|
/* Free pool */
|
|
return EfiSystemTable->BootServices->FreePool(Memory);
|
|
}
|
|
|
|
/**
|
|
* Returns the memory descriptors which define a memory map of all the physical memory ranges reserved by the UEFI.
|
|
*
|
|
* @param MemoryMap
|
|
* Supplies a pointer to the buffer where memory map will be written.
|
|
*
|
|
* @return This routine returns a status code.
|
|
*
|
|
* @since XT 1.0
|
|
*/
|
|
XTCDECL
|
|
EFI_STATUS
|
|
BlGetMemoryMap(OUT PEFI_MEMORY_MAP MemoryMap)
|
|
{
|
|
EFI_STATUS Status;
|
|
|
|
if(MemoryMap == NULL)
|
|
{
|
|
return STATUS_EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
MemoryMap->Map = NULL;
|
|
MemoryMap->MapSize = 0;
|
|
|
|
/* Get memory map */
|
|
do
|
|
{
|
|
/* Attempt do get EFI memory map */
|
|
Status = EfiSystemTable->BootServices->GetMemoryMap(&MemoryMap->MapSize, MemoryMap->Map, &MemoryMap->MapKey,
|
|
&MemoryMap->DescriptorSize, &MemoryMap->DescriptorVersion);
|
|
if(Status == STATUS_EFI_SUCCESS)
|
|
{
|
|
/* Go further if succeeded */
|
|
break;
|
|
}
|
|
else if(Status != STATUS_EFI_BUFFER_TOO_SMALL)
|
|
{
|
|
/* Some error occurred */
|
|
if(MemoryMap->Map)
|
|
{
|
|
/* Free allocated memory */
|
|
BlFreeMemoryPool(MemoryMap->Map);
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
/* Allocate the desired amount of memory */
|
|
MemoryMap->MapSize += 2 * MemoryMap->DescriptorSize;
|
|
BlAllocateMemoryPool(MemoryMap->MapSize, (PVOID *)&MemoryMap->Map);
|
|
}
|
|
while(Status == STATUS_EFI_BUFFER_TOO_SMALL);
|
|
|
|
/* Make sure memory map is set */
|
|
if(MemoryMap->Map == NULL)
|
|
{
|
|
/* Something went wrong */
|
|
return STATUS_EFI_NO_MAPPING;
|
|
}
|
|
|
|
/* Return success */
|
|
return STATUS_EFI_SUCCESS;
|
|
}
|