kernel: bsp: add support for static bootstrap executables
This commit is contained in:
80
kernel/bsp.c
80
kernel/bsp.c
@@ -69,7 +69,7 @@ kern_status_t bsp_load(struct bsp *bsp, const struct boot_module *mod)
|
|||||||
return KERN_OK;
|
return KERN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static kern_status_t map_executable(
|
static kern_status_t map_executable_dyn(
|
||||||
struct bsp *bsp,
|
struct bsp *bsp,
|
||||||
struct task *task,
|
struct task *task,
|
||||||
virt_addr_t *entry)
|
virt_addr_t *entry)
|
||||||
@@ -164,6 +164,82 @@ static kern_status_t map_executable(
|
|||||||
return KERN_OK;
|
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)
|
kern_status_t bsp_launch_async(struct bsp *bsp, struct task *task)
|
||||||
{
|
{
|
||||||
virt_addr_t stack_buffer, bsp_data_base;
|
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;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = map_executable(bsp, task, &entry);
|
status = map_executable_exec(bsp, task, &entry);
|
||||||
if (status != KERN_OK) {
|
if (status != KERN_OK) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user