From 090a4e46ea7f4f34510a03e59cb26005a1a41492 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Tue, 17 Mar 2026 21:52:12 +0100 Subject: [PATCH] Environments now belong to procgroups, modify env_set () and env_get () accordingly --- kernel/amd64/proc.c | 2 -- kernel/proc/env.c | 30 ++++++++++++++-------------- kernel/proc/env.h | 8 ++++---- kernel/proc/proc.h | 2 -- kernel/proc/procgroup.c | 3 +++ kernel/proc/procgroup.h | 2 ++ kernel/syscall/syscall.c | 42 +++++++++++++++++++++------------------- 7 files changed, 46 insertions(+), 43 deletions(-) diff --git a/kernel/amd64/proc.c b/kernel/amd64/proc.c index a7a5fa5..b5d54fe 100644 --- a/kernel/amd64/proc.c +++ b/kernel/amd64/proc.c @@ -139,8 +139,6 @@ void proc_cleanup (struct proc* proc, struct reschedule_ctx* rctx) { proc_sqs_cleanup (proc); proc_mutexes_cleanup (proc, rctx); - proc_env_cleanup (proc); - pmm_free (proc->pdata.kernel_stack, KSTACK_SIZE / PAGE_SIZE); procgroup_unmap (proc->procgroup, proc->pdata.tls_vaddr, proc->procgroup->tls.tls_tmpl_pages); diff --git a/kernel/proc/env.c b/kernel/proc/env.c index 65adb13..6c281bb 100644 --- a/kernel/proc/env.c +++ b/kernel/proc/env.c @@ -6,12 +6,12 @@ #include #include #include -#include +#include #include -void proc_env_cleanup (struct proc* proc) { +void proc_env_cleanup (struct procgroup* procgroup) { for (size_t i = 0; i < fieldlengthof (struct proc_env, env_var_buckets); i++) { - struct hash_node_link* link = proc->env.env_var_buckets[i]; + struct hash_node_link* link = procgroup->env.env_var_buckets[i]; if (link == NULL) continue; @@ -23,8 +23,8 @@ void proc_env_cleanup (struct proc* proc) { } } -int proc_env_set (struct proc* proc, const char* key, void* buffer, size_t data_size) { - uint64_t fp; +int proc_env_set (struct procgroup* procgroup, const char* key, void* buffer, size_t data_size) { + uint64_t fpg; struct proc_env_var* var = malloc (sizeof (*var)); @@ -46,30 +46,30 @@ int proc_env_set (struct proc* proc, const char* key, void* buffer, size_t data_ uint32_t env_hash = hash_fnv32 (var->key, strlen_null (var->key)); - spin_lock (&proc->lock, &fp); + spin_lock (&procgroup->lock, &fpg); - hash_insert (&proc->env, &var->env_link, env_hash, lengthof (proc->env.env_var_buckets), + hash_insert (&procgroup->env, &var->env_link, env_hash, lengthof (procgroup->env.env_var_buckets), env_var_buckets); - spin_unlock (&proc->lock, fp); + spin_unlock (&procgroup->lock, fpg); return ST_OK; } -int proc_env_get (struct proc* proc, const char* key, void* buffer, size_t size) { - uint64_t fp; +int proc_env_get (struct procgroup* procgroup, const char* key, void* buffer, size_t size) { + uint64_t fpg; struct hash_node_link* found_link = NULL; size_t key_len = strlen_null (key); uint32_t hash = hash_fnv32 (key, key_len); - spin_lock (&proc->lock, &fp); + spin_lock (&procgroup->lock, &fpg); - hash_find (&proc->env, key, key_len, hash, lengthof (proc->env.env_var_buckets), env_var_buckets, - struct proc_env_var, env_link, key, found_link); + hash_find (&procgroup->env, key, key_len, hash, lengthof (procgroup->env.env_var_buckets), + env_var_buckets, struct proc_env_var, env_link, key, found_link); if (found_link == NULL) { - spin_unlock (&proc->lock, fp); + spin_unlock (&procgroup->lock, fpg); return -ST_NOT_FOUND; } @@ -77,7 +77,7 @@ int proc_env_get (struct proc* proc, const char* key, void* buffer, size_t size) memcpy (buffer, var->buffer, min (size, var->data_size)); - spin_unlock (&proc->lock, fp); + spin_unlock (&procgroup->lock, fpg); return ST_OK; } diff --git a/kernel/proc/env.h b/kernel/proc/env.h index 9f26ba7..a73f57f 100644 --- a/kernel/proc/env.h +++ b/kernel/proc/env.h @@ -6,7 +6,7 @@ #define PROC_ENV_VAR_MAX 128 -struct proc; +struct procgroup; struct proc_env_var { char key[PROC_ENV_VAR_MAX]; @@ -19,10 +19,10 @@ struct proc_env { struct hash_node_link* env_var_buckets[64]; }; -void proc_env_cleanup (struct proc* proc); +void proc_env_cleanup (struct procgroup* procgroup); -int proc_env_set (struct proc* proc, const char* key, void* buffer, size_t data_size); +int proc_env_set (struct procgroup* procgroup, const char* key, void* buffer, size_t data_size); -int proc_env_get (struct proc* proc, const char* key, void* buffer, size_t size); +int proc_env_get (struct procgroup* procgroup, const char* key, void* buffer, size_t size); #endif // _KERNEL_PROC_ENV_H diff --git a/kernel/proc/proc.h b/kernel/proc/proc.h index d435851..d845c75 100644 --- a/kernel/proc/proc.h +++ b/kernel/proc/proc.h @@ -7,7 +7,6 @@ #include #include #include -#include #include #include #include @@ -51,7 +50,6 @@ struct proc { size_t mail_recv_size; char cwv[VOLUME_MAX]; struct proc_suspension_q done_sq; - struct proc_env env; }; void proc_sched (bool user); diff --git a/kernel/proc/procgroup.c b/kernel/proc/procgroup.c index e89d12b..c9067b2 100644 --- a/kernel/proc/procgroup.c +++ b/kernel/proc/procgroup.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -238,6 +239,8 @@ static void procgroup_delete (struct procgroup* procgroup, struct reschedule_ctx free (mapping); } + proc_env_cleanup (procgroup); + pmm_free (procgroup->pd.cr3_paddr, 1); free (procgroup->tls.tls_tmpl); diff --git a/kernel/proc/procgroup.h b/kernel/proc/procgroup.h index 69dcc46..f76d027 100644 --- a/kernel/proc/procgroup.h +++ b/kernel/proc/procgroup.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -35,6 +36,7 @@ struct procgroup { struct list_node_link* mappings; uintptr_t map_base; struct procgroup_tls tls; + struct proc_env env; }; struct procgroup* procgroup_create (void); diff --git a/kernel/syscall/syscall.c b/kernel/syscall/syscall.c index 72ac23a..d7689fc 100644 --- a/kernel/syscall/syscall.c +++ b/kernel/syscall/syscall.c @@ -651,7 +651,7 @@ DEFINE_SYSCALL (sys_describe) { /* int get_procgroup (int pid) */ DEFINE_SYSCALL (sys_get_procgroup) { - uint64_t fp; + uint64_t fp, fpg; int pid = (int)a1; @@ -661,9 +661,13 @@ DEFINE_SYSCALL (sys_get_procgroup) { return SYSRESULT (-ST_NOT_FOUND); spin_lock (&target_proc->lock, &fp); - int pgid = target_proc->procgroup->pgid; + struct procgroup* procgroup = target_proc->procgroup; spin_unlock (&target_proc->lock, fp); + spin_lock (&procgroup->lock, &fpg); + int pgid = procgroup->pgid; + spin_unlock (&procgroup->lock, fpg); + return SYSRESULT (pgid); } @@ -932,28 +936,27 @@ DEFINE_SYSCALL (sys_create_volume) { return SYSRESULT (vfs_create_volume (proc, rctx, key, type, device, false)); } -/* int env_set (int pid, char* key, void* buffer, size_t size) */ +/* int env_set (int pgid, char* key, void* buffer, size_t size) */ DEFINE_SYSCALL (sys_env_set) { uint64_t fp, fpg; - int pid = (int)a1; + int pgid = (int)a1; uintptr_t uvaddr_key = a2; uintptr_t uvaddr_buffer = a3; size_t size = (size_t)a4; struct limine_hhdm_response* hhdm = limine_hhdm_request.response; - struct proc* target_proc = proc_find_pid (pid); + struct procgroup* target_procgroup = procgroup_find (pgid); - if (target_proc == NULL) { + if (target_procgroup == NULL) return SYSRESULT (-ST_NOT_FOUND); - } uintptr_t out_paddr; - spin_lock (&target_proc->lock, &fp); - struct procgroup* procgroup = target_proc->procgroup; - spin_unlock (&target_proc->lock, fp); + spin_lock (&proc->lock, &fp); + struct procgroup* procgroup = proc->procgroup; + spin_unlock (&proc->lock, fp); spin_lock (&procgroup->lock, &fpg); @@ -973,31 +976,30 @@ DEFINE_SYSCALL (sys_env_set) { if (buffer == NULL) return SYSRESULT (-ST_BAD_ADDRESS_SPACE); - return SYSRESULT (proc_env_set (target_proc, key, buffer, size)); + return SYSRESULT (proc_env_set (target_procgroup, key, buffer, size)); } -/* int env_get (int pid, char* key, void* buffer, size_t size) */ +/* int env_get (int pgid, char* key, void* buffer, size_t size) */ DEFINE_SYSCALL (sys_env_get) { uint64_t fp, fpg; - int pid = (int)a1; + int pgid = (int)a1; uintptr_t uvaddr_key = a2; uintptr_t uvaddr_buffer = a3; size_t size = (size_t)a4; struct limine_hhdm_response* hhdm = limine_hhdm_request.response; - struct proc* target_proc = proc_find_pid (pid); + struct procgroup* target_procgroup = procgroup_find (pgid); - if (target_proc == NULL) { + if (target_procgroup == NULL) return SYSRESULT (-ST_NOT_FOUND); - } uintptr_t out_paddr; - spin_lock (&target_proc->lock, &fp); - struct procgroup* procgroup = target_proc->procgroup; - spin_unlock (&target_proc->lock, fp); + spin_lock (&proc->lock, &fp); + struct procgroup* procgroup = proc->procgroup; + spin_unlock (&proc->lock, fp); spin_lock (&procgroup->lock, &fpg); @@ -1017,7 +1019,7 @@ DEFINE_SYSCALL (sys_env_get) { if (buffer == NULL) return SYSRESULT (-ST_BAD_ADDRESS_SPACE); - return SYSRESULT (proc_env_set (target_proc, key, buffer, size)); + return SYSRESULT (proc_env_set (target_procgroup, key, buffer, size)); } static syscall_handler_func_t handler_table[] = {