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