1 /* 2 * Taken from perf which in turn take it from GIT 3 */ 4 5 #include "kvm/util.h" 6 7 #include <linux/magic.h> /* For HUGETLBFS_MAGIC */ 8 #include <sys/mman.h> 9 #include <sys/stat.h> 10 #include <sys/statfs.h> 11 12 static void report(const char *prefix, const char *err, va_list params) 13 { 14 char msg[1024]; 15 vsnprintf(msg, sizeof(msg), err, params); 16 fprintf(stderr, " %s%s\n", prefix, msg); 17 } 18 19 static NORETURN void die_builtin(const char *err, va_list params) 20 { 21 report(" Fatal: ", err, params); 22 exit(128); 23 } 24 25 static void error_builtin(const char *err, va_list params) 26 { 27 report(" Error: ", err, params); 28 } 29 30 static void warn_builtin(const char *warn, va_list params) 31 { 32 report(" Warning: ", warn, params); 33 } 34 35 static void info_builtin(const char *info, va_list params) 36 { 37 report(" Info: ", info, params); 38 } 39 40 void die(const char *err, ...) 41 { 42 va_list params; 43 44 va_start(params, err); 45 die_builtin(err, params); 46 va_end(params); 47 } 48 49 int pr_error(const char *err, ...) 50 { 51 va_list params; 52 53 va_start(params, err); 54 error_builtin(err, params); 55 va_end(params); 56 return -1; 57 } 58 59 void pr_warning(const char *warn, ...) 60 { 61 va_list params; 62 63 va_start(params, warn); 64 warn_builtin(warn, params); 65 va_end(params); 66 } 67 68 void pr_info(const char *info, ...) 69 { 70 va_list params; 71 72 va_start(params, info); 73 info_builtin(info, params); 74 va_end(params); 75 } 76 77 void die_perror(const char *s) 78 { 79 perror(s); 80 exit(1); 81 } 82 83 void *mmap_hugetlbfs(const char *htlbfs_path, u64 size) 84 { 85 char mpath[PATH_MAX]; 86 int fd; 87 struct statfs sfs; 88 void *addr; 89 unsigned long blk_size; 90 91 if (statfs(htlbfs_path, &sfs) < 0) 92 die("Can't stat %s\n", htlbfs_path); 93 94 if ((unsigned int)sfs.f_type != HUGETLBFS_MAGIC) { 95 die("%s is not hugetlbfs!\n", htlbfs_path); 96 } 97 98 blk_size = (unsigned long)sfs.f_bsize; 99 if (sfs.f_bsize == 0 || blk_size > size) { 100 die("Can't use hugetlbfs pagesize %ld for mem size %lld\n", 101 blk_size, size); 102 } 103 104 snprintf(mpath, PATH_MAX, "%s/kvmtoolXXXXXX", htlbfs_path); 105 fd = mkstemp(mpath); 106 if (fd < 0) 107 die("Can't open %s for hugetlbfs map\n", mpath); 108 unlink(mpath); 109 if (ftruncate(fd, size) < 0) 110 die("Can't ftruncate for mem mapping size %lld\n", 111 size); 112 addr = mmap(NULL, size, PROT_RW, MAP_PRIVATE, fd, 0); 113 close(fd); 114 115 return addr; 116 } 117