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#ifdef __linux__ 61void qemu_cache_utils_init(char **envp) 62{ 63 ppc_init_cacheline_sizes(envp); 64} 65#else 66void qemu_cache_utils_init(char **envp) 67{ 68 (void) envp; 69 ppc_init_cacheline_sizes(); 70} 71#endif 72 73#endif /* _ARCH_PPC */ 74