diff options
Diffstat (limited to 'sim/testsuite/cris/c/mmap5.c')
-rw-r--r-- | sim/testsuite/cris/c/mmap5.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/sim/testsuite/cris/c/mmap5.c b/sim/testsuite/cris/c/mmap5.c new file mode 100644 index 0000000..95f00c3 --- /dev/null +++ b/sim/testsuite/cris/c/mmap5.c @@ -0,0 +1,91 @@ +/* +#notarget: cris*-*-elf +*/ + +#define _GNU_SOURCE +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/mman.h> + +int main (int argc, char *argv[]) +{ + int fd = open (argv[0], O_RDONLY); + struct stat sb; + int size; + void *a; + void *b; + const char *str = "a string you'll only find in the program"; + + if (fd == -1) + { + perror ("open"); + abort (); + } + + if (fstat (fd, &sb) < 0) + { + perror ("fstat"); + abort (); + } + + size = 8192; +#ifdef MMAP_SIZE1 + size = MMAP_SIZE1; +#endif + +#ifndef MMAP_PROT1 +#define MMAP_PROT1 PROT_READ | PROT_WRITE | PROT_EXEC +#endif + +#ifndef MMAP_FLAGS1 +#define MMAP_FLAGS1 MAP_PRIVATE | MAP_ANONYMOUS +#endif + + /* Get a page, any page. */ + b = mmap (NULL, size, MMAP_PROT1, MMAP_FLAGS1, -1, 0); + if (b == MAP_FAILED) + abort (); + + /* Remember it, unmap it. */ +#ifndef NO_MUNMAP + if (munmap (b, size) != 0) + abort (); +#endif + +#ifdef MMAP_ADDR2 + b = MMAP_ADDR2; +#endif + +#ifndef MMAP_PROT2 +#define MMAP_PROT2 PROT_READ | PROT_EXEC +#endif + +#ifndef MMAP_FLAGS2 +#define MMAP_FLAGS2 MAP_DENYWRITE | MAP_FIXED | MAP_PRIVATE +#endif + + size = sb.st_size; +#ifdef MMAP_SIZE2 + size = MMAP_SIZE2; +#endif + +#define MMAP_TEST_BAD_ORIG \ + (a == MAP_FAILED || memmem (a, size, str, strlen (str) + 1) == NULL) +#ifndef MMAP_TEST_BAD +#define MMAP_TEST_BAD MMAP_TEST_BAD_ORIG +#endif + + /* Try mapping the now non-mapped page fixed. */ + a = mmap (b, size, MMAP_PROT2, MMAP_FLAGS2, fd, 0); + + if (MMAP_TEST_BAD) + abort (); + + printf ("pass\n"); + exit (0); +} |