#include <stdio.h>
#include "tests/sys_mman.h"
#include <stdlib.h>
#include <unistd.h>

/* The code testing MAP_HUGETLB huge pages is disabled by default,
   as many distros do not have huge pages configured
   by default.
   To have e.g. 20 huge pages configured, do (as root)
      echo 20 > /proc/sys/vm/nr_hugepages
  Once this is done, uncomment the below, and recompile.
*/
// #define TEST_MAP_HUGETLB 1

/* Similarly, testing SHM_HUGETLB huge pages is disabled by default.
   To have shmget/shmat big pages working, do (as root)
      echo 500 > /proc/sys/vm/hugetlb_shm_group
   where 500 is the groupid of the user that runs this test
  Once this is done, uncomment the below, and recompile.
*/
// #define TEST_SHM_HUGETLB 1

#ifdef TEST_MAP_HUGETLB
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>

/* Ensure this compiles on pre 2.6 systems, or on glibc missing MAP_HUGETLB */
#ifndef MAP_HUGETLB
/* The below works for me on an f12/x86 linux */
#define MAP_HUGETLB 0x40000
#endif

#endif /* TEST_MAP_HUGETLB */

#ifdef TEST_SHM_HUGETLB
#ifndef SHM_HUGETLB
#define SHM_HUGETLB 04000
#endif
#endif  /* TEST_SHM_HUGETLB */

static unsigned int pagesize;

#define PAGES	1024u
#define LEN	(PAGES*pagesize)

static void *domap(size_t len, int addflags)
{
	void *ret = mmap(0, len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|addflags, -1, 0);

	if (ret == (void *)-1) {
		perror("mmap");
		exit(1);
	}

	return ret;
}

/* unmap in pieces to exercise munmap more */
static void nibblemap(void *p)
{
	int off;
	int i;

	off = (random() % LEN) & ~(pagesize-1);
	
	for(i = 0; i < PAGES; i++) {
		/* printf("unmapping off=%d\n", off/pagesize); */
		munmap((char *)p + off, pagesize);
		off += 619*pagesize;
		off %= LEN;
	}
}

static void prmaps()
{
	char buf[100];
	sprintf(buf, "/bin/cat /proc/%d/maps", getpid());
	system(buf);
	exit(1);
}

int main()
{
	int i;
	void *expect1, *expect2;

	pagesize = getpagesize();

	expect1 = domap(LEN, 0);
	expect2 = domap(LEN, 0);
	munmap(expect1, LEN);
	munmap(expect2, LEN);

	for(i = 0; i < 5; i++) {
		void *m1, *m2;

		m1 = domap(LEN, 0);
		if (m1 != expect1) {
			printf("FAIL i=%d: m1=%p expect1=%p\n",
			       i, m1, expect1);
			prmaps();
			return 1;
		}
		m2 = domap(LEN, 0);
		if (m2 != expect2) {
			printf("FAIL i=%d: m2=%p expect2=%p\n",
			       i, m2, expect2);
			prmaps();
			return 1;
		}
		nibblemap(m2);
		munmap(m1, LEN);
	}

#ifdef  TEST_MAP_HUGETLB
#define HUGESZ (4 * 1024 * 1024)
        {
           void *expect3;
           expect3 = domap(HUGESZ, MAP_HUGETLB);
           munmap(expect3, HUGESZ);
        }
#endif

#ifdef TEST_SHM_HUGETLB
        {
           int shmid;
           void *expect4;


           shmid = shmget(IPC_PRIVATE, HUGESZ, 
                          IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR | SHM_HUGETLB);
           if (shmid == -1) {
              perror("shmget");
              exit(1);
           }
           expect4 = shmat(shmid, NULL, 0);
           if (expect4 == (void*) -1){
              perror("shmat");
              exit(1);
           }
           if (shmdt(expect4) != 0) {
              perror("shmdt");
              exit(1);
           }
           if (shmctl(shmid, IPC_RMID, 0) != 0) {
              perror("shmctl IPC_RMID");
              exit(1);
           }         
        }
#endif

	printf("PASS\n");
	return 0;
}
