#include #include #include #include #include #include #include #define FILENAME "/mnt/huge/test_file" #define TST_MMAP_SIZE 0x200000 typedef unsigned int (*TEST_FUNC_T)(void); /* * mkdir -p /mnt/huge * echo 20 > /proc/sys/vm/nr_hugepages * mount none /mnt/huge -t hugetlbfs -o pagesize=2048K */ int main(void) { int i; int fd; int ret; void *share_mem; size_t size; struct stat sb; TEST_FUNC_T func_ptr; unsigned int value, total; unsigned int *ptr; fd = open(FILENAME, O_RDWR | O_CREAT); if (fd == -1) { printf("Open file %s failed P1: %s\n", FILENAME, strerror(errno)); return 1; } lseek(fd, TST_MMAP_SIZE - 1, SEEK_SET); write(fd, "", 1); share_mem = mmap(NULL, TST_MMAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (share_mem == MAP_FAILED) { printf("Call mmap failed P1: %s\n", strerror(errno)); exit(1); } close(fd); srand(time(NULL)); ptr = (unsigned int *)share_mem; *ptr++ = 0xd2800000; //mov x0, #0 for (i = 0, total = 0; i < 100; i++) { value = 0xfff & rand(); total += value; *ptr++ = 0xb1000000 | (value << 10); //adds x0, x0, #value } *ptr = 0xd65f03c0; //ret //__clear_cache((char *)share_mem, (char *)share_mem + 0x200); ret = msync(share_mem, TST_MMAP_SIZE, MS_SYNC); if (ret) { printf("Call msync failed: %s\n", strerror(errno)); exit(1); } ret = munmap(share_mem, TST_MMAP_SIZE); if (ret) { printf("Call munmap failed P1: %s\n", strerror(errno)); exit(1); } fd = open(FILENAME, S_IXUSR); if (fd == -1) { printf("Open file %s failed P2: %s\n", FILENAME, strerror(errno)); return 1; } if (fstat(fd, &sb) == -1) { printf("Call fstat failed: %s\n", strerror(errno)); exit(1); } size = sb.st_size; func_ptr = (TEST_FUNC_T)mmap(NULL, size, PROT_EXEC, MAP_SHARED, fd, 0); if (func_ptr == MAP_FAILED) { printf("Call mmap failed P2: %s\n", strerror(errno)); exit(1); } close(fd); value = func_ptr(); printf("Test is %s: The result is 0x%x, expect = 0x%x\n", (value == total) ? "Passed" : "Failed", value, total); ret = munmap(share_mem, TST_MMAP_SIZE); if (ret) { printf("Call munmap failed P2: %s\n", strerror(errno)); exit(1); } return 0; }