vm: replace vm-region with address-space
address-space is a non-recursive data structure, which contains a flat list of vm_areas representing mapped vm-objects. userspace programs can no longer create sub-address-spaces. instead, they can reserve portions of the address space, and use that reserved space to create mappings.
This commit is contained in:
116
kernel/bsp.c
116
kernel/bsp.c
@@ -1,3 +1,4 @@
|
||||
#include <kernel/address-space.h>
|
||||
#include <kernel/bsp.h>
|
||||
#include <kernel/handle.h>
|
||||
#include <kernel/printk.h>
|
||||
@@ -6,7 +7,6 @@
|
||||
#include <kernel/thread.h>
|
||||
#include <kernel/util.h>
|
||||
#include <kernel/vm-object.h>
|
||||
#include <kernel/vm-region.h>
|
||||
|
||||
#define BOOTSTRAP_STACK_SIZE 0x10000
|
||||
|
||||
@@ -71,101 +71,6 @@ kern_status_t bsp_load(struct bsp *bsp, const struct boot_module *mod)
|
||||
return KERN_OK;
|
||||
}
|
||||
|
||||
static kern_status_t map_executable_dyn(
|
||||
struct bsp *bsp,
|
||||
struct task *task,
|
||||
virt_addr_t *entry)
|
||||
{
|
||||
kern_status_t status = KERN_OK;
|
||||
size_t exec_size = 0;
|
||||
if (bsp->bsp_trailer.bsp_text_vaddr > bsp->bsp_trailer.bsp_data_vaddr) {
|
||||
exec_size = bsp->bsp_trailer.bsp_text_vaddr
|
||||
+ bsp->bsp_trailer.bsp_text_size;
|
||||
} else {
|
||||
exec_size = bsp->bsp_trailer.bsp_data_vaddr
|
||||
+ bsp->bsp_trailer.bsp_data_size;
|
||||
}
|
||||
|
||||
struct vm_region *region;
|
||||
status = vm_region_create(
|
||||
task->t_address_space,
|
||||
"exec",
|
||||
4,
|
||||
VM_REGION_ANY_OFFSET,
|
||||
exec_size,
|
||||
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXEC | VM_PROT_USER,
|
||||
®ion);
|
||||
if (status != KERN_OK) {
|
||||
return status;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
#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(
|
||||
region,
|
||||
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(
|
||||
region,
|
||||
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 = text_base + bsp->bsp_trailer.bsp_exec_entry;
|
||||
return KERN_OK;
|
||||
}
|
||||
|
||||
static kern_status_t map_executable_exec(
|
||||
struct bsp *bsp,
|
||||
struct task *task,
|
||||
@@ -189,9 +94,6 @@ static kern_status_t map_executable_exec(
|
||||
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(
|
||||
@@ -212,7 +114,7 @@ static kern_status_t map_executable_exec(
|
||||
text_voffset,
|
||||
data_voffset);
|
||||
|
||||
status = vm_region_map_object(
|
||||
status = address_space_map(
|
||||
task->t_address_space,
|
||||
text_voffset,
|
||||
bsp->bsp_vmo,
|
||||
@@ -224,7 +126,7 @@ static kern_status_t map_executable_exec(
|
||||
return status;
|
||||
}
|
||||
|
||||
status = vm_region_map_object(
|
||||
status = address_space_map(
|
||||
task->t_address_space,
|
||||
data_voffset,
|
||||
data,
|
||||
@@ -257,9 +159,9 @@ kern_status_t bsp_launch_async(struct bsp *bsp, struct task *task)
|
||||
return KERN_NO_ENTRY;
|
||||
}
|
||||
|
||||
status = vm_region_map_object(
|
||||
status = address_space_map(
|
||||
task->t_address_space,
|
||||
VM_REGION_ANY_OFFSET,
|
||||
MAP_ADDRESS_ANY,
|
||||
user_stack,
|
||||
0,
|
||||
BOOTSTRAP_STACK_SIZE,
|
||||
@@ -270,9 +172,9 @@ kern_status_t bsp_launch_async(struct bsp *bsp, struct task *task)
|
||||
return status;
|
||||
}
|
||||
|
||||
status = vm_region_map_object(
|
||||
status = address_space_map(
|
||||
task->t_address_space,
|
||||
VM_REGION_ANY_OFFSET,
|
||||
MAP_ADDRESS_ANY,
|
||||
bsp->bsp_vmo,
|
||||
0,
|
||||
bsp->bsp_trailer.bsp_exec_offset,
|
||||
@@ -288,7 +190,7 @@ kern_status_t bsp_launch_async(struct bsp *bsp, struct task *task)
|
||||
return status;
|
||||
}
|
||||
#ifdef TRACE
|
||||
vm_region_dump(task->t_address_space);
|
||||
address_space_dump(task->t_address_space);
|
||||
#endif
|
||||
|
||||
sp = stack_buffer + BOOTSTRAP_STACK_SIZE;
|
||||
@@ -298,7 +200,7 @@ kern_status_t bsp_launch_async(struct bsp *bsp, struct task *task)
|
||||
task_open_handle(task, &task->t_base, 0, &self);
|
||||
task_open_handle(
|
||||
task,
|
||||
&task->t_address_space->vr_base,
|
||||
&task->t_address_space->s_base,
|
||||
0,
|
||||
&self_address_space);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user