1#include "cache-utils.h" 2 3#if defined(_ARCH_PPC) 4struct 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 12static 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 24static 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 44static 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 68static 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__ 85void qemu_cache_utils_init(char **envp) 86{ 87 ppc_init_cacheline_sizes(envp); 88} 89#else 90void qemu_cache_utils_init(char **envp) 91{ 92 (void) envp; 93 ppc_init_cacheline_sizes(); 94} 95#endif 96 97#endif /* _ARCH_PPC */ 98