~ubuntu-branches/ubuntu/wily/qemu-kvm-spice/wily

« back to all changes in this revision

Viewing changes to cache-utils.c

  • Committer: Bazaar Package Importer
  • Author(s): Serge Hallyn
  • Date: 2011-10-19 10:44:56 UTC
  • Revision ID: james.westby@ubuntu.com-20111019104456-xgvskumk3sxi97f4
Tags: upstream-0.15.0+noroms
ImportĀ upstreamĀ versionĀ 0.15.0+noroms

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 */