]> Devi Nivas Git - cs3210-lab1.git/commitdiff
Don't map IO space in the user part of the address space
authorFrans Kaashoek <kaashoek@Frans-Kaashoeks-MacBook-Pro.local>
Mon, 1 Aug 2011 01:27:02 +0000 (21:27 -0400)
committerFrans Kaashoek <kaashoek@Frans-Kaashoeks-MacBook-Pro.local>
Mon, 1 Aug 2011 01:27:02 +0000 (21:27 -0400)
Passes all tests now (but need to update usertests to allow for more than 640k)

kalloc.c
vm.c

index 83ed7e812cfc746c612437ee62fab4d509a3b80f..cc6d380b613831684b485a7881e9a0bae805b1cb 100644 (file)
--- a/kalloc.c
+++ b/kalloc.c
@@ -56,7 +56,7 @@ kfree(char *v)
 {
   struct run *r;
 
-  if((uint)v % PGSIZE || v < end || v2p(v) >= PHYSTOP) 
+  if((uint)v % PGSIZE || v < end || v2p(v) >= PHYSTOP)
     panic("kfree");
 
   // Fill with junk to catch dangling refs.
@@ -82,7 +82,6 @@ kalloc(void)
   if(r)
     kmem.freelist = r->next;
   release(&kmem.lock);
-  cprintf("kalloc: 0x%x\n", r);
   return (char*)r;
 }
 
diff --git a/vm.c b/vm.c
index b14a863288d8479b65493d5d5aede5423900a6b4..c38893146fc470027372c8876cc4e5ca5546f085 100644 (file)
--- a/vm.c
+++ b/vm.c
@@ -175,7 +175,6 @@ static struct kmap {
   uint e;
   int perm;
 } kmap[] = {
-  { (void *)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
   { 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;
     else
       n = PGSIZE;
-    if(readi(ip, (char*)pa, offset+i, n) != n)
+    if(readi(ip, p2v(pa), offset+i, n) != n)
       return -1;
   }
   return 0;
@@ -341,7 +340,8 @@ deallocuvm(pde_t *pgdir, uint oldsz, uint newsz)
       pa = PTE_ADDR(*pte);
       if(pa == 0)
         panic("kfree");
-      kfree((char*)pa);
+      char *v = p2v(pa);
+      kfree(v);
       *pte = 0;
     }
   }
@@ -359,8 +359,10 @@ freevm(pde_t *pgdir)
     panic("freevm: no pgdir");
   deallocuvm(pgdir, USERTOP, 0);
   for(i = 0; i < NPDENTRIES; i++){
-    if(pgdir[i] & PTE_P)
-      kfree(p2v(PTE_ADDR(pgdir[i])));
+    if(pgdir[i] & PTE_P) {
+      char * v = p2v(PTE_ADDR(pgdir[i]));
+      kfree(v);
+    }
   }
   kfree((char*)pgdir);
 }
@@ -385,7 +387,7 @@ copyuvm(pde_t *pgdir, uint sz)
     pa = PTE_ADDR(*pte);
     if((mem = kalloc()) == 0)
       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)
       goto bad;
   }
@@ -397,7 +399,7 @@ bad:
 }
 
 //PAGEBREAK!
-// Map user virtual address to kernel physical address.
+// Map user virtual address to kernel address.
 char*
 uva2ka(pde_t *pgdir, char *uva)
 {
@@ -408,7 +410,7 @@ uva2ka(pde_t *pgdir, char *uva)
     return 0;
   if((*pte & PTE_U) == 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.