File:  [Qemu by Fabrice Bellard] / qemu / cache-utils.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 18:24:45 2018 UTC (3 years, 4 months ago) by root
Branches: qemu, MAIN
CVS tags: qemu0130, HEAD
qemu 0.13.0

    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 */

unix.superglobalmegacorp.com