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