kernel: all string parameters now take a corresponding length parameter

This commit is contained in:
2026-02-19 19:07:55 +00:00
parent 291a5f677e
commit 2f413c603d
5 changed files with 56 additions and 32 deletions

View File

@@ -104,7 +104,7 @@ void kernel_init(uintptr_t arg)
bsp.bsp_trailer.bsp_exec_entry, bsp.bsp_trailer.bsp_exec_entry,
bsp.bsp_vmo); bsp.bsp_vmo);
struct task *bootstrap_task = task_create(kernel_task(), "bootstrap"); struct task *bootstrap_task = task_create("bootstrap", 9);
tracek("created bootstrap task (pid=%u)", bootstrap_task->t_id); tracek("created bootstrap task (pid=%u)", bootstrap_task->t_id);
bsp_launch_async(&bsp, bootstrap_task); bsp_launch_async(&bsp, bootstrap_task);

View File

@@ -58,6 +58,7 @@ kern_status_t bsp_load(struct bsp *bsp, const struct boot_module *mod)
bsp->bsp_vmo = vm_object_create_in_place( bsp->bsp_vmo = vm_object_create_in_place(
"bsp", "bsp",
3,
mod->mod_base, mod->mod_base,
mod->mod_size, mod->mod_size,
VM_PROT_READ | VM_PROT_EXEC | VM_PROT_USER); VM_PROT_READ | VM_PROT_EXEC | VM_PROT_USER);
@@ -87,6 +88,7 @@ static kern_status_t map_executable(
status = vm_region_create( status = vm_region_create(
task->t_address_space, task->t_address_space,
"exec", "exec",
4,
VM_REGION_ANY_OFFSET, VM_REGION_ANY_OFFSET,
exec_size, exec_size,
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXEC | VM_PROT_USER, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXEC | VM_PROT_USER,
@@ -97,6 +99,7 @@ static kern_status_t map_executable(
struct vm_object *data = vm_object_create( struct vm_object *data = vm_object_create(
".data", ".data",
5,
bsp->bsp_trailer.bsp_data_size, bsp->bsp_trailer.bsp_data_size,
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER); VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER);
/* TODO copy .data from executable to memory */ /* TODO copy .data from executable to memory */
@@ -160,6 +163,7 @@ kern_status_t bsp_launch_async(struct bsp *bsp, struct task *task)
struct vm_object *user_stack = vm_object_create( struct vm_object *user_stack = vm_object_create(
"stack", "stack",
5,
BOOTSTRAP_STACK_SIZE, BOOTSTRAP_STACK_SIZE,
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER); VM_PROT_READ | VM_PROT_WRITE | VM_PROT_USER);
if (!user_stack) { if (!user_stack) {

View File

@@ -91,6 +91,7 @@ kern_status_t setup_kernel_task(void)
vm_region_create( vm_region_create(
NULL, NULL,
"root", "root",
4,
VM_KERNEL_BASE, VM_KERNEL_BASE,
VM_KERNEL_LIMIT - VM_KERNEL_BASE, VM_KERNEL_LIMIT - VM_KERNEL_BASE,
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXEC | VM_PROT_SVR, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXEC | VM_PROT_SVR,
@@ -172,7 +173,7 @@ struct task *task_alloc(void)
return t; return t;
} }
struct task *task_create(struct task *parent, const char *name) struct task *task_create(const char *name, size_t name_len)
{ {
struct task *task = task_alloc(); struct task *task = task_alloc();
if (!task) { if (!task) {
@@ -190,25 +191,23 @@ struct task *task_create(struct task *parent, const char *name)
vm_region_create( vm_region_create(
NULL, NULL,
"root", "root",
4,
VM_USER_BASE, VM_USER_BASE,
VM_USER_LIMIT - VM_USER_BASE, VM_USER_LIMIT - VM_USER_BASE,
VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXEC | VM_PROT_USER, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXEC | VM_PROT_USER,
&task->t_address_space); &task->t_address_space);
task->t_address_space->vr_pmap = pmap; task->t_address_space->vr_pmap = pmap;
task->t_state = TASK_STOPPED; task->t_state = TASK_RUNNING;
task->t_handles = handle_table_create(); task->t_handles = handle_table_create();
if (name) { if (name) {
strncpy(task->t_name, name, sizeof task->t_name); name_len = MIN(name_len, sizeof task->t_name - 1);
task->t_name[sizeof task->t_name - 1] = '\0'; memcpy(task->t_name, name, name_len);
task->t_name[name_len] = '\0';
} }
unsigned long flags; unsigned long flags;
task_lock_irqsave(parent, &flags);
queue_push_back(&parent->t_children, &task->t_child_entry);
task_unlock_irqrestore(parent, flags);
spin_lock_irqsave(&task_list_lock, &flags); spin_lock_irqsave(&task_list_lock, &flags);
task_list_insert(&task_list, task); task_list_insert(&task_list, task);
spin_unlock_irqrestore(&task_list_lock, flags); spin_unlock_irqrestore(&task_list_lock, flags);

View File

@@ -70,15 +70,16 @@ enum vm_page_order vm_object_global_page_order(void)
struct vm_object *vm_object_create( struct vm_object *vm_object_create(
const char *name, const char *name,
size_t len, size_t name_len,
enum vm_prot prot) size_t data_len,
vm_prot_t prot)
{ {
size_t page_bytes = VM_PAGE_SIZE; size_t page_bytes = VM_PAGE_SIZE;
uintptr_t page_mask = page_bytes - 1; uintptr_t page_mask = page_bytes - 1;
if (len & page_mask) { if (data_len & page_mask) {
len &= ~page_mask; data_len &= ~page_mask;
len += page_bytes; data_len += page_bytes;
} }
struct object *obj = object_create(&vm_object_type); struct object *obj = object_create(&vm_object_type);
@@ -88,12 +89,13 @@ struct vm_object *vm_object_create(
struct vm_object *out = VM_OBJECT_CAST(obj); struct vm_object *out = VM_OBJECT_CAST(obj);
out->vo_size = len; out->vo_size = data_len;
out->vo_prot = prot; out->vo_prot = prot;
if (name) { if (name && name_len) {
strncpy(out->vo_name, name, sizeof out->vo_name); name_len = MIN(sizeof out->vo_name - 1, name_len);
out->vo_name[sizeof out->vo_name - 1] = '\0'; memcpy(out->vo_name, name, name_len);
out->vo_name[name_len] = '\0';
} }
return out; return out;
@@ -101,11 +103,13 @@ struct vm_object *vm_object_create(
extern struct vm_object *vm_object_create_in_place( extern struct vm_object *vm_object_create_in_place(
const char *name, const char *name,
size_t name_len,
phys_addr_t base, phys_addr_t base,
size_t len, size_t data_len,
enum vm_prot prot) vm_prot_t prot)
{ {
struct vm_object *vmo = vm_object_create(name, len, prot); struct vm_object *vmo
= vm_object_create(name, name_len, data_len, prot);
if (!vmo) { if (!vmo) {
return NULL; return NULL;
} }

View File

@@ -474,26 +474,36 @@ kern_status_t vm_region_type_init(void)
return object_type_register(&vm_region_type); return object_type_register(&vm_region_type);
} }
struct vm_region *vm_region_cast(struct object *obj)
{
return VM_REGION_CAST(obj);
}
kern_status_t vm_region_create( kern_status_t vm_region_create(
struct vm_region *parent, struct vm_region *parent,
const char *name, const char *name,
size_t name_len,
off_t offset, off_t offset,
size_t len, size_t region_len,
enum vm_prot prot, vm_prot_t prot,
struct vm_region **out) struct vm_region **out)
{ {
if (!offset || !len) { if (!offset || !region_len) {
return KERN_INVALID_ARGUMENT; return KERN_INVALID_ARGUMENT;
} }
if (len & VM_PAGE_MASK) { if (region_len & VM_PAGE_MASK) {
len &= ~VM_PAGE_MASK; region_len &= ~VM_PAGE_MASK;
len += VM_PAGE_SIZE; region_len += VM_PAGE_SIZE;
} }
kern_status_t status = KERN_OK; kern_status_t status = KERN_OK;
if (parent) { if (parent) {
status = region_validate_allocation(parent, prot, &offset, len); status = region_validate_allocation(
parent,
prot,
&offset,
region_len);
} }
if (status != KERN_OK) { if (status != KERN_OK) {
@@ -510,7 +520,13 @@ kern_status_t vm_region_create(
region->vr_prot = prot; region->vr_prot = prot;
region->vr_entry.e_type = VM_REGION_ENTRY_REGION; region->vr_entry.e_type = VM_REGION_ENTRY_REGION;
region->vr_entry.e_offset = offset; region->vr_entry.e_offset = offset;
region->vr_entry.e_size = len; region->vr_entry.e_size = region_len;
#ifdef TRACE
tracek("creating sub-region at [%llx-%llx]",
offset,
offset + region_len);
#endif
if (parent) { if (parent) {
region->vr_entry.e_parent = &parent->vr_entry; region->vr_entry.e_parent = &parent->vr_entry;
@@ -518,9 +534,10 @@ kern_status_t vm_region_create(
region_put_entry(parent, &region->vr_entry); region_put_entry(parent, &region->vr_entry);
} }
if (name) { if (name && name_len) {
strncpy(region->vr_name, name, sizeof region->vr_name); name_len = MIN(sizeof region->vr_name - 1, name_len);
region->vr_name[sizeof region->vr_name - 1] = '\0'; memcpy(region->vr_name, name, name_len);
region->vr_name[name_len] = '\0';
} }
*out = region; *out = region;