1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "tests/sys_mman.h"
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main(int argc, char **argv)
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   void *p1;
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   void *p2;
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ( ( p1 = mmap( 0, 4096, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0 ) ) == MAP_FAILED )
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror( "aligned mmap failed" );
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit( 1 );
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ( munmap( p1, 4096 ) != 0 )
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror( "aligned munmap failed" );
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit( 1 );
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // This fails because MAP_FIXED is specified and p1+1 isn't page-aligned.
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // (On Linux, just non-page-alignment is enough for failure, but on Darwin
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   // MAP_FIXED has to also be specified.)
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ( ( p2 = mmap( p1 + 1, 4096, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0 ) ) == MAP_FAILED )
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror( "unaligned mmap failed" );
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit( 1 );
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   if ( munmap( p2, 4096 ) != 0 )
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      perror( "unaligned munmap failed" );
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      exit( 1 );
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   exit( 0 );
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
39