1 /* { dg-require-effective-target mmap } */
2 /* { dg-skip-if "the executable is at the same position the test tries to remap" { m68k-*-linux* } { "*" } { "" } } */
3 
4 #include <limits.h>
5 
6 #include <sys/types.h>
7 #include <sys/mman.h>
8 #include <sys/stat.h>
9 #include <fcntl.h>
10 #ifndef MAP_ANON
11 #ifdef MAP_ANONYMOUS
12 #define MAP_ANON MAP_ANONYMOUS
13 #else
14 #define MAP_ANON MAP_FILE
15 #endif
16 #endif
17 #ifndef MAP_FILE
18 #define MAP_FILE 0
19 #endif
20 #ifndef MAP_FIXED
21 #define MAP_FIXED 0
22 #endif
23 
24 #define MAP_START (void *)0x7fff8000
25 #define MAP_LEN 0x10000
26 
27 #define OFFSET (MAP_LEN/2 - 2 * sizeof (char));
28 
f(int s,char * p)29 f (int s, char *p)
30 {
31   int i;
32   for (i = s; i >= 0 && &p[i] < &p[40]; i++)
33     {
34       p[i] = -2;
35     }
36 }
37 
main()38 main ()
39 {
40 #ifdef MAP_ANON
41   char *p;
42   int dev_zero;
43 
44   dev_zero = open ("/dev/zero", O_RDONLY);
45   /* -1 is OK when we have MAP_ANON; else mmap will flag an error.  */
46   if (INT_MAX != 0x7fffffffL || sizeof (char *) != sizeof (int))
47     exit (0);
48   p = mmap (MAP_START, MAP_LEN, PROT_READ|PROT_WRITE,
49 	    MAP_ANON|MAP_FIXED|MAP_PRIVATE, dev_zero, 0);
50   if (p != (char *)-1)
51     {
52       p += OFFSET;
53       p[39] = 0;
54       f (0, p);
55       if (p[39] != (char)-2)
56 	abort ();
57       p[39] = 0;
58       f (-1, p);
59       if (p[39] != 0)
60 	abort ();
61     }
62 #endif
63   exit (0);
64 }
65