1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define _GNU_SOURCE 1
2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <sys/mman.h>
3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdio.h>
4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdlib.h>
5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <string.h>
6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <unistd.h>
7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main(void)
9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* first  find free segment of 40K, then unmap it */
11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   void *initial_area = mmap((void *)0x10000000, 40960, PROT_READ|PROT_WRITE,
12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                             MAP_ANONYMOUS|MAP_PRIVATE,0,0);
13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (initial_area == MAP_FAILED)
15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      perror ("initial area");
16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("initial_area= %p\n", initial_area);
17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (munmap(initial_area, 40960) != 0)
18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      perror ("munmap initial_area");
19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* remap the same segment, but with 4K size */
21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   void *area = mmap(initial_area, 4096, PROT_READ|PROT_WRITE,
22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     MAP_ANONYMOUS|MAP_PRIVATE,0,0);
23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (area == MAP_FAILED)
24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      perror ("area");
25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (area != initial_area)
26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf("FAILED : was expecting to get back the initial_area\n");
27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("area= %p\n", area);
28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   strcpy(area, "Hello World");
29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* extend it to 40K */
31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   void *a2 = mremap(area, 4096, 40960, 0);
32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (a2 == MAP_FAILED) {
33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      perror("mremap");
34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (a2 != initial_area)
36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      printf("FAILED : was expecting to get back the same area increased\n");
37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("increased area= %p\n", a2);
38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   printf("%s\n", (char *)a2);
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
41