diff options
| author | Ada Christine <adachristine18@gmail.com> | 2021-03-19 11:55:47 +0000 |
|---|---|---|
| committer | Ada Christine <adachristine18@gmail.com> | 2021-03-19 11:55:47 +0000 |
| commit | 31efbc82cb0e72a161719b5242d9016e92fb1e9c (patch) | |
| tree | ff445a35dc5a9267d4ebe962a96f9004a987adad /loader | |
| parent | 0858b3983ff2e8b90a158741955b30f9f2fb374f (diff) | |
per-image buffer
Diffstat (limited to 'loader')
| -rw-r--r-- | loader/loader_efi.c | 63 |
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; } |
