cache-utils.c revision 8848f632455c464be35092720757b953f57c29fe
18848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner#include "qemu-common.h"
237dc41a01f33a1e6aca0458b205c2b1609fe82c3David 'Digit' Turner#include "qemu/cache-utils.h"
35d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
45d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined(_ARCH_PPC)
55d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct qemu_cache_conf qemu_cache_conf = {
65d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    .dcache_bsize = 16,
75d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    .icache_bsize = 16
85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner};
95d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#if defined _AIX
115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <sys/systemcfg.h>
125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
138848f632455c464be35092720757b953f57c29feDavid 'Digit' Turnervoid qemu_cache_utils_init(void)
145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    qemu_cache_conf.icache_bsize = _system_configuration.icache_line;
165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    qemu_cache_conf.dcache_bsize = _system_configuration.dcache_line;
175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#elif defined __linux__
208848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner#include "qemu/osdep.h"
218848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner#include "elf.h"
225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
238848f632455c464be35092720757b953f57c29feDavid 'Digit' Turnervoid qemu_cache_utils_init(void)
245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
258848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner    unsigned long dsize = qemu_getauxval(AT_DCACHEBSIZE);
268848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner    unsigned long isize = qemu_getauxval(AT_ICACHEBSIZE);
275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
288848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner    if (dsize == 0 || isize == 0) {
298848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner        if (dsize == 0) {
308848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner            fprintf(stderr, "getauxval AT_DCACHEBSIZE failed\n");
318848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner        }
328848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner        if (isize == 0) {
338848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner            fprintf(stderr, "getauxval AT_ICACHEBSIZE failed\n");
345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        }
358848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner        exit(1);
368848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner
375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
388848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner    qemu_cache_conf.dcache_bsize = dsize;
398848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner    qemu_cache_conf.icache_bsize = isize;
405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#elif defined __APPLE__
435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <stdio.h>
445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <sys/types.h>
455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include <sys/sysctl.h>
465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
478848f632455c464be35092720757b953f57c29feDavid 'Digit' Turnervoid qemu_cache_utils_init(void)
485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{
495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    size_t len;
505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    unsigned cacheline;
515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    int name[2] = { CTL_HW, HW_CACHELINE };
525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    len = sizeof(cacheline);
545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (sysctl(name, 2, &cacheline, &len, NULL, 0)) {
555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        perror("sysctl CTL_HW HW_CACHELINE failed");
565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    } else {
575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        qemu_cache_conf.dcache_bsize = cacheline;
585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        qemu_cache_conf.icache_bsize = cacheline;
595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    }
605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}
615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
628848f632455c464be35092720757b953f57c29feDavid 'Digit' Turner#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
633b290c31efd96e5474f2b55b7fe1ca0250a5bb47David Turner#include <errno.h>
649251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner#include <stdio.h>
653b290c31efd96e5474f2b55b7fe1ca0250a5bb47David Turner#include <stdlib.h>
663b290c31efd96e5474f2b55b7fe1ca0250a5bb47David Turner#include <string.h>
679251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner#include <sys/types.h>
689251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner#include <sys/sysctl.h>
699251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner
708848f632455c464be35092720757b953f57c29feDavid 'Digit' Turnervoid qemu_cache_utils_init(void)
719251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner{
729251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner    size_t len = 4;
739251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner    unsigned cacheline;
749251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner
759251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner    if (sysctlbyname ("machdep.cacheline_size", &cacheline, &len, NULL, 0)) {
769251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner        fprintf(stderr, "sysctlbyname machdep.cacheline_size failed: %s\n",
779251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner                strerror(errno));
789251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner        exit(1);
799251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner    }
809251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner
819251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner    qemu_cache_conf.dcache_bsize = cacheline;
829251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner    qemu_cache_conf.icache_bsize = cacheline;
839251866320b5f8329a043bb56b3a794f78d12849David 'Digit' Turner}
845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif
855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif /* _ARCH_PPC */
87