Commit a795a38e authored by Will Deacon's avatar Will Deacon Committed by Catalin Marinas

arm64: compat: add support for big-endian (BE8) AArch32 binaries

This patch adds support for BE8 AArch32 tasks to the compat layer.
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 94ed1f2c
...@@ -26,7 +26,11 @@ ...@@ -26,7 +26,11 @@
#include <linux/ptrace.h> #include <linux/ptrace.h>
#define COMPAT_USER_HZ 100 #define COMPAT_USER_HZ 100
#ifdef __AARCH64EB__
#define COMPAT_UTS_MACHINE "armv8b\0\0"
#else
#define COMPAT_UTS_MACHINE "armv8l\0\0" #define COMPAT_UTS_MACHINE "armv8l\0\0"
#endif
typedef u32 compat_size_t; typedef u32 compat_size_t;
typedef s32 compat_ssize_t; typedef s32 compat_ssize_t;
...@@ -73,13 +77,23 @@ struct compat_timeval { ...@@ -73,13 +77,23 @@ struct compat_timeval {
}; };
struct compat_stat { struct compat_stat {
#ifdef __AARCH64EB__
short st_dev;
short __pad1;
#else
compat_dev_t st_dev; compat_dev_t st_dev;
#endif
compat_ino_t st_ino; compat_ino_t st_ino;
compat_mode_t st_mode; compat_mode_t st_mode;
compat_ushort_t st_nlink; compat_ushort_t st_nlink;
__compat_uid16_t st_uid; __compat_uid16_t st_uid;
__compat_gid16_t st_gid; __compat_gid16_t st_gid;
#ifdef __AARCH64EB__
short st_rdev;
short __pad2;
#else
compat_dev_t st_rdev; compat_dev_t st_rdev;
#endif
compat_off_t st_size; compat_off_t st_size;
compat_off_t st_blksize; compat_off_t st_blksize;
compat_off_t st_blocks; compat_off_t st_blocks;
......
...@@ -162,7 +162,12 @@ extern unsigned long arch_randomize_brk(struct mm_struct *mm); ...@@ -162,7 +162,12 @@ extern unsigned long arch_randomize_brk(struct mm_struct *mm);
#define arch_randomize_brk arch_randomize_brk #define arch_randomize_brk arch_randomize_brk
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
#ifdef __AARCH64EB__
#define COMPAT_ELF_PLATFORM ("v8b")
#else
#define COMPAT_ELF_PLATFORM ("v8l") #define COMPAT_ELF_PLATFORM ("v8l")
#endif
#define COMPAT_ELF_ET_DYN_BASE (randomize_et_dyn(2 * TASK_SIZE_32 / 3)) #define COMPAT_ELF_ET_DYN_BASE (randomize_et_dyn(2 * TASK_SIZE_32 / 3))
......
...@@ -107,6 +107,11 @@ static inline void compat_start_thread(struct pt_regs *regs, unsigned long pc, ...@@ -107,6 +107,11 @@ static inline void compat_start_thread(struct pt_regs *regs, unsigned long pc,
regs->pstate = COMPAT_PSR_MODE_USR; regs->pstate = COMPAT_PSR_MODE_USR;
if (pc & 1) if (pc & 1)
regs->pstate |= COMPAT_PSR_T_BIT; regs->pstate |= COMPAT_PSR_T_BIT;
#ifdef __AARCH64EB__
regs->pstate |= COMPAT_PSR_E_BIT;
#endif
regs->compat_sp = sp; regs->compat_sp = sp;
} }
#endif #endif
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#define COMPAT_PSR_MODE_UND 0x0000001b #define COMPAT_PSR_MODE_UND 0x0000001b
#define COMPAT_PSR_MODE_SYS 0x0000001f #define COMPAT_PSR_MODE_SYS 0x0000001f
#define COMPAT_PSR_T_BIT 0x00000020 #define COMPAT_PSR_T_BIT 0x00000020
#define COMPAT_PSR_E_BIT 0x00000200
#define COMPAT_PSR_F_BIT 0x00000040 #define COMPAT_PSR_F_BIT 0x00000040
#define COMPAT_PSR_I_BIT 0x00000080 #define COMPAT_PSR_I_BIT 0x00000080
#define COMPAT_PSR_A_BIT 0x00000100 #define COMPAT_PSR_A_BIT 0x00000100
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment