1 #include "cache-utils.h" 2 3 #if defined(_ARCH_PPC) 4 struct qemu_cache_conf qemu_cache_conf = { 5 .dcache_bsize = 16, 6 .icache_bsize = 16 7 }; 8 9 #if defined _AIX 10 #include <sys/systemcfg.h> 11 12 static void ppc_init_cacheline_sizes(void) 13 { 14 qemu_cache_conf.icache_bsize = _system_configuration.icache_line; 15 qemu_cache_conf.dcache_bsize = _system_configuration.dcache_line; 16 } 17 18 #elif defined __linux__ 19 20 #define QEMU_AT_NULL 0 21 #define QEMU_AT_DCACHEBSIZE 19 22 #define QEMU_AT_ICACHEBSIZE 20 23 24 static void ppc_init_cacheline_sizes(char **envp) 25 { 26 unsigned long *auxv; 27 28 while (*envp++); 29 30 for (auxv = (unsigned long *) envp; *auxv != QEMU_AT_NULL; auxv += 2) { 31 switch (*auxv) { 32 case QEMU_AT_DCACHEBSIZE: qemu_cache_conf.dcache_bsize = auxv[1]; break; 33 case QEMU_AT_ICACHEBSIZE: qemu_cache_conf.icache_bsize = auxv[1]; break; 34 default: break; 35 } 36 } 37 } 38 39 #elif defined __APPLE__ 40 #include <stdio.h> 41 #include <sys/types.h> 42 #include <sys/sysctl.h> 43 44 static void ppc_init_cacheline_sizes(void) 45 { 46 size_t len; 47 unsigned cacheline; 48 int name[2] = { CTL_HW, HW_CACHELINE }; 49 50 len = sizeof(cacheline); 51 if (sysctl(name, 2, &cacheline, &len, NULL, 0)) { 52 perror("sysctl CTL_HW HW_CACHELINE failed"); 53 } else { 54 qemu_cache_conf.dcache_bsize = cacheline; 55 qemu_cache_conf.icache_bsize = cacheline; 56 } 57 } 58 #endif 59 60 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) 61 #include <errno.h> 62 #include <stdio.h> 63 #include <stdlib.h> 64 #include <string.h> 65 #include <sys/types.h> 66 #include <sys/sysctl.h> 67 68 static void ppc_init_cacheline_sizes(void) 69 { 70 size_t len = 4; 71 unsigned cacheline; 72 73 if (sysctlbyname ("machdep.cacheline_size", &cacheline, &len, NULL, 0)) { 74 fprintf(stderr, "sysctlbyname machdep.cacheline_size failed: %s\n", 75 strerror(errno)); 76 exit(1); 77 } 78 79 qemu_cache_conf.dcache_bsize = cacheline; 80 qemu_cache_conf.icache_bsize = cacheline; 81 } 82 #endif 83 84 #ifdef __linux__ 85 void qemu_cache_utils_init(char **envp) 86 { 87 ppc_init_cacheline_sizes(envp); 88 } 89 #else 90 void qemu_cache_utils_init(char **envp) 91 { 92 (void) envp; 93 ppc_init_cacheline_sizes(); 94 } 95 #endif 96 97 #endif /* _ARCH_PPC */ 98