summaryrefslogtreecommitdiff
path: root/src/kernel/proc/proc.cc
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-01-01 15:04:47 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-01-01 15:04:47 +0800
commit2dde56422dcfb94affee2baffc8d240ad16ad4b2 (patch)
treeaeee8a0dad24ceaca22585f773411e386c8019be /src/kernel/proc/proc.cc
parent0a6815b7143a8ffd0e09777b5fbd12098d8884c2 (diff)
downloadlume-2dde56422dcfb94affee2baffc8d240ad16ad4b2.tar.gz
lume-2dde56422dcfb94affee2baffc8d240ad16ad4b2.tar.xz
dev(device): implement VirtIO
See dev log for detail
Diffstat (limited to 'src/kernel/proc/proc.cc')
-rw-r--r--src/kernel/proc/proc.cc33
1 files changed, 31 insertions, 2 deletions
diff --git a/src/kernel/proc/proc.cc b/src/kernel/proc/proc.cc
index e99b83d..c8b6d1d 100644
--- a/src/kernel/proc/proc.cc
+++ b/src/kernel/proc/proc.cc
@@ -471,7 +471,6 @@ namespace ProcManager
int wait(uint64 addr)
{
- (void)addr;
struct Proc *np;
int havekids, pid;
@@ -499,6 +498,11 @@ namespace ProcManager
}
pid = np->pid;
+ if (addr != 0 && VM::copyout(p->pagetable, addr, (char *)&np->xstate, sizeof(np->xstate)) < 0)
+ {
+ proc_mem_lock.release();
+ return -1;
+ }
freeproc(np);
proc_mem_lock.release();
return pid;
@@ -509,8 +513,33 @@ namespace ProcManager
if (!havekids || p->state == ZOMBIE)
return -1;
- sleep(p, nullptr);
+ sleep(p, &proc_mem_lock);
+ }
+ }
+
+ int growproc(int n)
+ {
+ uint64 sz;
+ struct Proc *p = myproc();
+
+ sz = p->sz;
+
+ if (n > 0)
+ {
+ // Call VM::uvmalloc to allocate memory
+ // Parameters: page table, old size, new size, permissions (PTE_W)
+ if ((sz = VM::uvmalloc(p->pagetable, sz, sz + n, PTE_W)) == 0)
+ {
+ return -1;
+ }
}
+ else if (n < 0)
+ {
+ sz = VM::uvmdealloc(p->pagetable, sz, sz + n);
+ }
+
+ p->sz = sz;
+ return 0;
}
void create_kernel_thread(void (*func)(), const char *name)