diff --git a/vtest/Makefile.am b/vtest/Makefile.am index caaa4d7..1075005 100644 --- a/vtest/Makefile.am +++ b/vtest/Makefile.am @@ -19,6 +19,8 @@ bin_PROGRAMS = virgl_test_server virgl_test_server_SOURCES = \ util.c \ util.h \ + vtest_shm.c \ + vtest_shm.h \ vtest_server.c \ vtest_renderer.c \ vtest_protocol.h \ diff --git a/vtest/vtest_shm.c b/vtest/vtest_shm.c new file mode 100644 index 0000000..50cffea --- /dev/null +++ b/vtest/vtest_shm.c @@ -0,0 +1,78 @@ +/************************************************************************** + * + * Copyright (C) 2018 Chromium. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#include "util.h" +#include "vtest_shm.h" + +#include +#include +#include +#include + +#include +#include + +static int memfd_create(const char *name, unsigned int flags) +{ +#ifdef __NR_memfd_create + return syscall(__NR_memfd_create, name, flags); +#else + return -1; +#endif +} + +int vtest_new_shm(uint32_t handle, size_t size) +{ + int fd, ret; + int length = snprintf(NULL, 0, "vtest-res-%u", handle); + char *str = malloc(length + 1); + snprintf(str, length + 1, "vtest-res-%u", handle); + + fd = memfd_create(str, MFD_ALLOW_SEALING); + free(str); + if (fd < 0) { + return report_failed_call("memfd_create", -errno); + } + + ret = ftruncate(fd, size); + if (ret < 0) { + close(fd); + return report_failed_call("ftruncate", -errno); + } + + return fd; +} + +int vtest_shm_check(void) +{ + int mfd = memfd_create("test", MFD_ALLOW_SEALING); + + if (mfd >= 0) { + close(mfd); + return 1; + } + + return 0; +} + diff --git a/vtest/vtest_shm.h b/vtest/vtest_shm.h new file mode 100644 index 0000000..929130f --- /dev/null +++ b/vtest/vtest_shm.h @@ -0,0 +1,40 @@ +#ifndef VTEST_SHM_H +#define VTEST_SHM_H + +#ifndef F_LINUX_SPECIFIC_BASE +#define F_LINUX_SPECIFIC_BASE 1024 +#endif + +#ifndef F_ADD_SEALS +#define F_ADD_SEALS (F_LINUX_SPECIFIC_BASE + 9) +#define F_GET_SEALS (F_LINUX_SPECIFIC_BASE + 10) + +#define F_SEAL_SEAL 0x0001 /* prevent further seals from being set */ +#define F_SEAL_SHRINK 0x0002 /* prevent file from shrinking */ +#define F_SEAL_GROW 0x0004 /* prevent file from growing */ +#define F_SEAL_WRITE 0x0008 /* prevent writes */ +#endif + +#ifndef MFD_CLOEXEC +#define MFD_CLOEXEC 0x0001U +#endif + +#ifndef MFD_ALLOW_SEALING +#define MFD_ALLOW_SEALING 0x0002U +#endif + +#ifndef MFD_HUGETLB +#define MFD_HUGETLB 0x0004U +#endif + +#ifndef MFD_HUGE_SHIFT +#define MFD_HUGE_SHIFT 26 +#endif + +#include +#include + +int vtest_new_shm(uint32_t handle, size_t size); +int vtest_shm_check(void); + +#endif /* VTEST_MEMFD_H */