blob: 047003008bc3b7e08d964075fcb2095d6958a09e [file] [log] [blame]
Richard Henderson664d2c42013-06-10 09:05:09 -07001#include "qemu-common.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +01002#include "qemu/cache-utils.h"
malc902b3d52008-12-10 19:18:40 +00003
malce58ffeb2009-01-14 18:39:49 +00004#if defined(_ARCH_PPC)
malc902b3d52008-12-10 19:18:40 +00005struct qemu_cache_conf qemu_cache_conf = {
6 .dcache_bsize = 16,
7 .icache_bsize = 16
8};
9
10#if defined _AIX
11#include <sys/systemcfg.h>
12
Richard Henderson664d2c42013-06-10 09:05:09 -070013void qemu_cache_utils_init(void)
malc902b3d52008-12-10 19:18:40 +000014{
15 qemu_cache_conf.icache_bsize = _system_configuration.icache_line;
16 qemu_cache_conf.dcache_bsize = _system_configuration.dcache_line;
17}
18
19#elif defined __linux__
Richard Henderson664d2c42013-06-10 09:05:09 -070020#include "qemu/osdep.h"
21#include "elf.h"
malc47100362008-12-11 19:12:59 +000022
Richard Henderson664d2c42013-06-10 09:05:09 -070023void qemu_cache_utils_init(void)
malc902b3d52008-12-10 19:18:40 +000024{
Richard Henderson664d2c42013-06-10 09:05:09 -070025 unsigned long dsize = qemu_getauxval(AT_DCACHEBSIZE);
26 unsigned long isize = qemu_getauxval(AT_ICACHEBSIZE);
malc902b3d52008-12-10 19:18:40 +000027
Richard Henderson664d2c42013-06-10 09:05:09 -070028 if (dsize == 0 || isize == 0) {
29 if (dsize == 0) {
30 fprintf(stderr, "getauxval AT_DCACHEBSIZE failed\n");
malc902b3d52008-12-10 19:18:40 +000031 }
Richard Henderson664d2c42013-06-10 09:05:09 -070032 if (isize == 0) {
33 fprintf(stderr, "getauxval AT_ICACHEBSIZE failed\n");
34 }
35 exit(1);
36
malc902b3d52008-12-10 19:18:40 +000037 }
Richard Henderson664d2c42013-06-10 09:05:09 -070038 qemu_cache_conf.dcache_bsize = dsize;
39 qemu_cache_conf.icache_bsize = isize;
malc902b3d52008-12-10 19:18:40 +000040}
41
42#elif defined __APPLE__
malc7344da02009-02-04 20:39:09 +000043#include <stdio.h>
malc902b3d52008-12-10 19:18:40 +000044#include <sys/types.h>
45#include <sys/sysctl.h>
46
Richard Henderson664d2c42013-06-10 09:05:09 -070047void qemu_cache_utils_init(void)
malc902b3d52008-12-10 19:18:40 +000048{
49 size_t len;
50 unsigned cacheline;
51 int name[2] = { CTL_HW, HW_CACHELINE };
52
malc7344da02009-02-04 20:39:09 +000053 len = sizeof(cacheline);
malc902b3d52008-12-10 19:18:40 +000054 if (sysctl(name, 2, &cacheline, &len, NULL, 0)) {
55 perror("sysctl CTL_HW HW_CACHELINE failed");
56 } else {
57 qemu_cache_conf.dcache_bsize = cacheline;
58 qemu_cache_conf.icache_bsize = cacheline;
59 }
60}
malc902b3d52008-12-10 19:18:40 +000061
Richard Henderson664d2c42013-06-10 09:05:09 -070062#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
Juergen Lock4836a2b2010-03-12 22:50:15 +010063#include <errno.h>
Juergen Locke4ee9162010-02-19 19:28:23 +010064#include <stdio.h>
Juergen Lock4836a2b2010-03-12 22:50:15 +010065#include <stdlib.h>
66#include <string.h>
Juergen Locke4ee9162010-02-19 19:28:23 +010067#include <sys/types.h>
68#include <sys/sysctl.h>
69
Richard Henderson664d2c42013-06-10 09:05:09 -070070void qemu_cache_utils_init(void)
Juergen Locke4ee9162010-02-19 19:28:23 +010071{
72 size_t len = 4;
73 unsigned cacheline;
74
75 if (sysctlbyname ("machdep.cacheline_size", &cacheline, &len, NULL, 0)) {
76 fprintf(stderr, "sysctlbyname machdep.cacheline_size failed: %s\n",
77 strerror(errno));
78 exit(1);
79 }
80
81 qemu_cache_conf.dcache_bsize = cacheline;
82 qemu_cache_conf.icache_bsize = cacheline;
83}
malc12b62782010-11-01 00:53:19 +030084#endif
Juergen Locke4ee9162010-02-19 19:28:23 +010085
malce58ffeb2009-01-14 18:39:49 +000086#endif /* _ARCH_PPC */