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);
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#include <kernel/address-space.h>
|
||||
#include <kernel/channel.h>
|
||||
#include <kernel/msg.h>
|
||||
#include <kernel/port.h>
|
||||
#include <kernel/task.h>
|
||||
#include <kernel/thread.h>
|
||||
#include <kernel/util.h>
|
||||
#include <kernel/vm-region.h>
|
||||
#include <mango/signal.h>
|
||||
|
||||
#define CHANNEL_CAST(p) OBJECT_C_CAST(struct channel, c_base, &channel_type, p)
|
||||
@@ -167,13 +167,13 @@ extern kern_status_t channel_recv_msg(
|
||||
struct task *sender = msg->msg_sender_thread->tr_parent;
|
||||
struct task *receiver = self->tr_parent;
|
||||
|
||||
struct vm_region *src = sender->t_address_space,
|
||||
*dst = receiver->t_address_space;
|
||||
struct address_space *src = sender->t_address_space,
|
||||
*dst = receiver->t_address_space;
|
||||
|
||||
unsigned long f;
|
||||
vm_region_lock_pair_irqsave(src, dst, &f);
|
||||
address_space_lock_pair_irqsave(src, dst, &f);
|
||||
|
||||
kern_status_t status = vm_region_memmove_v(
|
||||
kern_status_t status = address_space_memmove_v(
|
||||
dst,
|
||||
0,
|
||||
out_msg->msg_data,
|
||||
@@ -182,7 +182,7 @@ extern kern_status_t channel_recv_msg(
|
||||
0,
|
||||
msg->msg_req.msg_data,
|
||||
msg->msg_req.msg_data_count,
|
||||
VM_REGION_COPY_ALL,
|
||||
ADDRESS_SPACE_COPY_ALL,
|
||||
NULL);
|
||||
|
||||
if (status != KERN_OK) {
|
||||
@@ -210,7 +210,7 @@ extern kern_status_t channel_recv_msg(
|
||||
&sender->t_handles_lock,
|
||||
&receiver->t_handles_lock,
|
||||
f);
|
||||
vm_region_unlock_pair_irqrestore(src, dst, f);
|
||||
address_space_unlock_pair_irqrestore(src, dst, f);
|
||||
|
||||
if (status != KERN_OK) {
|
||||
kmsg_reply_error(msg, status, &msg_lock_flags);
|
||||
@@ -250,12 +250,12 @@ extern kern_status_t channel_reply_msg(
|
||||
/* the task that is about to send the response */
|
||||
struct task *sender = self->tr_parent;
|
||||
|
||||
struct vm_region *src = sender->t_address_space,
|
||||
*dst = receiver->t_address_space;
|
||||
struct address_space *src = sender->t_address_space,
|
||||
*dst = receiver->t_address_space;
|
||||
unsigned long f;
|
||||
vm_region_lock_pair_irqsave(src, dst, &f);
|
||||
address_space_lock_pair_irqsave(src, dst, &f);
|
||||
|
||||
kern_status_t status = vm_region_memmove_v(
|
||||
kern_status_t status = address_space_memmove_v(
|
||||
dst,
|
||||
0,
|
||||
msg->msg_resp.msg_data,
|
||||
@@ -264,7 +264,7 @@ extern kern_status_t channel_reply_msg(
|
||||
0,
|
||||
reply->msg_data,
|
||||
reply->msg_data_count,
|
||||
VM_REGION_COPY_ALL,
|
||||
ADDRESS_SPACE_COPY_ALL,
|
||||
NULL);
|
||||
|
||||
if (status != KERN_OK) {
|
||||
@@ -292,7 +292,7 @@ extern kern_status_t channel_reply_msg(
|
||||
&sender->t_handles_lock,
|
||||
&receiver->t_handles_lock,
|
||||
f);
|
||||
vm_region_unlock_pair_irqrestore(src, dst, f);
|
||||
address_space_unlock_pair_irqrestore(src, dst, f);
|
||||
|
||||
if (status != KERN_OK) {
|
||||
kmsg_reply_error(msg, status, &msg_lock_flags);
|
||||
@@ -308,7 +308,7 @@ extern kern_status_t channel_read_msg(
|
||||
struct channel *channel,
|
||||
msgid_t id,
|
||||
size_t offset,
|
||||
struct vm_region *dest_region,
|
||||
struct address_space *dest_region,
|
||||
const kern_iovec_t *dest_iov,
|
||||
size_t dest_iov_count,
|
||||
size_t *nr_read)
|
||||
@@ -325,13 +325,13 @@ extern kern_status_t channel_read_msg(
|
||||
return KERN_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
struct vm_region *src_region
|
||||
struct address_space *src_region
|
||||
= msg->msg_sender_thread->tr_parent->t_address_space;
|
||||
|
||||
unsigned long f;
|
||||
vm_region_lock_pair_irqsave(src_region, dest_region, &f);
|
||||
address_space_lock_pair_irqsave(src_region, dest_region, &f);
|
||||
|
||||
kern_status_t status = vm_region_memmove_v(
|
||||
kern_status_t status = address_space_memmove_v(
|
||||
dest_region,
|
||||
0,
|
||||
dest_iov,
|
||||
@@ -340,9 +340,9 @@ extern kern_status_t channel_read_msg(
|
||||
offset,
|
||||
msg->msg_req.msg_data,
|
||||
msg->msg_req.msg_data_count,
|
||||
VM_REGION_COPY_ALL,
|
||||
ADDRESS_SPACE_COPY_ALL,
|
||||
nr_read);
|
||||
vm_region_unlock_pair_irqrestore(src_region, dest_region, f);
|
||||
address_space_unlock_pair_irqrestore(src_region, dest_region, f);
|
||||
|
||||
spin_unlock_irqrestore(&msg->msg_lock, msg_lock_flags);
|
||||
|
||||
@@ -353,7 +353,7 @@ extern kern_status_t channel_write_msg(
|
||||
struct channel *channel,
|
||||
msgid_t id,
|
||||
size_t offset,
|
||||
struct vm_region *src_region,
|
||||
struct address_space *src_region,
|
||||
const kern_iovec_t *src_iov,
|
||||
size_t src_iov_count,
|
||||
size_t *nr_written)
|
||||
@@ -370,13 +370,13 @@ extern kern_status_t channel_write_msg(
|
||||
return KERN_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
struct vm_region *dest_region
|
||||
struct address_space *dest_region
|
||||
= msg->msg_sender_thread->tr_parent->t_address_space;
|
||||
|
||||
unsigned long f;
|
||||
vm_region_lock_pair_irqsave(src_region, dest_region, &f);
|
||||
address_space_lock_pair_irqsave(src_region, dest_region, &f);
|
||||
|
||||
kern_status_t status = vm_region_memmove_v(
|
||||
kern_status_t status = address_space_memmove_v(
|
||||
dest_region,
|
||||
offset,
|
||||
msg->msg_resp.msg_data,
|
||||
@@ -385,9 +385,9 @@ extern kern_status_t channel_write_msg(
|
||||
0,
|
||||
src_iov,
|
||||
src_iov_count,
|
||||
VM_REGION_COPY_ALL,
|
||||
ADDRESS_SPACE_COPY_ALL,
|
||||
nr_written);
|
||||
vm_region_unlock_pair_irqrestore(src_region, dest_region, f);
|
||||
address_space_unlock_pair_irqrestore(src_region, dest_region, f);
|
||||
|
||||
spin_unlock_irqrestore(&msg->msg_lock, msg_lock_flags);
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#include <kernel/address-space.h>
|
||||
#include <kernel/handle.h>
|
||||
#include <kernel/libc/string.h>
|
||||
#include <kernel/object.h>
|
||||
#include <kernel/sched.h>
|
||||
#include <kernel/util.h>
|
||||
#include <kernel/vm-region.h>
|
||||
#include <kernel/vm.h>
|
||||
#include <mango/types.h>
|
||||
|
||||
@@ -195,11 +195,11 @@ struct handle *handle_table_get_handle(
|
||||
}
|
||||
|
||||
kern_status_t handle_table_transfer(
|
||||
struct vm_region *dst_region,
|
||||
struct address_space *dst_region,
|
||||
struct handle_table *dst,
|
||||
kern_msg_handle_t *dst_handles,
|
||||
size_t dst_handles_max,
|
||||
struct vm_region *src_region,
|
||||
struct address_space *src_region,
|
||||
struct handle_table *src,
|
||||
kern_msg_handle_t *src_handles,
|
||||
size_t src_handles_count)
|
||||
@@ -214,7 +214,7 @@ kern_status_t handle_table_transfer(
|
||||
= (virt_addr_t)src_handles + (i * sizeof src_handle);
|
||||
virt_addr_t dst_handle_addr
|
||||
= (virt_addr_t)dst_handles + (i * sizeof dst_handle);
|
||||
status = vm_region_read_kernel(
|
||||
status = address_space_read(
|
||||
src_region,
|
||||
src_handle_addr,
|
||||
sizeof src_handle,
|
||||
@@ -223,7 +223,7 @@ kern_status_t handle_table_transfer(
|
||||
|
||||
if (status != KERN_OK) {
|
||||
src_handle.hnd_result = KERN_OK;
|
||||
vm_region_write_kernel(
|
||||
address_space_write(
|
||||
src_region,
|
||||
src_handle_addr,
|
||||
sizeof src_handle,
|
||||
@@ -244,7 +244,7 @@ kern_status_t handle_table_transfer(
|
||||
if (!src_entry) {
|
||||
status = KERN_INVALID_ARGUMENT;
|
||||
src_handle.hnd_result = KERN_INVALID_ARGUMENT;
|
||||
vm_region_write_kernel(
|
||||
address_space_write(
|
||||
src_region,
|
||||
src_handle_addr,
|
||||
sizeof src_handle,
|
||||
@@ -299,13 +299,13 @@ kern_status_t handle_table_transfer(
|
||||
|
||||
src_handle.hnd_result = status;
|
||||
|
||||
vm_region_write_kernel(
|
||||
address_space_write(
|
||||
src_region,
|
||||
src_handle_addr,
|
||||
sizeof src_handle,
|
||||
&src_handle,
|
||||
NULL);
|
||||
vm_region_write_kernel(
|
||||
address_space_write(
|
||||
dst_region,
|
||||
dst_handle_addr,
|
||||
sizeof dst_handle,
|
||||
@@ -317,7 +317,7 @@ kern_status_t handle_table_transfer(
|
||||
kern_msg_handle_t handle = {0};
|
||||
virt_addr_t handle_addr
|
||||
= (virt_addr_t)src_handles + (i * sizeof handle);
|
||||
vm_region_read_kernel(
|
||||
address_space_read(
|
||||
src_region,
|
||||
handle_addr,
|
||||
sizeof handle,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <kernel/address-space.h>
|
||||
#include <kernel/iovec.h>
|
||||
#include <kernel/libc/string.h>
|
||||
#include <kernel/util.h>
|
||||
#include <kernel/vm-region.h>
|
||||
|
||||
static bool read_iovec(
|
||||
struct iovec_iterator *it,
|
||||
@@ -18,7 +18,7 @@ static bool read_iovec(
|
||||
}
|
||||
|
||||
size_t nr_read = 0;
|
||||
kern_status_t status = vm_region_read_kernel(
|
||||
kern_status_t status = address_space_read(
|
||||
it->it_region,
|
||||
(virt_addr_t)it->it_vecs + (index * sizeof(kern_iovec_t)),
|
||||
sizeof(kern_iovec_t),
|
||||
@@ -30,7 +30,7 @@ static bool read_iovec(
|
||||
|
||||
void iovec_iterator_begin_user(
|
||||
struct iovec_iterator *it,
|
||||
struct vm_region *region,
|
||||
struct address_space *region,
|
||||
const kern_iovec_t *vecs,
|
||||
size_t nr_vecs)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user