From 7a32267fcc81af31d595373884911d503b0a9df8 Mon Sep 17 00:00:00 2001
From: Ian Moffett <ian@osmora.org>
Date: Thu, 14 Mar 2024 20:55:54 -0400
Subject: kernel: sched: Keep track of stack and privilege

Signed-off-by: Ian Moffett <ian@osmora.org>
---
 sys/include/sys/proc.h |  2 ++
 sys/kern/kern_sched.c  | 16 ++++++++++------
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/sys/include/sys/proc.h b/sys/include/sys/proc.h
index 34a5037..7181ecb 100644
--- a/sys/include/sys/proc.h
+++ b/sys/include/sys/proc.h
@@ -47,6 +47,8 @@ struct proc {
     struct trapframe *tf;
     struct pcb pcb;
     struct vas addrsp;
+    uintptr_t stack_base;
+    uint8_t is_user;
     TAILQ_ENTRY(proc) link;
 };
 
diff --git a/sys/kern/kern_sched.c b/sys/kern/kern_sched.c
index bc96146..f985f62 100644
--- a/sys/kern/kern_sched.c
+++ b/sys/kern/kern_sched.c
@@ -208,7 +208,7 @@ sched_init_stack(void *stack_top, char *argvp[], char *envp[], struct auxval aux
 
 static uintptr_t
 sched_create_stack(struct vas vas, bool user, char *argvp[],
-                   char *envp[], struct auxval auxv)
+                   char *envp[], struct auxval auxv, struct proc *td)
 {
     int status;
     uintptr_t stack;
@@ -216,10 +216,12 @@ sched_create_stack(struct vas vas, bool user, char *argvp[],
 
     if (!user) {
         stack = (uintptr_t)dynalloc(STACK_SIZE);
+        td->stack_base = (uintptr_t)stack;
         return sched_init_stack((void *)(stack + STACK_SIZE), argvp, envp, auxv);
     }
 
     stack = vm_alloc_pageframe(STACK_PAGES);
+    td->stack_base = stack;
     status = vm_map_create(vas, stack, stack, USER_STACK_PROT, STACK_SIZE);
 
     if (status != 0) {
@@ -244,16 +246,17 @@ sched_create_td(uintptr_t rip, char *argvp[], char *envp[], struct auxval auxv,
         return NULL;
     }
 
-    stack = sched_create_stack(vas, is_user, argvp, envp, auxv);
-    if (stack == 0) {
+    td = dynalloc(sizeof(struct proc));
+    if (td == NULL) {
+        /* TODO: Free stack */
         dynfree(tf);
         return NULL;
     }
 
-    td = dynalloc(sizeof(struct proc));
-    if (td == NULL) {
-        /* TODO: Free stack */
+    stack = sched_create_stack(vas, is_user, argvp, envp, auxv, td);
+    if (stack == 0) {
         dynfree(tf);
+        dynfree(td);
         return NULL;
     }
 
@@ -265,6 +268,7 @@ sched_create_td(uintptr_t rip, char *argvp[], char *envp[], struct auxval auxv,
     td->cpu = NULL;     /* Not yet assigned a core */
     td->tf = tf;
     td->addrsp = vas;
+    td->is_user = is_user;
     processor_init_pcb(td);
 
     /* Setup trapframe */
-- 
cgit v1.2.3