summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--loader/loader_efi.c63
1 files changed, 16 insertions, 47 deletions
diff --git a/loader/loader_efi.c b/loader/loader_efi.c
index b56ebb9..5e238f6 100644
--- a/loader/loader_efi.c
+++ b/loader/loader_efi.c
@@ -11,25 +11,20 @@
struct system_buffer
{
EFI_PHYSICAL_ADDRESS base;
- EFI_PHYSICAL_ADDRESS head;
- UINTN pages;
+ UINTN size;
};
struct system_image
{
+ struct system_buffer buffer;
EFI_FILE_PROTOCOL *file;
- EFI_PHYSICAL_ADDRESS base;
- UINTN size;
Elf64_Ehdr ehdr;
Elf64_Phdr *phdrs;
};
static struct system_buffer get_system_buffer(size_t size);
-static EFI_PHYSICAL_ADDRESS system_allocate(struct system_buffer *buffer,
- size_t size);
static struct system_image *open_system_image(CHAR16 *path);
-static bool load_system_image(struct system_buffer *buffer,
- struct system_image *image);
+static bool load_system_image(struct system_image *image);
static struct efi_memory_map_data *get_memory_map_data(void);
static struct efi_framebuffer_data *get_framebuffer_data(void);
static void *get_acpi_rsdp(void);
@@ -38,14 +33,13 @@ void loader_main(void)
{
struct efi_boot_data data;
- struct system_buffer kernel_buffer = get_system_buffer(0x400000);
struct system_image *kernel_image = open_system_image(kernel_path);
- if (load_system_image(&kernel_buffer, kernel_image))
+ if (load_system_image(kernel_image))
{
Print(L"loaded kernel image at base %16.0x size %d bytes\r\n",
- kernel_image->base,
- kernel_image->size);
+ kernel_image->buffer.base,
+ kernel_image->buffer.size);
}
else
{
@@ -54,7 +48,7 @@ void loader_main(void)
}
kernel_entry_func kernel_entry;
- kernel_entry = (kernel_entry_func)(kernel_image->base +
+ kernel_entry = (kernel_entry_func)(kernel_image->buffer.base +
kernel_image->ehdr.e_entry);
data.system_table = e_st;
@@ -74,45 +68,26 @@ void loader_main(void)
kernel_entry(&data);
}
-static struct system_buffer get_system_buffer(size_t size)
+static struct system_buffer get_system_buffer(UINTN size)
{
EFI_STATUS status;
struct system_buffer buffer;
- buffer.pages = EFI_SIZE_TO_PAGES(size);
-
status = e_bs->AllocatePages(AllocateAnyPages,
SystemMemoryType,
- buffer.pages,
+ EFI_SIZE_TO_PAGES(size),
&buffer.base);
- if (!EFI_ERROR(status))
- {
- buffer.head = buffer.base;
- }
- else
+ if (EFI_ERROR(status))
{
Print(L"error allocating system buffer: %r\r\n", status);
buffer.base = 0;
- buffer.pages = 0;
+ buffer.size = 0;
}
return buffer;
}
-static EFI_PHYSICAL_ADDRESS system_allocate(struct system_buffer *buffer,
- UINTN size)
-{
- if (EFI_SIZE_TO_PAGES(buffer->head + size - buffer->base) < buffer->pages)
- {
- EFI_PHYSICAL_ADDRESS result = buffer->head;
- buffer->head += size;
- return result;
- }
-
- return 0;
-}
-
static bool validate_image(Elf64_Ehdr *ehdr)
{
if (ehdr->e_ident[EI_MAG0] != ELFMAG0 ||
@@ -221,9 +196,6 @@ static struct system_image *open_system_image(CHAR16 *path)
goto failure;
}
- image->size = get_image_size(image);
- image->base = 0;
-
return image;
failure:
@@ -231,18 +203,16 @@ failure:
return NULL;
}
-static bool load_system_image(struct system_buffer *buffer,
- struct system_image *image)
+static bool load_system_image(struct system_image *image)
{
- image->base = system_allocate(buffer, image->size);
+ image->buffer = get_system_buffer(get_image_size(image));
- if (!image->base)
+ if (!image->buffer.base)
{
- Print(L"system buffer is full\r\n");
return false;
}
- e_bs->SetMem((VOID *)image->base, image->size, 0);
+ e_bs->SetMem((VOID *)image->buffer.base, image->buffer.size, 0);
Elf64_Ehdr *ehdr = &image->ehdr;
Elf64_Phdr *phdrs = image->phdrs;
@@ -260,13 +230,12 @@ static bool load_system_image(struct system_buffer *buffer,
phdrs[i].p_offset,
phdrs[i].p_memsz);
- void *segment = (void *)(image->base + phdrs[i].p_paddr);
+ void *segment = (void *)(image->buffer.base + phdrs[i].p_paddr);
UINTN segment_size = phdrs[i].p_filesz;
image->file->SetPosition(image->file, phdrs[i].p_offset);
status = image->file->Read(image->file, &segment_size, segment);
break;
-
default:
continue;
}