Exemple #1
0
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;
}
Exemple #2
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);

}
Exemple #3
0
 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);
	}
}
Exemple #4
0
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);
	}
}