static int __dune_vm_clone_helper(const void *arg, ptent_t *pte, void *va) { int ret; struct page *pg = dune_pa2page(PTE_ADDR(*pte)); ptent_t *newRoot = (ptent_t *)arg; ptent_t *newPte; ret = dune_vm_lookup(newRoot, va, CREATE_NORMAL, &newPte); if (ret < 0) return ret; if (dune_page_isfrompool(PTE_ADDR(*pte))) dune_page_get(pg); *newPte = *pte; return 0; }
static void pgflt_handler(uintptr_t addr, uint64_t fec, struct dune_tf *tf) { //printf("caught page fault!\n"); //printf("%s\n", page); //this will generate infinite page fault int ret; ptent_t *pte; //printf("page-in\n"); pthread_mutex_lock(&_syscall_mtx); ret = dune_vm_lookup(pgroot, (void *) addr, CREATE_NORMAL, &pte); assert(ret==0); long offset = 0;//for single page *pte = PTE_P | PTE_W | PTE_ADDR(dune_va_to_pa((void *) addr)); rdma_read_offset((void *)addr, (__u64)addr - (__u64) page ); pthread_mutex_unlock(&_syscall_mtx); }
void dune_vm_default_pgflt_handler(uintptr_t addr, uint64_t fec) { ptent_t *pte = NULL; int rc; /* * Assert on present and reserved bits. */ assert(!(fec & (FEC_P | FEC_RSV))); rc = dune_vm_lookup(pgroot, (void *) addr, 0, &pte); assert(rc == 0); if ((fec & FEC_W) && (*pte & PTE_COW)) { void *newPage; struct page *pg = dune_pa2page(PTE_ADDR(*pte)); ptent_t perm = PTE_FLAGS(*pte); // Compute new permissions perm &= ~PTE_COW; perm |= PTE_W; if (dune_page_isfrompool(PTE_ADDR(*pte)) && pg->ref == 1) { *pte = PTE_ADDR(*pte) | perm; return; } // Duplicate page newPage = alloc_page(); memcpy(newPage, (void *)PGADDR(addr), PGSIZE); // Map page if (dune_page_isfrompool(PTE_ADDR(*pte))) { dune_page_put(pg); } *pte = PTE_ADDR(newPage) | perm; // Invalidate dune_flush_tlb_one(addr); } }
static void pgflt_handler(uintptr_t addr, uint64_t fec, struct dune_tf *tf) { int ret; ptent_t *pte; bool was_user = (tf->cs & 0x3); if (was_user) { pid_t tid = syscall(SYS_gettid); printf("sandbox: got unexpected G3 page fault" " at addr %lx, fec %lx TID %d\n", addr, fec, tid); dune_dump_trap_frame(tf); print_procmap(); dune_ret_from_user(-EFAULT); } else { /* XXX use mem lock */ pthread_mutex_lock(&_syscall_mtx); ret = dune_vm_lookup(pgroot, (void *) addr, CREATE_NORMAL, &pte); assert(!ret); *pte = PTE_P | PTE_W | PTE_ADDR(dune_va_to_pa((void *) addr)); pthread_mutex_unlock(&_syscall_mtx); } }