| #include "qemu/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 */ |