Statistics
| Branch: | Revision:

root / cache-utils.c @ bf4f74c0

History | View | Annotate | Download (1.5 kB)

1
#include "cache-utils.h"
2

    
3
#ifdef __powerpc__
4
struct qemu_cache_conf qemu_cache_conf = {
5
    .dcache_bsize = 16,
6
    .icache_bsize = 16
7
};
8

    
9
#if defined _AIX
10
#include <sys/systemcfg.h>
11

    
12
static void ppc_init_cacheline_sizes(void)
13
{
14
    qemu_cache_conf.icache_bsize = _system_configuration.icache_line;
15
    qemu_cache_conf.dcache_bsize = _system_configuration.dcache_line;
16
}
17

    
18
#elif defined __linux__
19

    
20
#define QEMU_AT_NULL        0
21
#define QEMU_AT_DCACHEBSIZE 19
22
#define QEMU_AT_ICACHEBSIZE 20
23

    
24
static void ppc_init_cacheline_sizes(char **envp)
25
{
26
    unsigned long *auxv;
27

    
28
    while (*envp++);
29

    
30
    for (auxv = (unsigned long *) envp; *auxv != QEMU_AT_NULL; auxv += 2) {
31
        switch (*auxv) {
32
        case QEMU_AT_DCACHEBSIZE: qemu_cache_conf.dcache_bsize = auxv[1]; break;
33
        case QEMU_AT_ICACHEBSIZE: qemu_cache_conf.icache_bsize = auxv[1]; break;
34
        default: break;
35
        }
36
    }
37
}
38

    
39
#elif defined __APPLE__
40
#include <sys/types.h>
41
#include <sys/sysctl.h>
42

    
43
static void ppc_init_cacheline_sizes(void)
44
{
45
    size_t len;
46
    unsigned cacheline;
47
    int name[2] = { CTL_HW, HW_CACHELINE };
48

    
49
    if (sysctl(name, 2, &cacheline, &len, NULL, 0)) {
50
        perror("sysctl CTL_HW HW_CACHELINE failed");
51
    } else {
52
        qemu_cache_conf.dcache_bsize = cacheline;
53
        qemu_cache_conf.icache_bsize = cacheline;
54
    }
55
}
56
#endif
57

    
58
#ifdef __linux__
59
void qemu_cache_utils_init(char **envp)
60
{
61
    ppc_init_cacheline_sizes(envp);
62
}
63
#else
64
void qemu_cache_utils_init(char **envp)
65
{
66
    (void) envp;
67
    ppc_init_cacheline_sizes();
68
}
69
#endif
70

    
71
#endif /* __powerpc__ */