| #include "cache-utils.h" | 
 |  | 
 | #if defined(_ARCH_PPC) | 
 | struct qemu_cache_conf qemu_cache_conf = { | 
 |     .dcache_bsize = 16, | 
 |     .icache_bsize = 16 | 
 | }; | 
 |  | 
 | #if defined _AIX | 
 | #include <sys/systemcfg.h> | 
 |  | 
 | static void ppc_init_cacheline_sizes(void) | 
 | { | 
 |     qemu_cache_conf.icache_bsize = _system_configuration.icache_line; | 
 |     qemu_cache_conf.dcache_bsize = _system_configuration.dcache_line; | 
 | } | 
 |  | 
 | #elif defined __linux__ | 
 |  | 
 | #define QEMU_AT_NULL        0 | 
 | #define QEMU_AT_DCACHEBSIZE 19 | 
 | #define QEMU_AT_ICACHEBSIZE 20 | 
 |  | 
 | static void ppc_init_cacheline_sizes(char **envp) | 
 | { | 
 |     unsigned long *auxv; | 
 |  | 
 |     while (*envp++); | 
 |  | 
 |     for (auxv = (unsigned long *) envp; *auxv != QEMU_AT_NULL; auxv += 2) { | 
 |         switch (*auxv) { | 
 |         case QEMU_AT_DCACHEBSIZE: qemu_cache_conf.dcache_bsize = auxv[1]; break; | 
 |         case QEMU_AT_ICACHEBSIZE: qemu_cache_conf.icache_bsize = auxv[1]; break; | 
 |         default: break; | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | #elif defined __APPLE__ | 
 | #include <stdio.h> | 
 | #include <sys/types.h> | 
 | #include <sys/sysctl.h> | 
 |  | 
 | static void ppc_init_cacheline_sizes(void) | 
 | { | 
 |     size_t len; | 
 |     unsigned cacheline; | 
 |     int name[2] = { CTL_HW, HW_CACHELINE }; | 
 |  | 
 |     len = sizeof(cacheline); | 
 |     if (sysctl(name, 2, &cacheline, &len, NULL, 0)) { | 
 |         perror("sysctl CTL_HW HW_CACHELINE failed"); | 
 |     } else { | 
 |         qemu_cache_conf.dcache_bsize = cacheline; | 
 |         qemu_cache_conf.icache_bsize = cacheline; | 
 |     } | 
 | } | 
 | #endif | 
 |  | 
 | #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) | 
 | #include <errno.h> | 
 | #include <stdio.h> | 
 | #include <stdlib.h> | 
 | #include <string.h> | 
 | #include <sys/types.h> | 
 | #include <sys/sysctl.h> | 
 |  | 
 | static void ppc_init_cacheline_sizes(void) | 
 | { | 
 |     size_t len = 4; | 
 |     unsigned cacheline; | 
 |  | 
 |     if (sysctlbyname ("machdep.cacheline_size", &cacheline, &len, NULL, 0)) { | 
 |         fprintf(stderr, "sysctlbyname machdep.cacheline_size failed: %s\n", | 
 |                 strerror(errno)); | 
 |         exit(1); | 
 |     } | 
 |  | 
 |     qemu_cache_conf.dcache_bsize = cacheline; | 
 |     qemu_cache_conf.icache_bsize = cacheline; | 
 | } | 
 | #endif     | 
 |  | 
 | #ifdef __linux__ | 
 | void qemu_cache_utils_init(char **envp) | 
 | { | 
 |     ppc_init_cacheline_sizes(envp); | 
 | } | 
 | #else | 
 | void qemu_cache_utils_init(char **envp) | 
 | { | 
 |     (void) envp; | 
 |     ppc_init_cacheline_sizes(); | 
 | } | 
 | #endif | 
 |  | 
 | #endif /* _ARCH_PPC */ |