summaryrefslogtreecommitdiff
path: root/boot
diff options
context:
space:
mode:
authorAda Christine <adachristine18@gmail.com>2025-02-02 16:11:35 +0000
committerAda Christine <adachristine18@gmail.com>2025-02-02 16:11:35 +0000
commit6b9c30f9f35e9094762a96a861f0fa978c8e095d (patch)
tree32392c85e18c9591fa4afbeecf0b4e620d642b75 /boot
parent966cdf0b81ba40f0fd1b0c4b476bf7c35804ae6c (diff)
buffer for stack, permit cleanup
Diffstat (limited to 'boot')
-rw-r--r--boot/efi/image.c15
-rw-r--r--boot/fake_syscall.c10
-rw-r--r--boot/kjarna.h13
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);
-