#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <fcntl.h>

#define FILE_NAME "/mnt/hugepagefile"
#define LENGTH (12UL*1024*1024)
#define PAD 0
#define PROTECTION (PROT_READ | PROT_WRITE)

/* Only ia64 requires this */
#ifdef __ia64__
#define ADDR (void *)(0x8000000000000000UL)
#define FLAGS (MAP_PRIVATE | MAP_FIXED)
#else
#define ADDR (void *)(0x0UL)
#define FLAGS (MAP_PRIVATE)
#endif

int main(void)
{
	void *addr;
	int fd;
	pid_t pid;

	printf("Opening file\n");
	fd = open(FILE_NAME, O_CREAT | O_RDWR, 0755);
	if (fd < 0) {
		perror("Open failed");
		exit(1);
	}

	printf("Attempting mmap: ");
	addr = mmap(ADDR, LENGTH + PAD, PROTECTION, FLAGS, fd, 0);
	if (addr == MAP_FAILED) {
		printf("FAIL\n");
		perror("mmap");
		unlink(FILE_NAME);
		exit(1);
	}
	printf("PASS\n");

	printf("Unmapping in the middle\n");
	if (munmap(addr + (LENGTH/3), LENGTH/3) == -1) {
		perror("munmap");
		exit(-1);
	}

	return 0;
}
