1cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include <stdio.h>
2cbdddcfb32883a37e873907602d34bac523e3eadsewardj#include <stdlib.h>
383b62cbbab29bde83eba40231f307c2a311e73c8njn#include "tests/sys_mman.h"
4cbdddcfb32883a37e873907602d34bac523e3eadsewardj
5cbdddcfb32883a37e873907602d34bac523e3eadsewardjint main(int argc, char **argv)
6cbdddcfb32883a37e873907602d34bac523e3eadsewardj{
79105a3eb241b6a8db986712859b8191e9e6696b8njn   void *p1;
89105a3eb241b6a8db986712859b8191e9e6696b8njn   void *p2;
9cbdddcfb32883a37e873907602d34bac523e3eadsewardj
109105a3eb241b6a8db986712859b8191e9e6696b8njn   if ( ( p1 = mmap( 0, 4096, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0 ) ) == MAP_FAILED )
119105a3eb241b6a8db986712859b8191e9e6696b8njn   {
129105a3eb241b6a8db986712859b8191e9e6696b8njn      perror( "aligned mmap failed" );
13cbdddcfb32883a37e873907602d34bac523e3eadsewardj      exit( 1 );
149105a3eb241b6a8db986712859b8191e9e6696b8njn   }
15cbdddcfb32883a37e873907602d34bac523e3eadsewardj
169105a3eb241b6a8db986712859b8191e9e6696b8njn   if ( munmap( p1, 4096 ) != 0 )
179105a3eb241b6a8db986712859b8191e9e6696b8njn   {
189105a3eb241b6a8db986712859b8191e9e6696b8njn      perror( "aligned munmap failed" );
19cbdddcfb32883a37e873907602d34bac523e3eadsewardj      exit( 1 );
209105a3eb241b6a8db986712859b8191e9e6696b8njn   }
219105a3eb241b6a8db986712859b8191e9e6696b8njn
229105a3eb241b6a8db986712859b8191e9e6696b8njn   // This fails because MAP_FIXED is specified and p1+1 isn't page-aligned.
239105a3eb241b6a8db986712859b8191e9e6696b8njn   // (On Linux, just non-page-alignment is enough for failure, but on Darwin
249105a3eb241b6a8db986712859b8191e9e6696b8njn   // MAP_FIXED has to also be specified.)
259105a3eb241b6a8db986712859b8191e9e6696b8njn   if ( ( p2 = mmap( p1 + 1, 4096, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0 ) ) == MAP_FAILED )
269105a3eb241b6a8db986712859b8191e9e6696b8njn   {
279105a3eb241b6a8db986712859b8191e9e6696b8njn      perror( "unaligned mmap failed" );
28cbdddcfb32883a37e873907602d34bac523e3eadsewardj      exit( 1 );
299105a3eb241b6a8db986712859b8191e9e6696b8njn   }
30cbdddcfb32883a37e873907602d34bac523e3eadsewardj
319105a3eb241b6a8db986712859b8191e9e6696b8njn   if ( munmap( p2, 4096 ) != 0 )
329105a3eb241b6a8db986712859b8191e9e6696b8njn   {
339105a3eb241b6a8db986712859b8191e9e6696b8njn      perror( "unaligned munmap failed" );
34cbdddcfb32883a37e873907602d34bac523e3eadsewardj      exit( 1 );
359105a3eb241b6a8db986712859b8191e9e6696b8njn   }
36cbdddcfb32883a37e873907602d34bac523e3eadsewardj
379105a3eb241b6a8db986712859b8191e9e6696b8njn   exit( 0 );
38cbdddcfb32883a37e873907602d34bac523e3eadsewardj}
39