aboutsummaryrefslogtreecommitdiff
path: root/util/cache-utils.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@twiddle.net>2013-06-10 09:05:09 -0700
committerRichard Henderson <rth@twiddle.net>2013-11-30 07:45:30 +1300
commit664d2c4458a268eb176a223c397453a72ed167f4 (patch)
treec01a338ca7bb53bb9cb2cb25340fd8f9de838797 /util/cache-utils.c
parentc9baa30f42a87f61627391698f63fa4d1566d9d8 (diff)
util: Use qemu_getauxval in linux qemu_cache_utils_init
With this we no longer pass down envp, and thus all systems can have the same void prototype. So also eliminate a useless thunk. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <rth@twiddle.net>
Diffstat (limited to 'util/cache-utils.c')
-rw-r--r--util/cache-utils.c51
1 files changed, 20 insertions, 31 deletions
diff --git a/util/cache-utils.c b/util/cache-utils.c
index b94013a8cb..047003008b 100644
--- a/util/cache-utils.c
+++ b/util/cache-utils.c
@@ -1,3 +1,4 @@
+#include "qemu-common.h"
#include "qemu/cache-utils.h"
#if defined(_ARCH_PPC)
@@ -9,31 +10,33 @@ struct qemu_cache_conf qemu_cache_conf = {
#if defined _AIX
#include <sys/systemcfg.h>
-static void ppc_init_cacheline_sizes(void)
+void qemu_cache_utils_init(void)
{
qemu_cache_conf.icache_bsize = _system_configuration.icache_line;
qemu_cache_conf.dcache_bsize = _system_configuration.dcache_line;
}
#elif defined __linux__
+#include "qemu/osdep.h"
+#include "elf.h"
-#define QEMU_AT_NULL 0
-#define QEMU_AT_DCACHEBSIZE 19
-#define QEMU_AT_ICACHEBSIZE 20
-
-static void ppc_init_cacheline_sizes(char **envp)
+void qemu_cache_utils_init(void)
{
- unsigned long *auxv;
-
- while (*envp++);
+ unsigned long dsize = qemu_getauxval(AT_DCACHEBSIZE);
+ unsigned long isize = qemu_getauxval(AT_ICACHEBSIZE);
- for (auxv = (unsigned long *) envp; *auxv != QEMU_AT_NULL; auxv += 2) {
- switch (*auxv) {
- case QEMU_AT_DCACHEBSIZE: qemu_cache_conf.dcache_bsize = auxv[1]; break;
- case QEMU_AT_ICACHEBSIZE: qemu_cache_conf.icache_bsize = auxv[1]; break;
- default: break;
+ if (dsize == 0 || isize == 0) {
+ if (dsize == 0) {
+ fprintf(stderr, "getauxval AT_DCACHEBSIZE failed\n");
+ }
+ if (isize == 0) {
+ fprintf(stderr, "getauxval AT_ICACHEBSIZE failed\n");
}
+ exit(1);
+
}
+ qemu_cache_conf.dcache_bsize = dsize;
+ qemu_cache_conf.icache_bsize = isize;
}
#elif defined __APPLE__
@@ -41,7 +44,7 @@ static void ppc_init_cacheline_sizes(char **envp)
#include <sys/types.h>
#include <sys/sysctl.h>
-static void ppc_init_cacheline_sizes(void)
+void qemu_cache_utils_init(void)
{
size_t len;
unsigned cacheline;
@@ -55,9 +58,8 @@ static void ppc_init_cacheline_sizes(void)
qemu_cache_conf.icache_bsize = cacheline;
}
}
-#endif
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
@@ -65,7 +67,7 @@ static void ppc_init_cacheline_sizes(void)
#include <sys/types.h>
#include <sys/sysctl.h>
-static void ppc_init_cacheline_sizes(void)
+void qemu_cache_utils_init(void)
{
size_t len = 4;
unsigned cacheline;
@@ -81,17 +83,4 @@ static void ppc_init_cacheline_sizes(void)
}
#endif
-#ifdef __linux__
-void qemu_cache_utils_init(char **envp)
-{
- ppc_init_cacheline_sizes(envp);
-}
-#else
-void qemu_cache_utils_init(char **envp)
-{
- (void) envp;
- ppc_init_cacheline_sizes();
-}
-#endif
-
#endif /* _ARCH_PPC */