1#include <stdlib.h> 2#include <stdio.h> 3#include <string.h> 4#include <fcntl.h> 5#include <ffi.h> 6#include <fficonfig.h> 7 8#define MAX_ARGS 256 9 10#define CHECK(x) !(x) ? abort() : 0 11 12/* Prefer MAP_ANON(YMOUS) to /dev/zero, since we don't need to keep a 13 file open. */ 14#ifdef HAVE_MMAP_ANON 15# undef HAVE_MMAP_DEV_ZERO 16 17# include <sys/mman.h> 18# ifndef MAP_FAILED 19# define MAP_FAILED -1 20# endif 21# if !defined (MAP_ANONYMOUS) && defined (MAP_ANON) 22# define MAP_ANONYMOUS MAP_ANON 23# endif 24# define USING_MMAP 25 26#endif 27 28#ifdef HAVE_MMAP_DEV_ZERO 29 30# include <sys/mman.h> 31# ifndef MAP_FAILED 32# define MAP_FAILED -1 33# endif 34# define USING_MMAP 35 36#endif 37 38#ifdef USING_MMAP 39static inline void * 40allocate_mmap (size_t size) 41{ 42 void *page; 43#if defined (HAVE_MMAP_DEV_ZERO) 44 static int dev_zero_fd = -1; 45#endif 46 47#ifdef HAVE_MMAP_DEV_ZERO 48 if (dev_zero_fd == -1) 49 { 50 dev_zero_fd = open ("/dev/zero", O_RDONLY); 51 if (dev_zero_fd == -1) 52 { 53 perror ("open /dev/zero: %m"); 54 exit (1); 55 } 56 } 57#endif 58 59 60#ifdef HAVE_MMAP_ANON 61 page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, 62 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 63#endif 64#ifdef HAVE_MMAP_DEV_ZERO 65 page = mmap (NULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, 66 MAP_PRIVATE, dev_zero_fd, 0); 67#endif 68 69 if (page == (void *) MAP_FAILED) 70 { 71 perror ("virtual memory exhausted"); 72 exit (1); 73 } 74 75 return page; 76} 77 78#endif 79