diff options
author | Freya Murphy <freya@freyacat.org> | 2025-05-06 12:34:48 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2025-05-06 12:35:41 -0400 |
commit | 40bfcbb2cf8a39e58ec19b21956caaf4685c9b8b (patch) | |
tree | 3e2b5aa933b9f06ad1ed7aca2f63b0d79d36fa02 /kernel/mboot/mboot.c | |
parent | remove sym lookup (diff) | |
download | comus-40bfcbb2cf8a39e58ec19b21956caaf4685c9b8b.tar.gz comus-40bfcbb2cf8a39e58ec19b21956caaf4685c9b8b.tar.bz2 comus-40bfcbb2cf8a39e58ec19b21956caaf4685c9b8b.zip |
terrible hack to not overwrite mboot data
Diffstat (limited to 'kernel/mboot/mboot.c')
-rw-r--r-- | kernel/mboot/mboot.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/mboot/mboot.c b/kernel/mboot/mboot.c index e4547e7..8163f04 100644 --- a/kernel/mboot/mboot.c +++ b/kernel/mboot/mboot.c @@ -5,6 +5,8 @@ static volatile void *mboot = NULL; +extern char kernel_end[]; + void mboot_init(long magic, volatile void *ptr) { if (magic != MULTIBOOT2_BOOTLOADER_MAGIC) @@ -12,6 +14,23 @@ void mboot_init(long magic, volatile void *ptr) mboot = ptr; } +void *mboot_end(void) +{ + if (mboot == NULL) + return NULL; + + struct multiboot *info = (struct multiboot *)mboot; + uintptr_t mboot_end, initrd_end; + size_t initrd_len; + + mboot_end = (uintptr_t)info + info->total_size; + initrd_end = (uintptr_t)mboot_get_initrd_phys(&initrd_len); + if (initrd_end) + initrd_end += initrd_len; + + return (void *)MAX(mboot_end, initrd_end); +} + void *locate_mboot_table(uint32_t type) { if (mboot == NULL) |