diff options
Diffstat (limited to 'boot/efi/image.c')
| -rw-r--r-- | boot/efi/image.c | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/boot/efi/image.c b/boot/efi/image.c index 25e1911..b9b4891 100644 --- a/boot/efi/image.c +++ b/boot/efi/image.c @@ -14,12 +14,6 @@ #include <efi/error.h> -struct image_buffer -{ - char *base; - size_t length; -}; - static int create_image_buffer(int fd, struct image_buffer *buffer) { if ((buffer->length = elf64_size_fd(fd)) == 0) @@ -89,9 +83,9 @@ kjarna_image_entry_func *image_entry_addr(struct image_buffer *buffer) return (kjarna_image_entry_func *)(buffer->base + ehdr->e_entry); } -int image_start(void) +struct kjarna_interface get_boot_interface(void) { - struct kjarna_interface interface = + struct kjarna_interface result = { efi_open, efi_close, @@ -102,6 +96,30 @@ int image_start(void) efi_munmap }; + return result; +} + +struct kjarna_boot_image get_boot_image(void) +{ + struct kjarna_boot_image image = + { + { nullptr, 0 }, + nullptr + }; + + image.buffer = load_image(); + + if (image.buffer.base != nullptr) + { + image.entry = image_entry_addr(&image.buffer); + } + + return image; +} + +int image_start(void) +{ + struct kjarna_interface interface = get_boot_interface(); struct kjarna_entry_params params = { &interface, @@ -110,21 +128,19 @@ int image_start(void) nullptr }; - struct image_buffer buffer = load_image(); - - kjarna_image_entry_func *image_entry = nullptr; + struct kjarna_boot_image image = get_boot_image(); - if (buffer.base != nullptr) + if (image.buffer.base != nullptr) { - image_entry = image_entry_addr(&buffer); + image.entry = image_entry_addr(&image.buffer); } - if (image_entry != nullptr) + if (image.entry != nullptr) { - image_entry(¶ms); + image.entry(¶ms); } - if (munmap(buffer.base, buffer.length) == -1) + if (munmap(image.buffer.base, image.buffer.length) == -1) { write(STDOUT_FILENO, "failed unmap\r\n", -1); |
