arm64: compat: add support for big-endian (BE8) AArch32 binaries
authorWill Deacon <will.deacon@arm.com>
Fri, 11 Oct 2013 13:52:12 +0000 (14:52 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 25 Oct 2013 14:59:35 +0000 (15:59 +0100)
This patch adds support for BE8 AArch32 tasks to the compat layer.

Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/include/asm/compat.h
arch/arm64/include/asm/elf.h
arch/arm64/include/asm/processor.h
arch/arm64/include/asm/ptrace.h

index 899af80..fda2704 100644 (file)
 #include <linux/ptrace.h>
 
 #define COMPAT_USER_HZ         100
+#ifdef __AARCH64EB__
+#define COMPAT_UTS_MACHINE     "armv8b\0\0"
+#else
 #define COMPAT_UTS_MACHINE     "armv8l\0\0"
+#endif
 
 typedef u32            compat_size_t;
 typedef s32            compat_ssize_t;
@@ -73,13 +77,23 @@ struct compat_timeval {
 };
 
 struct compat_stat {
+#ifdef __AARCH64EB__
+       short           st_dev;
+       short           __pad1;
+#else
        compat_dev_t    st_dev;
+#endif
        compat_ino_t    st_ino;
        compat_mode_t   st_mode;
        compat_ushort_t st_nlink;
        __compat_uid16_t        st_uid;
        __compat_gid16_t        st_gid;
+#ifdef __AARCH64EB__
+       short           st_rdev;
+       short           __pad2;
+#else
        compat_dev_t    st_rdev;
+#endif
        compat_off_t    st_size;
        compat_off_t    st_blksize;
        compat_off_t    st_blocks;
index a3e4a55..01d3aab 100644 (file)
@@ -162,7 +162,12 @@ extern unsigned long arch_randomize_brk(struct mm_struct *mm);
 #define arch_randomize_brk arch_randomize_brk
 
 #ifdef CONFIG_COMPAT
+
+#ifdef __AARCH64EB__
+#define COMPAT_ELF_PLATFORM            ("v8b")
+#else
 #define COMPAT_ELF_PLATFORM            ("v8l")
+#endif
 
 #define COMPAT_ELF_ET_DYN_BASE         (randomize_et_dyn(2 * TASK_SIZE_32 / 3))
 
index ab239b2..45b20cd 100644 (file)
@@ -107,6 +107,11 @@ static inline void compat_start_thread(struct pt_regs *regs, unsigned long pc,
        regs->pstate = COMPAT_PSR_MODE_USR;
        if (pc & 1)
                regs->pstate |= COMPAT_PSR_T_BIT;
+
+#ifdef __AARCH64EB__
+       regs->pstate |= COMPAT_PSR_E_BIT;
+#endif
+
        regs->compat_sp = sp;
 }
 #endif
index 0dacbbf..0e7fa49 100644 (file)
@@ -42,6 +42,7 @@
 #define COMPAT_PSR_MODE_UND    0x0000001b
 #define COMPAT_PSR_MODE_SYS    0x0000001f
 #define COMPAT_PSR_T_BIT       0x00000020
+#define COMPAT_PSR_E_BIT       0x00000200
 #define COMPAT_PSR_F_BIT       0x00000040
 #define COMPAT_PSR_I_BIT       0x00000080
 #define COMPAT_PSR_A_BIT       0x00000100