Change the return type to abi_ulong, and pass in the cpu.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/loader.h | 3 ++-
linux-user/elfload.c | 30 +-----------------------------
linux-user/sparc/elfload.c | 32 ++++++++++++++++++++++++++++++++
3 files changed, 35 insertions(+), 30 deletions(-)
diff --git a/linux-user/loader.h b/linux-user/loader.h
index be92207c2b..d2f0bea2b2 100644
--- a/linux-user/loader.h
+++ b/linux-user/loader.h
@@ -98,7 +98,8 @@ abi_long memcpy_to_target(abi_ulong dest, const void *src,
extern unsigned long guest_stack_size;
-#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_ARM)
+#if defined(TARGET_I386) || defined(TARGET_X86_64) || defined(TARGET_ARM) \
+ || defined(TARGET_SPARC)
abi_ulong get_elf_hwcap(CPUState *cs);
abi_ulong get_elf_hwcap2(CPUState *cs);
#endif
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 3a4f68f503..220af18cb8 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -575,35 +575,7 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs,
# define ELF_ARCH EM_SPARCV9
#endif
-#include "elf.h"
-
-#define ELF_HWCAP get_elf_hwcap()
-
-static uint32_t get_elf_hwcap(void)
-{
- /* There are not many sparc32 hwcap bits -- we have all of them. */
- uint32_t r = HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR |
- HWCAP_SPARC_SWAP | HWCAP_SPARC_MULDIV;
-
-#ifdef TARGET_SPARC64
- CPUSPARCState *env = cpu_env(thread_cpu);
- uint32_t features = env->def.features;
-
- r |= HWCAP_SPARC_V9 | HWCAP_SPARC_V8PLUS;
- /* 32x32 multiply and divide are efficient. */
- r |= HWCAP_SPARC_MUL32 | HWCAP_SPARC_DIV32;
- /* We don't have an internal feature bit for this. */
- r |= HWCAP_SPARC_POPC;
- r |= features & CPU_FEATURE_FSMULD ? HWCAP_SPARC_FSMULD : 0;
- r |= features & CPU_FEATURE_VIS1 ? HWCAP_SPARC_VIS : 0;
- r |= features & CPU_FEATURE_VIS2 ? HWCAP_SPARC_VIS2 : 0;
- r |= features & CPU_FEATURE_FMAF ? HWCAP_SPARC_FMAF : 0;
- r |= features & CPU_FEATURE_VIS3 ? HWCAP_SPARC_VIS3 : 0;
- r |= features & CPU_FEATURE_IMA ? HWCAP_SPARC_IMA : 0;
-#endif
-
- return r;
-}
+#define ELF_HWCAP get_elf_hwcap(thread_cpu)
static inline void init_thread(struct target_pt_regs *regs,
struct image_info *infop)
diff --git a/linux-user/sparc/elfload.c b/linux-user/sparc/elfload.c
index 73fa78ef14..b4b8e4916e 100644
--- a/linux-user/sparc/elfload.c
+++ b/linux-user/sparc/elfload.c
@@ -1 +1,33 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include "qemu/osdep.h"
+#include "qemu.h"
+#include "loader.h"
+#include "elf.h"
+
+
+abi_ulong get_elf_hwcap(CPUState *cs)
+{
+ /* There are not many sparc32 hwcap bits -- we have all of them. */
+ abi_ulong r = HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR |
+ HWCAP_SPARC_SWAP | HWCAP_SPARC_MULDIV;
+
+#ifdef TARGET_SPARC64
+ CPUSPARCState *env = cpu_env(cs);
+ uint32_t features = env->def.features;
+
+ r |= HWCAP_SPARC_V9 | HWCAP_SPARC_V8PLUS;
+ /* 32x32 multiply and divide are efficient. */
+ r |= HWCAP_SPARC_MUL32 | HWCAP_SPARC_DIV32;
+ /* We don't have an internal feature bit for this. */
+ r |= HWCAP_SPARC_POPC;
+ r |= features & CPU_FEATURE_FSMULD ? HWCAP_SPARC_FSMULD : 0;
+ r |= features & CPU_FEATURE_VIS1 ? HWCAP_SPARC_VIS : 0;
+ r |= features & CPU_FEATURE_VIS2 ? HWCAP_SPARC_VIS2 : 0;
+ r |= features & CPU_FEATURE_FMAF ? HWCAP_SPARC_FMAF : 0;
+ r |= features & CPU_FEATURE_VIS3 ? HWCAP_SPARC_VIS3 : 0;
+ r |= features & CPU_FEATURE_IMA ? HWCAP_SPARC_IMA : 0;
+#endif
+
+ return r;
+}
--
2.43.0