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