| #include "qemu-common.h" |
| #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> |
| |
| void qemu_cache_utils_init(void) |
| { |
| qemu_cache_conf.icache_bsize = _system_configuration.icache_line; |
| qemu_cache_conf.dcache_bsize = _system_configuration.dcache_line; |
| } |
| |
| #elif defined __linux__ |
| #include "qemu/osdep.h" |
| #include "elf.h" |
| |
| void qemu_cache_utils_init(void) |
| { |
| unsigned long dsize = qemu_getauxval(AT_DCACHEBSIZE); |
| unsigned long isize = qemu_getauxval(AT_ICACHEBSIZE); |
| |
| if (dsize == 0 || isize == 0) { |
| if (dsize == 0) { |
| fprintf(stderr, "getauxval AT_DCACHEBSIZE failed\n"); |
| } |
| if (isize == 0) { |
| fprintf(stderr, "getauxval AT_ICACHEBSIZE failed\n"); |
| } |
| exit(1); |
| |
| } |
| qemu_cache_conf.dcache_bsize = dsize; |
| qemu_cache_conf.icache_bsize = isize; |
| } |
| |
| #elif defined __APPLE__ |
| #include <stdio.h> |
| #include <sys/types.h> |
| #include <sys/sysctl.h> |
| |
| void qemu_cache_utils_init(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; |
| } |
| } |
| |
| #elif 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> |
| |
| void qemu_cache_utils_init(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 |
| |
| #endif /* _ARCH_PPC */ |