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