eliminate enter_alloc -- use kalloc for everything
This commit is contained in:
parent
7e7cb106d0
commit
c092540e39
4 changed files with 53 additions and 51 deletions
25
vm.c
25
vm.c
|
|
@ -43,7 +43,7 @@ seginit(void)
|
|||
// that corresponds to virtual address va. If alloc!=0,
|
||||
// create any required page table pages.
|
||||
static pte_t *
|
||||
walkpgdir(pde_t *pgdir, const void *va, char* (*alloc)(void))
|
||||
walkpgdir(pde_t *pgdir, const void *va, int alloc)
|
||||
{
|
||||
pde_t *pde;
|
||||
pte_t *pgtab;
|
||||
|
|
@ -52,7 +52,7 @@ walkpgdir(pde_t *pgdir, const void *va, char* (*alloc)(void))
|
|||
if(*pde & PTE_P){
|
||||
pgtab = (pte_t*)p2v(PTE_ADDR(*pde));
|
||||
} else {
|
||||
if(!alloc || (pgtab = (pte_t*)alloc()) == 0)
|
||||
if(!alloc || (pgtab = (pte_t*)kalloc()) == 0)
|
||||
return 0;
|
||||
// Make sure all those PTE_P bits are zero.
|
||||
memset(pgtab, 0, PGSIZE);
|
||||
|
|
@ -68,8 +68,7 @@ walkpgdir(pde_t *pgdir, const void *va, char* (*alloc)(void))
|
|||
// physical addresses starting at pa. va and size might not
|
||||
// be page-aligned.
|
||||
static int
|
||||
mappages(pde_t *pgdir, void *va, uint size, uint pa,
|
||||
int perm, char* (*alloc)(void))
|
||||
mappages(pde_t *pgdir, void *va, uint size, uint pa, int perm)
|
||||
{
|
||||
char *a, *last;
|
||||
pte_t *pte;
|
||||
|
|
@ -77,7 +76,7 @@ mappages(pde_t *pgdir, void *va, uint size, uint pa,
|
|||
a = (char*)PGROUNDDOWN((uint)va);
|
||||
last = (char*)PGROUNDDOWN(((uint)va) + size - 1);
|
||||
for(;;){
|
||||
if((pte = walkpgdir(pgdir, a, alloc)) == 0)
|
||||
if((pte = walkpgdir(pgdir, a, 1)) == 0)
|
||||
return -1;
|
||||
if(*pte & PTE_P)
|
||||
panic("remap");
|
||||
|
|
@ -127,19 +126,19 @@ static struct kmap {
|
|||
|
||||
// Set up kernel part of a page table.
|
||||
pde_t*
|
||||
setupkvm(char* (*alloc)(void))
|
||||
setupkvm()
|
||||
{
|
||||
pde_t *pgdir;
|
||||
struct kmap *k;
|
||||
|
||||
if((pgdir = (pde_t*)alloc()) == 0)
|
||||
if((pgdir = (pde_t*)kalloc()) == 0)
|
||||
return 0;
|
||||
memset(pgdir, 0, PGSIZE);
|
||||
if (p2v(PHYSTOP) > (void*)DEVSPACE)
|
||||
panic("PHYSTOP too high");
|
||||
for(k = kmap; k < &kmap[NELEM(kmap)]; k++)
|
||||
if(mappages(pgdir, k->virt, k->phys_end - k->phys_start,
|
||||
(uint)k->phys_start, k->perm, alloc) < 0)
|
||||
(uint)k->phys_start, k->perm) < 0)
|
||||
return 0;
|
||||
return pgdir;
|
||||
}
|
||||
|
|
@ -149,7 +148,7 @@ setupkvm(char* (*alloc)(void))
|
|||
void
|
||||
kvmalloc(void)
|
||||
{
|
||||
kpgdir = setupkvm(enter_alloc);
|
||||
kpgdir = setupkvm();
|
||||
switchkvm();
|
||||
}
|
||||
|
||||
|
|
@ -188,7 +187,7 @@ inituvm(pde_t *pgdir, char *init, uint sz)
|
|||
panic("inituvm: more than a page");
|
||||
mem = kalloc();
|
||||
memset(mem, 0, PGSIZE);
|
||||
mappages(pgdir, 0, PGSIZE, v2p(mem), PTE_W|PTE_U, kalloc);
|
||||
mappages(pgdir, 0, PGSIZE, v2p(mem), PTE_W|PTE_U);
|
||||
memmove(mem, init, sz);
|
||||
}
|
||||
|
||||
|
|
@ -238,7 +237,7 @@ allocuvm(pde_t *pgdir, uint oldsz, uint newsz)
|
|||
return 0;
|
||||
}
|
||||
memset(mem, 0, PGSIZE);
|
||||
mappages(pgdir, (char*)a, PGSIZE, v2p(mem), PTE_W|PTE_U, kalloc);
|
||||
mappages(pgdir, (char*)a, PGSIZE, v2p(mem), PTE_W|PTE_U);
|
||||
}
|
||||
return newsz;
|
||||
}
|
||||
|
|
@ -315,7 +314,7 @@ copyuvm(pde_t *pgdir, uint sz)
|
|||
uint pa, i;
|
||||
char *mem;
|
||||
|
||||
if((d = setupkvm(kalloc)) == 0)
|
||||
if((d = setupkvm()) == 0)
|
||||
return 0;
|
||||
for(i = 0; i < sz; i += PGSIZE){
|
||||
if((pte = walkpgdir(pgdir, (void *) i, 0)) == 0)
|
||||
|
|
@ -326,7 +325,7 @@ copyuvm(pde_t *pgdir, uint sz)
|
|||
if((mem = kalloc()) == 0)
|
||||
goto bad;
|
||||
memmove(mem, (char*)p2v(pa), PGSIZE);
|
||||
if(mappages(d, (void*)i, PGSIZE, v2p(mem), PTE_W|PTE_U, kalloc) < 0)
|
||||
if(mappages(d, (void*)i, PGSIZE, v2p(mem), PTE_W|PTE_U) < 0)
|
||||
goto bad;
|
||||
}
|
||||
return d;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue