summaryrefslogtreecommitdiff
path: root/vm.c
diff options
context:
space:
mode:
authorAustin Clements <[email protected]>2010-09-02 15:37:05 -0400
committerAustin Clements <[email protected]>2010-09-02 15:42:25 -0400
commitf53e6110bed159c8541c6e0d2fc1b1ffac2d141a (patch)
treeb71b99eb612d27fb054a07ff149668e579fb5fb2 /vm.c
parentb3cfd7fc372424d754f5478c93f6fbe756d9c80f (diff)
downloadxv6-labs-f53e6110bed159c8541c6e0d2fc1b1ffac2d141a.tar.gz
xv6-labs-f53e6110bed159c8541c6e0d2fc1b1ffac2d141a.tar.bz2
xv6-labs-f53e6110bed159c8541c6e0d2fc1b1ffac2d141a.zip
Simplify inituvm and userinit by assuming initcode fits on a page
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c20
1 files changed, 7 insertions, 13 deletions
diff --git a/vm.c b/vm.c
index 12aebe5..9c0783d 100644
--- a/vm.c
+++ b/vm.c
@@ -267,20 +267,14 @@ loaduvm(pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz)
}
void
-inituvm(pde_t *pgdir, char *addr, char *init, uint sz)
+inituvm(pde_t *pgdir, char *init, uint sz)
{
- uint i, pa, n, off;
- pte_t *pte;
-
- for(i = 0; i < sz; i += PGSIZE){
- if(!(pte = walkpgdir(pgdir, (void *)(i+addr), 0)))
- panic("inituvm: pte should exist\n");
- off = (i+(uint)addr) % PGSIZE;
- pa = PTE_ADDR(*pte);
- if(sz - i < PGSIZE) n = sz - i;
- else n = PGSIZE;
- memmove((char *)pa+off, init+i, n);
- }
+ char *mem = kalloc();
+ if (sz >= PGSIZE)
+ panic("inituvm: more than a page");
+ memset(mem, 0, PGSIZE);
+ mappages(pgdir, 0, PGSIZE, PADDR(mem), PTE_W|PTE_U);
+ memmove(mem, init, sz);
}
// given a parent process's page table, create a copy