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; }
/* * 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; }
/* * 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; }