#define _GNU_SOURCE #include #include #include #include #include #include #include #include #define GUEST_MEM_REGISTER _IOW('m', 1, int) #define GUEST_MEM_UNREGISTER _IOW('m', 2, int) #define GUEST_MEM_GET_PFN _IOW('m', 3, unsigned long) #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0) #define F_SEAL_GUEST 0x0020 int main(int argc, char *argv[]) { int fd, test_fd; char buf[4]; /* Create an anonymous file in tmpfs; allow seals to be placed on the file. */ fd = memfd_create("memfd_guest", MFD_ALLOW_SEALING); if (fd == -1) errExit("memfd_create"); #if 0 if (write(fd, "test", 4) != 4) errExit("write"); #endif #if 0 if (ftruncate(fd, 4096) == -1) errExit("ftruncate"); #endif #if 0 if (mmap(NULL, 4096, PROT_READ, MAP_SHARED, fd, 0) == MAP_FAILED) errExit("mmap"); #endif if (fcntl(fd, F_ADD_SEALS, F_SEAL_GUEST) == -1) errExit("fcntl"); if (ftruncate(fd, 2UL << 20) == -1) errExit("ftruncate"); /* Expected to fail */ if (write(fd, "test", 4) != -1) errExit("write"); if (read(fd, buf, 4) != -1) errExit("read"); if (mmap(NULL, 4096, PROT_READ, MAP_SHARED, fd, 0) != MAP_FAILED) errExit("mmap"); test_fd = open("/sys/kernel/debug/guest_mem_test", O_RDWR); if (fd == -1) errExit("open"); if (ioctl(test_fd, GUEST_MEM_REGISTER, fd) == -1) errExit("ioctl"); if (ioctl(test_fd, GUEST_MEM_GET_PFN, 0x100) == -1) errExit("ioctl"); if (ioctl(test_fd, GUEST_MEM_GET_PFN, 0x1) == -1) errExit("ioctl"); if (ftruncate(fd, 0)) errExit("ftruncate"); if (ioctl(test_fd, GUEST_MEM_UNREGISTER, fd) == -1) errExit("ioctl"); return 0; }