1#include "qemu-common.h"
2#include "qemu/cache-utils.h"
3
4#if defined(_ARCH_PPC)
5struct 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
13void qemu_cache_utils_init(void)
14{
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__
20#include "qemu/osdep.h"
21#include "elf.h"
22
23void qemu_cache_utils_init(void)
24{
25    unsigned long dsize = qemu_getauxval(AT_DCACHEBSIZE);
26    unsigned long isize = qemu_getauxval(AT_ICACHEBSIZE);
27
28    if (dsize == 0 || isize == 0) {
29        if (dsize == 0) {
30            fprintf(stderr, "getauxval AT_DCACHEBSIZE failed\n");
31        }
32        if (isize == 0) {
33            fprintf(stderr, "getauxval AT_ICACHEBSIZE failed\n");
34        }
35        exit(1);
36
37    }
38    qemu_cache_conf.dcache_bsize = dsize;
39    qemu_cache_conf.icache_bsize = isize;
40}
41
42#elif defined __APPLE__
43#include <stdio.h>
44#include <sys/types.h>
45#include <sys/sysctl.h>
46
47void qemu_cache_utils_init(void)
48{
49    size_t len;
50    unsigned cacheline;
51    int name[2] = { CTL_HW, HW_CACHELINE };
52
53    len = sizeof(cacheline);
54    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}
61
62#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
63#include <errno.h>
64#include <stdio.h>
65#include <stdlib.h>
66#include <string.h>
67#include <sys/types.h>
68#include <sys/sysctl.h>
69
70void qemu_cache_utils_init(void)
71{
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}
84#endif
85
86#endif /* _ARCH_PPC */
87