/* * Check decoding of memfd_create syscall. * * Copyright (c) 2015-2018 Dmitry V. Levin * All rights reserved. * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "tests.h" #include #include "scno.h" #ifdef __NR_memfd_create # include # include # include # ifdef HAVE_LINUX_MEMFD_H # include # endif # ifndef MFD_HUGE_SHIFT # define MFD_HUGE_SHIFT 26 # endif # ifndef MFD_HUGE_MASK # define MFD_HUGE_MASK 0x3f # endif static const char *errstr; static long k_memfd_create(const kernel_ulong_t name, const kernel_ulong_t flags) { const long rc = syscall(__NR_memfd_create, name, flags); errstr = sprintrc(rc); return rc; } int main(void) { const size_t size = 255 - (sizeof("memfd:") - 1) + 1; char *pattern = tail_alloc(size); fill_memory_ex(pattern, size, '0', 10); k_memfd_create((uintptr_t) pattern, 0); printf("memfd_create(\"%.*s\"..., 0) = %s\n", (int) size - 1, pattern, errstr); kernel_ulong_t flags = (kernel_ulong_t) 0xfacefeed00000007ULL; # define flags1_str "MFD_CLOEXEC|MFD_ALLOW_SEALING|MFD_HUGETLB" k_memfd_create((uintptr_t) pattern, flags); # if XLAT_VERBOSE printf("memfd_create(\"%.*s\"..., %s /* %s */) = %s\n", (int) size - 1, pattern, "0x7", flags1_str, errstr); # else printf("memfd_create(\"%.*s\"..., %s) = %s\n", (int) size - 1, pattern, # if XLAT_RAW "0x7", # else flags1_str, # endif errstr); # endif pattern[size - 1] = '\0'; flags = 30 << MFD_HUGE_SHIFT; k_memfd_create((uintptr_t) pattern, flags); # if XLAT_RAW printf("memfd_create(\"%s\", %#x) = %s\n", pattern, (unsigned int) flags, errstr); # elif XLAT_VERBOSE printf("memfd_create(\"%s\", %#x /* %s */) = %s\n", pattern, (unsigned int) flags, "30<