qemu/cache-utils.c
<<
>>
Prefs
   1#include "cache-utils.h"
   2
   3#if defined(_ARCH_PPC)
   4struct 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
  12static 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
  24static 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
  44static 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
  68static 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__
  85void qemu_cache_utils_init(char **envp)
  86{
  87    ppc_init_cacheline_sizes(envp);
  88}
  89#else
  90void qemu_cache_utils_init(char **envp)
  91{
  92    (void) envp;
  93    ppc_init_cacheline_sizes();
  94}
  95#endif
  96
  97#endif /* _ARCH_PPC */
  98