summaryrefslogtreecommitdiff
path: root/boot/efi/image.c
diff options
context:
space:
mode:
Diffstat (limited to 'boot/efi/image.c')
-rw-r--r--boot/efi/image.c48
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(&params);
+ image.entry(&params);
}
- if (munmap(buffer.base, buffer.length) == -1)
+ if (munmap(image.buffer.base, image.buffer.length) == -1)
{
write(STDOUT_FILENO, "failed unmap\r\n", -1);