blob: 38f7eb928d6cd2fe89c37b6dae26ecd1c73ec454 [file] [log] [blame]
/* -*- Mode: C; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#include "util.h"
#define TEST_MEMFD "bar"
/* On my system (5.4.0-67-generic) /proc/pid/mem can take 2GB - 1 page at once. */
#define MEMFD_SIZE (2LL * 1024 * 1024 * 1024)
int main(void) {
#if defined(__i386__)
atomic_puts("Skipping test on 32 bit");
#else
int fd;
/* There's no libc helper for this syscall. */
fd = syscall(RR_memfd_create, TEST_MEMFD, 0);
if (-1 == fd && ENOSYS == errno) {
atomic_puts("SYS_memfd_create not supported on this kernel");
} else {
test_assert(fd >= 0);
if (0 != ftruncate(fd, 2LL * 1024 * 1024 * 1024)) {
atomic_puts("Could not create 2GB memfd");
} else {
void *p1, *p2;
/* Map it once */
p1 = mmap(0, MEMFD_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
test_assert(p1 != MAP_FAILED);
*(uint32_t*)p1 = 0xdeadbeef;
/* Map it again */
p2 = mmap(0, MEMFD_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
test_assert(p2 != MAP_FAILED);
test_assert(*(uint32_t*)p2 == 0xdeadbeef);
test_assert(0 == close(fd));
}
}
#endif
atomic_puts("EXIT-SUCCESS");
return 0;
}