Don't map IO space in the user part of the address space

Passes all tests now (but need to update usertests to allow for more than 640k)
feat/start
Frans Kaashoek 2011-07-31 21:27:02 -04:00
parent 9aa0337dc1
commit 547c28fc1e
2 changed files with 11 additions and 10 deletions

View File

@ -56,7 +56,7 @@ kfree(char *v)
{ {
struct run *r; struct run *r;
if((uint)v % PGSIZE || v < end || v2p(v) >= PHYSTOP) if((uint)v % PGSIZE || v < end || v2p(v) >= PHYSTOP)
panic("kfree"); panic("kfree");
// Fill with junk to catch dangling refs. // Fill with junk to catch dangling refs.
@ -82,7 +82,6 @@ kalloc(void)
if(r) if(r)
kmem.freelist = r->next; kmem.freelist = r->next;
release(&kmem.lock); release(&kmem.lock);
cprintf("kalloc: 0x%x\n", r);
return (char*)r; return (char*)r;
} }

18
vm.c
View File

@ -175,7 +175,6 @@ static struct kmap {
uint e; uint e;
int perm; int perm;
} kmap[] = { } kmap[] = {
{ (void *)IOSPACEB, IOSPACEB, IOSPACEE, PTE_W}, // I/O space
{ P2V(IOSPACEB), IOSPACEB, IOSPACEE, PTE_W}, // I/O space { P2V(IOSPACEB), IOSPACEB, IOSPACEE, PTE_W}, // I/O space
{ (void *)KERNLINK, V2P(KERNLINK), V2P(data), 0}, // kernel text, rodata { (void *)KERNLINK, V2P(KERNLINK), V2P(data), 0}, // kernel text, rodata
{ data, V2P(data), PHYSTOP, PTE_W}, // kernel data, memory { data, V2P(data), PHYSTOP, PTE_W}, // kernel data, memory
@ -288,7 +287,7 @@ loaduvm(pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz)
n = sz - i; n = sz - i;
else else
n = PGSIZE; n = PGSIZE;
if(readi(ip, (char*)pa, offset+i, n) != n) if(readi(ip, p2v(pa), offset+i, n) != n)
return -1; return -1;
} }
return 0; return 0;
@ -341,7 +340,8 @@ deallocuvm(pde_t *pgdir, uint oldsz, uint newsz)
pa = PTE_ADDR(*pte); pa = PTE_ADDR(*pte);
if(pa == 0) if(pa == 0)
panic("kfree"); panic("kfree");
kfree((char*)pa); char *v = p2v(pa);
kfree(v);
*pte = 0; *pte = 0;
} }
} }
@ -359,8 +359,10 @@ freevm(pde_t *pgdir)
panic("freevm: no pgdir"); panic("freevm: no pgdir");
deallocuvm(pgdir, USERTOP, 0); deallocuvm(pgdir, USERTOP, 0);
for(i = 0; i < NPDENTRIES; i++){ for(i = 0; i < NPDENTRIES; i++){
if(pgdir[i] & PTE_P) if(pgdir[i] & PTE_P) {
kfree(p2v(PTE_ADDR(pgdir[i]))); char * v = p2v(PTE_ADDR(pgdir[i]));
kfree(v);
}
} }
kfree((char*)pgdir); kfree((char*)pgdir);
} }
@ -385,7 +387,7 @@ copyuvm(pde_t *pgdir, uint sz)
pa = PTE_ADDR(*pte); pa = PTE_ADDR(*pte);
if((mem = kalloc()) == 0) if((mem = kalloc()) == 0)
goto bad; goto bad;
memmove(mem, (char*)pa, PGSIZE); memmove(mem, (char*)p2v(pa), PGSIZE);
if(mappages(d, (void*)i, PGSIZE, v2p(mem), PTE_W|PTE_U) < 0) if(mappages(d, (void*)i, PGSIZE, v2p(mem), PTE_W|PTE_U) < 0)
goto bad; goto bad;
} }
@ -397,7 +399,7 @@ bad:
} }
//PAGEBREAK! //PAGEBREAK!
// Map user virtual address to kernel physical address. // Map user virtual address to kernel address.
char* char*
uva2ka(pde_t *pgdir, char *uva) uva2ka(pde_t *pgdir, char *uva)
{ {
@ -408,7 +410,7 @@ uva2ka(pde_t *pgdir, char *uva)
return 0; return 0;
if((*pte & PTE_U) == 0) if((*pte & PTE_U) == 0)
return 0; return 0;
return (char*)PTE_ADDR(*pte); return (char*)p2v(PTE_ADDR(*pte));
} }
// Copy len bytes from p to user address va in page table pgdir. // Copy len bytes from p to user address va in page table pgdir.