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