Statistics
| Branch: | Revision:

root / cache-utils.c @ 12b6278f

History | View | Annotate | Download (2.1 kB)

1
#include "cache-utils.h"
2

    
3
#if defined(_ARCH_PPC)
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 <stdio.h>
41
#include <sys/types.h>
42
#include <sys/sysctl.h>
43

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

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

    
60
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
61
#include <errno.h>
62
#include <stdio.h>
63
#include <stdlib.h>
64
#include <string.h>
65
#include <sys/types.h>
66
#include <sys/sysctl.h>
67

    
68
static void ppc_init_cacheline_sizes(void)
69
{
70
    size_t len = 4;
71
    unsigned cacheline;
72

    
73
    if (sysctlbyname ("machdep.cacheline_size", &cacheline, &len, NULL, 0)) {
74
        fprintf(stderr, "sysctlbyname machdep.cacheline_size failed: %s\n",
75
                strerror(errno));
76
        exit(1);
77
    }
78

    
79
    qemu_cache_conf.dcache_bsize = cacheline;
80
    qemu_cache_conf.icache_bsize = cacheline;
81
}
82
#endif
83

    
84
#ifdef __linux__
85
void qemu_cache_utils_init(char **envp)
86
{
87
    ppc_init_cacheline_sizes(envp);
88
}
89
#else
90
void qemu_cache_utils_init(char **envp)
91
{
92
    (void) envp;
93
    ppc_init_cacheline_sizes();
94
}
95
#endif
96

    
97
#endif /* _ARCH_PPC */