提交 7559ced5 创建 作者: Frans Kaashoek's avatar Frans Kaashoek

get rid off clearpages

上级 37eec3b1
...@@ -258,7 +258,7 @@ void switchkvm(void); ...@@ -258,7 +258,7 @@ void switchkvm(void);
int copyout(struct vmap *, uint, void*, uint); int copyout(struct vmap *, uint, void*, uint);
int copyin(struct vmap *, uint, void*, uint); int copyin(struct vmap *, uint, void*, uint);
int pagefault(struct vmap *, uint, uint); int pagefault(struct vmap *, uint, uint);
void clearpages(pde_t *pgdir, void *begin, void *end); void updatepages(pde_t *pgdir, void *begin, void *end, int perm);
// namecache.c // namecache.c
void nc_init(); void nc_init();
......
...@@ -132,9 +132,9 @@ sys_unmap(void) ...@@ -132,9 +132,9 @@ sys_unmap(void)
if (vmap_remove(proc->vmap, PGROUNDDOWN(addr), PGROUNDUP(len)) < 0) if (vmap_remove(proc->vmap, PGROUNDDOWN(addr), PGROUNDUP(len)) < 0)
return -1; return -1;
clearpages(proc->vmap->pgdir, updatepages(proc->vmap->pgdir,
(void*) (PGROUNDDOWN(addr)), (void*) (PGROUNDDOWN(addr)),
(void*) (PGROUNDDOWN(addr)+PGROUNDUP(len))); (void*) (PGROUNDDOWN(addr)+PGROUNDUP(len)), 0);
cli(); cli();
lcr3(v2p(proc->vmap->pgdir)); lcr3(v2p(proc->vmap->pgdir));
for (uint i = 0; i < ncpu; i++) for (uint i = 0; i < ncpu; i++)
......
...@@ -18,6 +18,7 @@ static pde_t *kpgdir __attribute__ ((aligned (CACHELINE))); // for use in sched ...@@ -18,6 +18,7 @@ static pde_t *kpgdir __attribute__ ((aligned (CACHELINE))); // for use in sched
struct segdesc gdt[NSEGS]; struct segdesc gdt[NSEGS];
// page map for during boot // page map for during boot
// XXX build a static page table in assembly
static void static void
pgmap(void *va, void *last, uint pa) pgmap(void *va, void *last, uint pa)
{ {
...@@ -93,7 +94,6 @@ seginit(void) ...@@ -93,7 +94,6 @@ seginit(void)
// Map cpu, curproc, kmem // Map cpu, curproc, kmem
c->gdt[SEG_KCPU] = SEG(STA_W, &c->cpu, 12, 0); c->gdt[SEG_KCPU] = SEG(STA_W, &c->cpu, 12, 0);
// lgt((void *) v2p((void*)(c->gdt)), sizeof(c->gdt));
lgdt((void *)(c->gdt), sizeof(c->gdt)); lgdt((void *)(c->gdt), sizeof(c->gdt));
loadgs(SEG_KCPU << 3); loadgs(SEG_KCPU << 3);
...@@ -184,26 +184,8 @@ mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm) ...@@ -184,26 +184,8 @@ mappages(pde_t *pgdir, void *la, uint size, uint pa, int perm)
return 0; return 0;
} }
static void
updatepages(pde_t *pgdir, void *begin, void *end, int perm)
{
char *a, *last;
pte_t *pte;
a = PGROUNDDOWN(begin);
last = PGROUNDDOWN(end);
for (;;) {
pte = walkpgdir(pgdir, a, 1);
if(pte != 0)
*pte = PTE_ADDR(*pte) | perm | PTE_P;
if (a == last)
break;
a += PGSIZE;
}
}
void void
clearpages(pde_t *pgdir, void *begin, void *end) updatepages(pde_t *pgdir, void *begin, void *end, int perm)
{ {
char *a, *last; char *a, *last;
pte_t *pte; pte_t *pte;
...@@ -212,8 +194,10 @@ clearpages(pde_t *pgdir, void *begin, void *end) ...@@ -212,8 +194,10 @@ clearpages(pde_t *pgdir, void *begin, void *end)
last = PGROUNDDOWN(end); last = PGROUNDDOWN(end);
for (;;) { for (;;) {
pte = walkpgdir(pgdir, a, 1); pte = walkpgdir(pgdir, a, 1);
if(pte != 0) if(pte != 0) {
*pte = 0; if (perm == 0) *pte = 0;
else *pte = PTE_ADDR(*pte) | perm | PTE_P;
}
if (a == last) if (a == last)
break; break;
a += PGSIZE; a += PGSIZE;
...@@ -737,7 +721,7 @@ pagefault_wcow(struct vmap *vmap, uint va, pte_t *pte, struct vma *m, uint npg) ...@@ -737,7 +721,7 @@ pagefault_wcow(struct vmap *vmap, uint va, pte_t *pte, struct vma *m, uint npg)
m->va_type = PRIVATE; m->va_type = PRIVATE;
m->n = c; m->n = c;
// Update the hardware page tables to reflect the change to the vma // Update the hardware page tables to reflect the change to the vma
clearpages(vmap->pgdir, (void *) m->va_start, (void *) m->va_end); updatepages(vmap->pgdir, (void *) m->va_start, (void *) m->va_end, 0);
pte = walkpgdir(vmap->pgdir, (const void *)va, 0); pte = walkpgdir(vmap->pgdir, (const void *)va, 0);
*pte = v2p(m->n->page[npg]) | PTE_P | PTE_U | PTE_W; *pte = v2p(m->n->page[npg]) | PTE_P | PTE_U | PTE_W;
// drop my ref to vmnode // drop my ref to vmnode
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论