diff options
author | Robert Morris <[email protected]> | 2020-10-20 06:58:58 -0400 |
---|---|---|
committer | Robert Morris <[email protected]> | 2020-10-20 06:58:58 -0400 |
commit | 55ad99f7293fc6d639a30d36820a770ee71a6cae (patch) | |
tree | e7ad4e929e3f5d5e6e9bc023c8b221f597bd2b90 /kernel/proc.c | |
parent | 286b2f3c3306a621c415e8c7ce67bc2a6501998a (diff) | |
parent | 05a7db1a0a20187760d8a78ff7badfa4cc7e3314 (diff) | |
download | xv6-labs-55ad99f7293fc6d639a30d36820a770ee71a6cae.tar.gz xv6-labs-55ad99f7293fc6d639a30d36820a770ee71a6cae.tar.bz2 xv6-labs-55ad99f7293fc6d639a30d36820a770ee71a6cae.zip |
Merge branch 'riscv' of g.csail.mit.edu:xv6-dev into riscv
Diffstat (limited to 'kernel/proc.c')
-rw-r--r-- | kernel/proc.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/kernel/proc.c b/kernel/proc.c index 56314e5..d847c43 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -21,6 +21,23 @@ static void freeproc(struct proc *p); extern char trampoline[]; // trampoline.S + +// Allocate a page for each process's kernel stack. +// Map it high in memory, followed by an invalid +// guard page. +void +proc_mapstacks(pagetable_t kpgtbl) { + struct proc *p; + + for(p = proc; p < &proc[NPROC]; p++) { + char *pa = kalloc(); + if(pa == 0) + panic("kalloc"); + uint64 va = KSTACK((int) (p - proc)); + kvmmap(kpgtbl, va, (uint64)pa, PGSIZE, PTE_R | PTE_W); + } +} + // initialize the proc table at boot time. void procinit(void) @@ -30,18 +47,8 @@ procinit(void) initlock(&pid_lock, "nextpid"); for(p = proc; p < &proc[NPROC]; p++) { initlock(&p->lock, "proc"); - - // Allocate a page for the process's kernel stack. - // Map it high in memory, followed by an invalid - // guard page. - char *pa = kalloc(); - if(pa == 0) - panic("kalloc"); - uint64 va = KSTACK((int) (p - proc)); - kvmmap(va, (uint64)pa, PGSIZE, PTE_R | PTE_W); - p->kstack = va; + p->kstack = KSTACK((int) (p - proc)); } - kvminithart(); } // Must be called with interrupts disabled, |