From 18b281debf9262677f451d992010661ed10994d6 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Fri, 6 Mar 2026 20:12:12 +0000 Subject: [PATCH] kernel: bsp: add support for static bootstrap executables --- kernel/bsp.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/kernel/bsp.c b/kernel/bsp.c index ca2adfe..dabb2a5 100644 --- a/kernel/bsp.c +++ b/kernel/bsp.c @@ -69,7 +69,7 @@ kern_status_t bsp_load(struct bsp *bsp, const struct boot_module *mod) return KERN_OK; } -static kern_status_t map_executable( +static kern_status_t map_executable_dyn( struct bsp *bsp, struct task *task, virt_addr_t *entry) @@ -164,6 +164,82 @@ static kern_status_t map_executable( return KERN_OK; } +static kern_status_t map_executable_exec( + struct bsp *bsp, + struct task *task, + virt_addr_t *entry) +{ + kern_status_t status = KERN_OK; + struct vm_object *data = vm_object_create( + ".data", + 5, + bsp->bsp_trailer.bsp_data_size, + VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER); + if (!data) { + return KERN_NO_MEMORY; + } + + virt_addr_t text_base = 0, data_base = 0; + + off_t text_foffset = bsp->bsp_trailer.bsp_exec_offset + + bsp->bsp_trailer.bsp_text_faddr; + off_t data_foffset = 0; + off_t text_voffset = bsp->bsp_trailer.bsp_text_vaddr; + off_t data_voffset = bsp->bsp_trailer.bsp_data_vaddr; + + text_voffset -= vm_region_get_base_address(task->t_address_space); + data_voffset -= vm_region_get_base_address(task->t_address_space); + +#if 0 + size_t tmp = 0; + status = vm_object_copy( + data, + 0, + bsp->bsp_vmo, + bsp->bsp_trailer.bsp_data_faddr, + bsp->bsp_trailer.bsp_data_size, + &tmp); + + tracek("read %zuB of data from executable", tmp); +#endif + + tracek("text_foffset=%06llx, data_foffset=%06llx", + text_foffset, + data_foffset); + tracek("text_voffset=%08llx, data_voffset=%08llx", + text_voffset, + data_voffset); + + status = vm_region_map_object( + task->t_address_space, + text_voffset, + bsp->bsp_vmo, + text_foffset, + bsp->bsp_trailer.bsp_text_size, + VM_PROT_READ | VM_PROT_EXEC | VM_PROT_USER, + &text_base); + if (status != KERN_OK) { + return status; + } + + status = vm_region_map_object( + task->t_address_space, + data_voffset, + data, + data_foffset, + bsp->bsp_trailer.bsp_data_size, + VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER, + &data_base); + if (status != KERN_OK) { + return status; + } + + tracek("text_base=%08llx, data_base=%08llx", text_base, data_base); + + *entry = bsp->bsp_trailer.bsp_exec_entry; + return KERN_OK; +} + kern_status_t bsp_launch_async(struct bsp *bsp, struct task *task) { virt_addr_t stack_buffer, bsp_data_base; @@ -205,7 +281,7 @@ kern_status_t bsp_launch_async(struct bsp *bsp, struct task *task) return status; } - status = map_executable(bsp, task, &entry); + status = map_executable_exec(bsp, task, &entry); if (status != KERN_OK) { return status; }