aboutsummaryrefslogtreecommitdiff
path: root/sim/testsuite/cris/c/mmap5.c
diff options
context:
space:
mode:
Diffstat (limited to 'sim/testsuite/cris/c/mmap5.c')
-rw-r--r--sim/testsuite/cris/c/mmap5.c91
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);
+}