| Eric B Munson | 94bf5ce | 2009-09-21 17:03:48 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * Example of using hugepage memory in a user application using the mmap | 
|  | 3 | * system call with MAP_HUGETLB flag.  Before running this program make | 
|  | 4 | * sure the administrator has allocated enough default sized huge pages | 
|  | 5 | * to cover the 256 MB allocation. | 
|  | 6 | * | 
|  | 7 | * For ia64 architecture, Linux kernel reserves Region number 4 for hugepages. | 
|  | 8 | * That means the addresses starting with 0x800000... will need to be | 
|  | 9 | * specified.  Specifying a fixed address is not required on ppc64, i386 | 
|  | 10 | * or x86_64. | 
|  | 11 | */ | 
|  | 12 | #include <stdlib.h> | 
|  | 13 | #include <stdio.h> | 
|  | 14 | #include <unistd.h> | 
|  | 15 | #include <sys/mman.h> | 
|  | 16 | #include <fcntl.h> | 
|  | 17 |  | 
|  | 18 | #define LENGTH (256UL*1024*1024) | 
|  | 19 | #define PROTECTION (PROT_READ | PROT_WRITE) | 
|  | 20 |  | 
|  | 21 | #ifndef MAP_HUGETLB | 
| Carlo Marcelo Arenas Belon | 89bbfb6 | 2010-05-23 17:02:30 -0700 | [diff] [blame] | 22 | #define MAP_HUGETLB 0x40000 /* arch specific */ | 
| Eric B Munson | 94bf5ce | 2009-09-21 17:03:48 -0700 | [diff] [blame] | 23 | #endif | 
|  | 24 |  | 
|  | 25 | /* Only ia64 requires this */ | 
|  | 26 | #ifdef __ia64__ | 
|  | 27 | #define ADDR (void *)(0x8000000000000000UL) | 
|  | 28 | #define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_FIXED) | 
|  | 29 | #else | 
|  | 30 | #define ADDR (void *)(0x0UL) | 
|  | 31 | #define FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB) | 
|  | 32 | #endif | 
|  | 33 |  | 
| Randy Dunlap | 70bace8 | 2010-03-10 15:21:58 -0800 | [diff] [blame] | 34 | static void check_bytes(char *addr) | 
| Eric B Munson | 94bf5ce | 2009-09-21 17:03:48 -0700 | [diff] [blame] | 35 | { | 
|  | 36 | printf("First hex is %x\n", *((unsigned int *)addr)); | 
|  | 37 | } | 
|  | 38 |  | 
| Randy Dunlap | 70bace8 | 2010-03-10 15:21:58 -0800 | [diff] [blame] | 39 | static void write_bytes(char *addr) | 
| Eric B Munson | 94bf5ce | 2009-09-21 17:03:48 -0700 | [diff] [blame] | 40 | { | 
|  | 41 | unsigned long i; | 
|  | 42 |  | 
|  | 43 | for (i = 0; i < LENGTH; i++) | 
|  | 44 | *(addr + i) = (char)i; | 
|  | 45 | } | 
|  | 46 |  | 
| Randy Dunlap | 70bace8 | 2010-03-10 15:21:58 -0800 | [diff] [blame] | 47 | static void read_bytes(char *addr) | 
| Eric B Munson | 94bf5ce | 2009-09-21 17:03:48 -0700 | [diff] [blame] | 48 | { | 
|  | 49 | unsigned long i; | 
|  | 50 |  | 
|  | 51 | check_bytes(addr); | 
|  | 52 | for (i = 0; i < LENGTH; i++) | 
|  | 53 | if (*(addr + i) != (char)i) { | 
|  | 54 | printf("Mismatch at %lu\n", i); | 
|  | 55 | break; | 
|  | 56 | } | 
|  | 57 | } | 
|  | 58 |  | 
|  | 59 | int main(void) | 
|  | 60 | { | 
|  | 61 | void *addr; | 
|  | 62 |  | 
|  | 63 | addr = mmap(ADDR, LENGTH, PROTECTION, FLAGS, 0, 0); | 
|  | 64 | if (addr == MAP_FAILED) { | 
|  | 65 | perror("mmap"); | 
|  | 66 | exit(1); | 
|  | 67 | } | 
|  | 68 |  | 
|  | 69 | printf("Returned address is %p\n", addr); | 
|  | 70 | check_bytes(addr); | 
|  | 71 | write_bytes(addr); | 
|  | 72 | read_bytes(addr); | 
|  | 73 |  | 
|  | 74 | munmap(addr, LENGTH); | 
|  | 75 |  | 
|  | 76 | return 0; | 
|  | 77 | } |