示例#1
0
文件: vm.c 项目: BonsaiDen/luma
int test(lua_State *L) {
    void *ptr = lua_newuserdata(L, sizeof(char) * 32);
    vm_object_create();
    vm_field_set_string("name", "Test");
    lua_setmetatable(L, 1);
    return 1;
}
示例#2
0
/*
 * vm_object_copy: clone a vm_object.
 *
 * Synchronization: None; lpage_copy does the hard stuff.
 */
int
vm_object_copy(struct vm_object *vmo, struct addrspace *newas,
               struct vm_object **ret)
{
    struct vm_object *newvmo;

    struct lpage *newlp, *lp;
    unsigned j;
    int result;

    newvmo = vm_object_create(lpage_array_num(vmo->vmo_lpages));
    if (newvmo == NULL) {
        return ENOMEM;
    }

    newvmo->vmo_base = vmo->vmo_base;
    newvmo->vmo_lower_redzone = vmo->vmo_lower_redzone;

    for (j = 0; j < lpage_array_num(vmo->vmo_lpages); j++) {
        lp = lpage_array_get(vmo->vmo_lpages, j);
        newlp = lpage_array_get(newvmo->vmo_lpages, j);

        /* new guy should be initialized to all zerofill */
        KASSERT(newlp == NULL);

        if (lp == NULL) {
            /* old guy is zerofill too, don't do anything */
            continue;
        }

        result = lpage_copy(lp, &newlp);
        if (result) {
            goto fail;
        }
        lpage_array_set(newvmo->vmo_lpages, j, newlp);
    }

    *ret = newvmo;
    return 0;

fail:
    vm_object_destroy(newas, newvmo);
    return result;
}
示例#3
0
/*
 * Set up a segment at virtual address VADDR of size MEMSIZE. The
 * segment in memory extends from VADDR up to (but not including)
 * VADDR+MEMSIZE.
 *
 * The READABLE, WRITEABLE, and EXECUTABLE flags are set if read,
 * write, or execute permission should be set on the segment. At the
 * moment, these are ignored.
 *
 * Does not allow overlapping regions.
 */
int
as_define_region(struct addrspace *as, vaddr_t vaddr, size_t sz,
		 size_t lower_redzone,
		 int readable, int writeable, int executable)
{
	struct vm_object *vmo;
	int i, result;
	vaddr_t check_vaddr;	/* vaddr to use for overlap check */

	(void)readable;
	(void)writeable;	// XYZ
	(void)executable;

	/* base address must be aligned */
	assert((vaddr & PAGE_FRAME)==vaddr);

	/* redzone must be aligned */
	assert((lower_redzone & PAGE_FRAME)==lower_redzone);

	/* redzone must fit */
	assert(vaddr >= lower_redzone);
	check_vaddr = vaddr - lower_redzone;

	/* size may not be */
	sz = ROUNDUP(sz, PAGE_SIZE);

	/*
	 * Check for overlaps.
	 */
	for (i = 0; i < array_getnum(as->as_objects); i++) {
		vaddr_t bot, top;
		
		vmo = array_getguy(as->as_objects, i);
		assert(vmo != NULL);
		bot = vmo->vmo_base;
		top = bot + PAGE_SIZE*array_getnum(vmo->vmo_lpages);

		/* Check guard band, if any */
		assert(bot >= vmo->vmo_lower_redzone);
		bot = bot - vmo->vmo_lower_redzone;

		if (check_vaddr+sz > bot && check_vaddr < top) {
			/* overlap */
			return EINVAL;
		}
	}


	/* Create a new vmo. All pages are marked zerofilled. */
	vmo = vm_object_create(sz/PAGE_SIZE);
	if (vmo == NULL) {
		return ENOMEM;
	}
	vmo->vmo_base = vaddr;
	vmo->vmo_lower_redzone = lower_redzone;

	/* Add it to the parent address space. */
	result = array_add(as->as_objects, vmo);
	if (result) {
		vm_object_destroy(as, vmo);
		return result;
	}

	/* Done */
	return 0;
}