static uint32_t create_userptr(int fd, uint32_t val, uint32_t *ptr) { uint32_t handle; int i; gem_userptr(fd, ptr, sizeof(linear), 0, userptr_flags, &handle); igt_assert(handle != 0); /* Fill the BO with dwords starting at val */ for (i = 0; i < WIDTH*HEIGHT; i++) ptr[i] = val++; return handle; }
static uint32_t create_userptr_bo(int fd, uint64_t size) { void *ptr; uint32_t handle; ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0); igt_assert(ptr != MAP_FAILED); gem_userptr(fd, (uint32_t *)ptr, size, 0, userptr_flags, &handle); add_handle_ptr(handle, ptr, size); return handle; }
static int has_userptr(int fd) { uint32_t handle = 0; void *ptr; uint32_t oldflags; int ret; igt_assert(posix_memalign(&ptr, PAGE_SIZE, PAGE_SIZE) == 0); oldflags = userptr_flags; gem_userptr_test_unsynchronized(); ret = gem_userptr(fd, ptr, PAGE_SIZE, 0, &handle); userptr_flags = oldflags; if (ret != 0) { free(ptr); return 0; } gem_close(fd, handle); free(ptr); return handle != 0; }
static int test_access_control(int fd) { igt_fork(child, 1) { void *ptr; int ret; uint32_t handle; igt_drop_root(); /* CAP_SYS_ADMIN is needed for UNSYNCHRONIZED mappings. */ gem_userptr_test_unsynchronized(); igt_assert(posix_memalign(&ptr, PAGE_SIZE, PAGE_SIZE) == 0); ret = gem_userptr(fd, ptr, PAGE_SIZE, 0, &handle); if (ret == 0) gem_close(fd, handle); free(ptr); igt_assert(ret == EPERM); } igt_waitchildren(); return 0; } static int test_invalid_null_pointer(int fd) { uint32_t handle; int ret;