diff options
author | Frans Kaashoek <[email protected]> | 2010-08-26 08:03:18 -0400 |
---|---|---|
committer | Frans Kaashoek <[email protected]> | 2010-08-26 08:03:18 -0400 |
commit | d55b2fac074ac23e30c337014f40ae2156b31b60 (patch) | |
tree | bb9885972bf8929e7957f9ea512a8befaf06b11c /proc.c | |
parent | d87f51c5a1c5e7a2a3ba111b1052a297f4f96fb0 (diff) | |
parent | 789b508d538e6faf635e49f268a4f1f9e9b65f05 (diff) | |
download | xv6-labs-d55b2fac074ac23e30c337014f40ae2156b31b60.tar.gz xv6-labs-d55b2fac074ac23e30c337014f40ae2156b31b60.tar.bz2 xv6-labs-d55b2fac074ac23e30c337014f40ae2156b31b60.zip |
Merge commit 'origin/page' into page
Diffstat (limited to 'proc.c')
-rw-r--r-- | proc.c | 19 |
1 files changed, 12 insertions, 7 deletions
@@ -142,10 +142,15 @@ userinit(void) int growproc(int n) { - if (!allocuvm(proc->pgdir, (char *)proc->sz, n)) - return -1; + if(n > 0){ + if (!allocuvm(proc->pgdir, (char *)proc->sz, n)) + return -1; + } else if(n < 0){ + if (!deallocuvm(proc->pgdir, (char *)(proc->sz + n), 0 - n)) + return -1; + } proc->sz += n; - loadvm(proc); + switchuvm(proc); return 0; } @@ -214,9 +219,10 @@ scheduler(void) // to release ptable.lock and then reacquire it // before jumping back to us. proc = p; - loadvm(p); + switchuvm(p); p->state = RUNNING; swtch(&cpu->scheduler, proc->context); + switchkvm(); // Process is done running for now. // It should have changed its p->state before coming back. @@ -242,7 +248,6 @@ sched(void) panic("sched running"); if(readeflags()&FL_IF) panic("sched interruptible"); - lcr3(PADDR(kpgdir)); // Switch to the kernel page table intena = cpu->intena; swtch(&proc->context, cpu->scheduler); cpu->intena = intena; @@ -414,9 +419,9 @@ wait(void) // Found one. pid = p->pid; kfree(p->kstack, KSTACKSIZE); - freevm(p->pgdir); + p->kstack = 0; + freevm(p->pgdir); p->state = UNUSED; - p->kstack = 0; p->pid = 0; p->parent = 0; p->name[0] = 0; |