diff options
| -rw-r--r-- | boot/efi/image.c | 15 | ||||
| -rw-r--r-- | boot/fake_syscall.c | 10 | ||||
| -rw-r--r-- | boot/kjarna.h | 13 |
3 files changed, 18 insertions, 20 deletions
diff --git a/boot/efi/image.c b/boot/efi/image.c index 1ff5b76..9e7ba3d 100644 --- a/boot/efi/image.c +++ b/boot/efi/image.c @@ -14,7 +14,7 @@ #include <efi/error.h> -static int create_image_buffer(int fd, struct image_buffer *buffer) +static int create_image_buffer(int fd, struct linear_buffer *buffer) { if ((buffer->length = elf64_size_fd(fd)) == 0) { @@ -36,13 +36,13 @@ static int create_image_buffer(int fd, struct image_buffer *buffer) return 0; } -static struct image_buffer load_image(void) +static struct linear_buffer load_image(void) { const char *image_entry_path = SERVICE_FILE_PATH; int image_fd; - struct image_buffer buffer = { nullptr, 0 }; + struct linear_buffer buffer = { nullptr, 0 }; if ((image_fd = open(image_entry_path, O_RDONLY, 0)) == -1) { @@ -71,7 +71,7 @@ static struct image_buffer load_image(void) return buffer; } -kjarna_image_entry_func *image_entry_addr(struct image_buffer *buffer) +kjarna_image_entry_func *image_entry_addr(struct linear_buffer *buffer) { if (buffer->base == nullptr) { @@ -88,14 +88,15 @@ struct kjarna_boot_image get_boot_image(void) struct kjarna_boot_image image = { { nullptr, 0 }, + { nullptr, 0 }, nullptr }; - image.buffer = load_image(); + image.image_buffer = load_image(); - if (image.buffer.base != nullptr) + if (image.image_buffer.base != nullptr) { - image.entry = image_entry_addr(&image.buffer); + image.entry = image_entry_addr(&image.image_buffer); } return image; diff --git a/boot/fake_syscall.c b/boot/fake_syscall.c index e2aaeca..0e94515 100644 --- a/boot/fake_syscall.c +++ b/boot/fake_syscall.c @@ -215,11 +215,11 @@ static void install_syscall_handler(void) msr_write(MSR_INDEX_EFER, efer); } -static void *create_fake_syscall_stack(void *entry_addr) +static void *create_fake_syscall_stack(void *entry_addr, struct linear_buffer *stack_buffer) { - constexpr size_t fake_syscall_stack_size = 0x20000; // 128KiB stack - char *stack_pointer_base = mmap(nullptr, fake_syscall_stack_size, 0, 0, -1, 0); - void *stack_pointer_head = stack_pointer_base + fake_syscall_stack_size; + stack_buffer->length = KJARNA_BOOT_STACK_SIZE; + stack_buffer->base = mmap(nullptr, stack_buffer->length, 0, 0, -1, 0); + void *stack_pointer_head = stack_buffer->base + stack_buffer->length; struct syscall_context *context = stack_alloc(&stack_pointer_head, sizeof(*context)); @@ -236,7 +236,7 @@ static void *create_fake_syscall_stack(void *entry_addr) int64_t fake_syscall_start(struct kjarna_boot_image *image) { install_syscall_handler(); - void *fake_stack = create_fake_syscall_stack((void *)image->entry); + void *fake_stack = create_fake_syscall_stack((void *)image->entry, &image->stack_buffer); save_system_context(); int64_t result = fake_syscall_begin(fake_stack, &exit_fake_syscall_stack); return result; diff --git a/boot/kjarna.h b/boot/kjarna.h index be77a4b..817d1be 100644 --- a/boot/kjarna.h +++ b/boot/kjarna.h @@ -3,6 +3,9 @@ #pragma once #include <kjarna/interface.h> +#include <lib/elf.h> + +#define KJARNA_BOOT_STACK_SIZE 0x20000ULL int main(int argc, char **argv); @@ -10,18 +13,12 @@ void *malloc(size_t size); void *calloc(size_t count, size_t size); void free(void *block); -struct image_buffer -{ - char *base; - size_t length; -}; - struct kjarna_boot_image { - struct image_buffer buffer; + struct linear_buffer image_buffer; + struct linear_buffer stack_buffer; kjarna_image_entry_func *entry; }; struct kjarna_boot_image get_boot_image(void); - |
