| /* SPDX-License-Identifier: GPL-2.0-or-later */ |
| |
| #include "qemu/osdep.h" |
| #include "qemu.h" |
| #include "loader.h" |
| #include "elf.h" |
| |
| |
| const char *get_elf_cpu_model(uint32_t eflags) |
| { |
| #ifdef TARGET_SPARC64 |
| return "TI UltraSparc II"; |
| #else |
| return "Fujitsu MB86904"; |
| #endif |
| } |
| |
| abi_ulong get_elf_hwcap(CPUState *cs) |
| { |
| /* 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(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; |
| } |