diff options
author | Austin Clements <[email protected]> | 2010-09-02 15:37:05 -0400 |
---|---|---|
committer | Austin Clements <[email protected]> | 2010-09-02 15:42:25 -0400 |
commit | f53e6110bed159c8541c6e0d2fc1b1ffac2d141a (patch) | |
tree | b71b99eb612d27fb054a07ff149668e579fb5fb2 /vm.c | |
parent | b3cfd7fc372424d754f5478c93f6fbe756d9c80f (diff) | |
download | xv6-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.c | 20 |
1 files changed, 7 insertions, 13 deletions
@@ -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 |