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)
This commit is contained in:
parent
9aa0337dc1
commit
547c28fc1e
2 changed files with 11 additions and 10 deletions
3
kalloc.c
3
kalloc.c
|
@ -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
18
vm.c
|
@ -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.
|
||||||
|
|
Loading…
Reference in a new issue