]> git.proxmox.com Git - mirror_qemu.git/blobdiff - util/cacheinfo.c
Merge remote-tracking branch 'remotes/kraxel/tags/ui-20190313-pull-request' into...
[mirror_qemu.git] / util / cacheinfo.c
index f987522df493fb4423bbad82306abd3085244fc9..3cd080b83d1a6bf383d60a9c746677548cce5538 100644 (file)
@@ -7,24 +7,19 @@
  */
 
 #include "qemu/osdep.h"
+#include "qemu/host-utils.h"
+#include "qemu/atomic.h"
 
 int qemu_icache_linesize = 0;
+int qemu_icache_linesize_log;
 int qemu_dcache_linesize = 0;
+int qemu_dcache_linesize_log;
 
 /*
  * Operating system specific detection mechanisms.
  */
 
-#if defined(_AIX)
-# include <sys/systemcfg.h>
-
-static void sys_cache_info(int *isize, int *dsize)
-{
-    *isize = _system_configuration.icache_line;
-    *dsize = _system_configuration.dcache_line;
-}
-
-#elif defined(_WIN32)
+#if defined(_WIN32)
 
 static void sys_cache_info(int *isize, int *dsize)
 {
@@ -112,7 +107,7 @@ static void sys_cache_info(int *isize, int *dsize)
 static void arch_cache_info(int *isize, int *dsize)
 {
     if (*isize == 0 || *dsize == 0) {
-        unsigned ctr;
+        unsigned long ctr;
 
         /* The real cache geometry is in CCSIDR_EL1/CLIDR_EL1/CSSELR_EL1,
            but (at least under Linux) these are marked protected by the
@@ -129,6 +124,7 @@ static void arch_cache_info(int *isize, int *dsize)
 }
 
 #elif defined(_ARCH_PPC) && defined(__linux__)
+# include "elf.h"
 
 static void arch_cache_info(int *isize, int *dsize)
 {
@@ -180,6 +176,13 @@ static void __attribute__((constructor)) init_cache_info(void)
     arch_cache_info(&isize, &dsize);
     fallback_cache_info(&isize, &dsize);
 
+    assert((isize & (isize - 1)) == 0);
+    assert((dsize & (dsize - 1)) == 0);
+
     qemu_icache_linesize = isize;
+    qemu_icache_linesize_log = ctz32(isize);
     qemu_dcache_linesize = dsize;
+    qemu_dcache_linesize_log = ctz32(dsize);
+
+    atomic64_init();
 }