summaryrefslogtreecommitdiff
path: root/kernel/proc.c
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2019-07-22 13:32:33 -0400
committerFrans Kaashoek <[email protected]>2019-07-22 13:32:33 -0400
commitc5d48db0456472d4edb3ac47763b23141839ca47 (patch)
tree16b76ce07dba7d4c4b6634b0a313f848eac56d99 /kernel/proc.c
parent328204d9cc3995a44bb3cce2f5206e392a8601a7 (diff)
parent06109901c9c12733e86fb1b264dabef60655de04 (diff)
downloadxv6-labs-c5d48db0456472d4edb3ac47763b23141839ca47.tar.gz
xv6-labs-c5d48db0456472d4edb3ac47763b23141839ca47.tar.bz2
xv6-labs-c5d48db0456472d4edb3ac47763b23141839ca47.zip
Merge branch 'riscv-kstack' into riscv
Diffstat (limited to 'kernel/proc.c')
-rw-r--r--kernel/proc.c20
1 files changed, 7 insertions, 13 deletions
diff --git a/kernel/proc.c b/kernel/proc.c
index edb6001..b9babed 100644
--- a/kernel/proc.c
+++ b/kernel/proc.c
@@ -26,8 +26,14 @@ procinit(void)
struct proc *p;
initlock(&pid_lock, "nextpid");
- for(p = proc; p < &proc[NPROC]; p++)
+ for(p = proc; p < &proc[NPROC]; p++) {
initlock(&p->lock, "proc");
+ // Allocate a page for the kernel stack.
+ char *kstack = (char *) KSTACK((int) (p - proc));
+ if((p->kstack = map_kstack(kstack)) == 0) {
+ panic("procinit");
+ }
+ }
}
// Must be called with interrupts disabled,
@@ -94,16 +100,8 @@ allocproc(void)
found:
p->pid = allocpid();
- // Allocate a page for the kernel stack.
- if((p->kstack = kalloc()) == 0){
- release(&p->lock);
- return 0;
- }
-
// Allocate a trapframe page.
if((p->tf = (struct trapframe *)kalloc()) == 0){
- kfree(p->kstack);
- p->kstack = 0;
release(&p->lock);
return 0;
}
@@ -126,9 +124,6 @@ found:
static void
freeproc(struct proc *p)
{
- if(p->kstack)
- kfree(p->kstack);
- p->kstack = 0;
if(p->tf)
kfree((void*)p->tf);
p->tf = 0;
@@ -643,4 +638,3 @@ procdump(void)
printf("\n");
}
}
-