Fixed EXPER_TRADPROC mmaping
[akaros.git] / kern / src / mm.c
index 82ac989..032178a 100644 (file)
 void *mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
            int fd, size_t offset)
 {
+#ifdef __CONFIG_EXPER_TRADPROC__
+if (!is_real_proc(p))
+       p = p->true_proc;
+#endif /* __CONFIG_EXPER_TRADPROC__ */
+
        printd("mmap(addr %x, len %x, prot %x, flags %x, fd %x, off %x)\n", addr,
               len, prot, flags, fd, offset);
        if (fd >= 0 && (flags & MAP_SHARED)) {
@@ -53,18 +58,32 @@ void *mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
 void *do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
               struct file* file, size_t offset)
 {
+#ifdef __CONFIG_EXPER_TRADPROC__
+if (!is_real_proc(p))
+       p = p->true_proc;
+#endif /* __CONFIG_EXPER_TRADPROC__ */
+
        // TODO: grab the appropriate mm_lock
-       spin_lock_irqsave(&p->proc_lock);
+       spin_lock(&p->proc_lock);
        void* ret = __do_mmap(p,addr,len,prot,flags,file,offset);
-       spin_unlock_irqsave(&p->proc_lock);
+       spin_unlock(&p->proc_lock);
        return ret;
 }
 
 void *__do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
                 struct file* file, size_t offset)
 {
+#ifdef __CONFIG_EXPER_TRADPROC__
+if (!is_real_proc(p))
+       p = p->true_proc;
+#endif /* __CONFIG_EXPER_TRADPROC__ */
+
        int num_pages = ROUNDUP(len, PGSIZE) / PGSIZE;
 
+#ifndef __CONFIG_DEMAND_PAGING__
+       flags |= MAP_POPULATE;
+#endif
+       
        if(!(flags & MAP_FIXED))
        {
                addr = (uintptr_t)get_free_va_range(p->env_pgdir,addr,len);
@@ -149,6 +168,11 @@ void *__do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
 
 int mprotect(struct proc* p, void* addr, size_t len, int prot)
 {
+#ifdef __CONFIG_EXPER_TRADPROC__
+if (!is_real_proc(p))
+       p = p->true_proc;
+#endif /* __CONFIG_EXPER_TRADPROC__ */
+
        printd("mprotect(addr %x, len %x, prot %x)\n",addr,len,prot);
        if((uintptr_t)addr % PGSIZE || (len == 0 && (prot & PROT_UNMAP)))
        {
@@ -164,15 +188,20 @@ int mprotect(struct proc* p, void* addr, size_t len, int prot)
                return -1;
        }
 
-       spin_lock_irqsave(&p->proc_lock);
+       spin_lock(&p->proc_lock);
        int ret = __mprotect(p,addr,len,prot);
-       spin_unlock_irqsave(&p->proc_lock);
+       spin_unlock(&p->proc_lock);
 
        return ret;
 }
 
 int __mprotect(struct proc* p, void* addr, size_t len, int prot)
 {
+#ifdef __CONFIG_EXPER_TRADPROC__
+if (!is_real_proc(p))
+       p = p->true_proc;
+#endif /* __CONFIG_EXPER_TRADPROC__ */
+
        int newperm = (prot & PROT_WRITE) ? PTE_USER_RW :
                      (prot & (PROT_READ|PROT_EXEC)) ? PTE_USER_RO : 0;
 
@@ -215,36 +244,58 @@ int __mprotect(struct proc* p, void* addr, size_t len, int prot)
                }
        }
 
-       //TODO: TLB shootdown - needs to be process wide
-       tlbflush();
+       /* TODO: (TLB) make this take a sensible range.  For now, it doesn't matter
+        * since we ignore it in the process code.  Also, make sure you are holding
+        * the proc_lock when calling this. */
+       __proc_tlbshootdown(p, 0, 0xffffffff);
        return 0;
 }
 
 int munmap(struct proc* p, void* addr, size_t len)
 {
+#ifdef __CONFIG_EXPER_TRADPROC__
+if (!is_real_proc(p))
+       p = p->true_proc;
+#endif /* __CONFIG_EXPER_TRADPROC__ */
+
        return mprotect(p, addr, len, PROT_UNMAP);
 }
 
 int __munmap(struct proc* p, void* addr, size_t len)
 {
+#ifdef __CONFIG_EXPER_TRADPROC__
+if (!is_real_proc(p))
+       p = p->true_proc;
+#endif /* __CONFIG_EXPER_TRADPROC__ */
+
        return __mprotect(p, addr, len, PROT_UNMAP);
 }
 
 int handle_page_fault(struct proc* p, uintptr_t va, int prot)
 {
+#ifdef __CONFIG_EXPER_TRADPROC__
+if (!is_real_proc(p))
+       p = p->true_proc;
+#endif /* __CONFIG_EXPER_TRADPROC__ */
+
        va = ROUNDDOWN(va,PGSIZE);
 
        if(prot != PROT_READ && prot != PROT_WRITE && prot != PROT_EXEC)
                panic("bad prot!");
 
-       spin_lock_irqsave(&p->proc_lock);
+       spin_lock(&p->proc_lock);
        int ret = __handle_page_fault(p,va,prot);
-       spin_unlock_irqsave(&p->proc_lock);
+       spin_unlock(&p->proc_lock);
        return ret;
 }
        
 int __handle_page_fault(struct proc* p, uintptr_t va, int prot)
 {
+#ifdef __CONFIG_EXPER_TRADPROC__
+if (!is_real_proc(p))
+       p = p->true_proc;
+#endif /* __CONFIG_EXPER_TRADPROC__ */
+
        int ret = -1;
        // find offending PTE
        pte_t* ppte = pgdir_walk(p->env_pgdir,(void*)va,0);