[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 14/14] linux-user/elfload.c: Support ARM HWCAP2 flags
From: |
riku . voipio |
Subject: |
[Qemu-devel] [PULL 14/14] linux-user/elfload.c: Support ARM HWCAP2 flags |
Date: |
Fri, 2 May 2014 22:15:49 +0300 |
From: Peter Maydell <address@hidden>
The ARM kernel has chosen to spill into the HWCAP2 ELF feature bit flags
early, even though it hasn't yet exhausted all 32 bits of the HWCAP word.
Add support for setting this in the same way we do for HWCAP.
Signed-off-by: Peter Maydell <address@hidden>
Signed-off-by: Riku Voipio <address@hidden>
---
include/elf.h | 1 +
linux-user/elfload.c | 30 +++++++++++++++++++++++++++++-
2 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/include/elf.h b/include/elf.h
index 667af6f..1599ab2 100644
--- a/include/elf.h
+++ b/include/elf.h
@@ -254,6 +254,7 @@ typedef int64_t Elf64_Sxword;
#define AT_SECURE 23 /* boolean, was exec suid-like? */
#define AT_BASE_PLATFORM 24 /* string identifying real platforms */
#define AT_RANDOM 25 /* address of 16 random bytes */
+#define AT_HWCAP2 26 /* extension of AT_HWCAP */
#define AT_EXECFN 31 /* filename of the executable */
#define AT_SYSINFO 32 /* address of kernel entry point */
#define AT_SYSINFO_EHDR 33 /* address of kernel vdso */
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index ad07c43..995f999 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -20,6 +20,7 @@
#undef ARCH_DLINFO
#undef ELF_PLATFORM
#undef ELF_HWCAP
+#undef ELF_HWCAP2
#undef ELF_CLASS
#undef ELF_DATA
#undef ELF_ARCH
@@ -353,6 +354,14 @@ enum
ARM_HWCAP_ARM_EVTSTRM = 1 << 21,
};
+enum {
+ ARM_HWCAP2_ARM_AES = 1 << 0,
+ ARM_HWCAP2_ARM_PMULL = 1 << 1,
+ ARM_HWCAP2_ARM_SHA1 = 1 << 2,
+ ARM_HWCAP2_ARM_SHA2 = 1 << 3,
+ ARM_HWCAP2_ARM_CRC32 = 1 << 4,
+};
+
/* The commpage only exists for 32 bit kernels */
#define TARGET_HAS_VALIDATE_GUEST_SPACE
@@ -416,6 +425,7 @@ static int validate_guest_space(unsigned long guest_base,
}
#define ELF_HWCAP get_elf_hwcap()
+#define ELF_HWCAP2 get_elf_hwcap2()
static uint32_t get_elf_hwcap(void)
{
@@ -448,11 +458,22 @@ static uint32_t get_elf_hwcap(void)
*/
GET_FEATURE(ARM_FEATURE_VFP3, ARM_HWCAP_ARM_VFPD32);
GET_FEATURE(ARM_FEATURE_LPAE, ARM_HWCAP_ARM_LPAE);
-#undef GET_FEATURE
return hwcaps;
}
+static uint32_t get_elf_hwcap2(void)
+{
+ ARMCPU *cpu = ARM_CPU(thread_cpu);
+ uint32_t hwcaps = 0;
+
+ GET_FEATURE(ARM_FEATURE_V8_AES, ARM_HWCAP2_ARM_AES);
+ GET_FEATURE(ARM_FEATURE_CRC, ARM_HWCAP2_ARM_CRC32);
+ return hwcaps;
+}
+
+#undef GET_FEATURE
+
#else
/* 64 bit ARM definitions */
#define ELF_START_MMAP 0x80000000
@@ -1486,6 +1507,9 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc,
int envc,
#ifdef DLINFO_ARCH_ITEMS
size += DLINFO_ARCH_ITEMS * 2;
#endif
+#ifdef ELF_HWCAP2
+ size += 2;
+#endif
size += envc + argc + 2;
size += 1; /* argc itself */
size *= n;
@@ -1519,6 +1543,10 @@ static abi_ulong create_elf_tables(abi_ulong p, int
argc, int envc,
NEW_AUX_ENT(AT_CLKTCK, (abi_ulong) sysconf(_SC_CLK_TCK));
NEW_AUX_ENT(AT_RANDOM, (abi_ulong) u_rand_bytes);
+#ifdef ELF_HWCAP2
+ NEW_AUX_ENT(AT_HWCAP2, (abi_ulong) ELF_HWCAP2);
+#endif
+
if (k_platform)
NEW_AUX_ENT(AT_PLATFORM, u_platform);
#ifdef ARCH_DLINFO
--
2.0.0.rc0
- [Qemu-devel] [PULL 00/14] linux-user update, riku . voipio, 2014/05/02
- [Qemu-devel] [PULL 01/14] linux-user: Add /proc/self/exe open forwarding, riku . voipio, 2014/05/02
- [Qemu-devel] [PULL 03/14] linux-user: Move if-elses to a switch statement., riku . voipio, 2014/05/02
- [Qemu-devel] [PULL 06/14] linux-user: avoid using glibc internals in _syscall5 and in definition of target_sigevent struct, riku . voipio, 2014/05/02
- [Qemu-devel] [PULL 02/14] linux-user: Assert stack used for auxvec, envp, argv, riku . voipio, 2014/05/02
- [Qemu-devel] [PULL 11/14] linux-user/elfload.c: Fix incorrect ARM HWCAP bits, riku . voipio, 2014/05/02
- [Qemu-devel] [PULL 08/14] linux-user: rename cpu- uname -> uname, riku . voipio, 2014/05/02
- [Qemu-devel] [PULL 05/14] linux-user: Handle arches with llseek instead of _llseek, riku . voipio, 2014/05/02
- [Qemu-devel] [PULL 04/14] linux-user: Add support for SCM_CREDENTIALS., riku . voipio, 2014/05/02
- [Qemu-devel] [PULL 14/14] linux-user/elfload.c: Support ARM HWCAP2 flags,
riku . voipio <=
- [Qemu-devel] [PULL 07/14] linux-user/signal.c: Set fault address in AArch64 signal info, riku . voipio, 2014/05/02
- [Qemu-devel] [PULL 13/14] linux-user/elfload.c: Fix A64 code which was incorrectly acting like A32, riku . voipio, 2014/05/02
- [Qemu-devel] [PULL 12/14] linux-user/elfload.c: Update ARM HWCAP bits, riku . voipio, 2014/05/02
- [Qemu-devel] [PULL 10/14] linux-user: remove configure option for setting uname release, riku . voipio, 2014/05/02
- [Qemu-devel] [PULL 09/14] linux-user: move uname functions to uname.c, riku . voipio, 2014/05/02