]> Git Repo - qemu.git/blob - util/cache-utils.c
Merge remote-tracking branch 'qemu-kvm/uq/master' into staging
[qemu.git] / util / cache-utils.c
1 #include "qemu-common.h"
2 #include "qemu/cache-utils.h"
3
4 #if defined(_ARCH_PPC)
5 struct 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
13 void 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
23 void 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
47 void 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
70 void 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 */
This page took 0.027432 seconds and 4 git commands to generate.