From 0d2ddecc9aeb232746b76b4eebdb1381053a8951 Mon Sep 17 00:00:00 2001 From: Ada Christine Date: Mon, 27 Jan 2025 02:05:07 +0000 Subject: checkpoint. we can fake syscall with the dummy gdt --- boot/efi/image.c | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) (limited to 'boot/efi/image.c') 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 -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); -- cgit v1.3.1-1-g115d