提交 b18d5a92 编写于 作者: A Andrew Pinski 提交者: Chen Jun

arm64: rename COMPAT to AARCH32_EL0

maillist inclusion
category: feature
bugzilla: 46790
CVE: NA

Reference: https://github.com/norov/linux/commits/ilp32-5.2

--------------------------------

In this patchset ILP32 ABI support is added. Additionally to AARCH32,
which is binary-compatible with ARM, ILP32 is (mostly) ABI-compatible.

From now, AARCH32_EL0 (former COMPAT) config option means the support of
AARCH32 userspace, and ARM64_ILP32 - support of ILP32 ABI (see following
patches). COMPAT indicates that one of them or both is enabled.

Where needed, CONFIG_COMPAT is changed over to use CONFIG_AARCH32_EL0
instead.
Reviewed-by: NDavid Daney <ddaney@caviumnetworks.com>
Signed-off-by: NAndrew Pinski <Andrew.Pinski@caviumnetworks.com>
Signed-off-by: NYury Norov <ynorov@caviumnetworks.com>
Signed-off-by: NPhilipp Tomsich <philipp.tomsich@theobroma-systems.com>
Signed-off-by: NChristoph Muellner <christoph.muellner@theobroma-systems.com>
Signed-off-by: NBamvor Jian Zhang <bamv2005@gmail.com>
Signed-off-by: NYury Norov <ynorov@marvell.com>

 Conflicts:
	arch/arm64/Kconfig
	arch/arm64/include/asm/fpsimd.h
	arch/arm64/include/asm/processor.h
	arch/arm64/include/asm/signal32.h
	arch/arm64/kernel/Makefile
	arch/arm64/kernel/cpuinfo.c
	arch/arm64/kernel/cpufeature.c
	arch/arm64/kernel/entry.S
	arch/arm64/kernel/entry-common.c
	arch/arm64/kernel/syscall.c
	drivers/clocksource/arm_arch_timer.c
Signed-off-by: NXiongfeng Wang <wangxiongfeng2@huawei.com>
Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
上级 47796491
......@@ -483,7 +483,7 @@ config ARM64_ERRATUM_834220
config ARM64_ERRATUM_845719
bool "Cortex-A53: 845719: a load might read incorrect data"
depends on COMPAT
depends on AARCH32_EL0
default y
help
This option adds an alternative code sequence to work around ARM
......@@ -1214,7 +1214,7 @@ config ARM64_TAGGED_ADDR_ABI
to system calls as pointer arguments. For details, see
Documentation/arm64/tagged-address-abi.rst.
menuconfig COMPAT
menuconfig AARCH32_EL0
bool "Kernel support for 32-bit EL0"
depends on ARM64_4K_PAGES || EXPERT
select COMPAT_BINFMT_ELF if BINFMT_ELF
......@@ -1233,7 +1233,7 @@ menuconfig COMPAT
If you want to execute 32-bit userspace applications, say Y.
if COMPAT
if AARCH32_EL0
config KUSER_HELPERS
bool "Enable kuser helpers page for 32-bit applications"
......@@ -1285,6 +1285,7 @@ config THUMB2_COMPAT_VDSO
menuconfig ARMV8_DEPRECATED
bool "Emulate deprecated/obsolete ARMv8 instructions"
depends on AARCH32_EL0
depends on SYSCTL
help
Legacy software support may require certain instructions
......@@ -1891,6 +1892,10 @@ config DMI
endmenu
config COMPAT
def_bool y
depends on AARCH32_EL0
config SYSVIPC_COMPAT
def_bool y
depends on COMPAT && SYSVIPC
......
......@@ -234,7 +234,7 @@ static inline int arch_timer_arch_init(void)
static inline void arch_timer_set_evtstrm_feature(void)
{
cpu_set_named_feature(EVTSTRM);
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
compat_elf_hwcap |= COMPAT_HWCAP_EVTSTRM;
#endif
}
......
......@@ -21,7 +21,7 @@
#include <linux/stddef.h>
#include <linux/types.h>
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
/* Masks for extracting the FPSR and FPCR from the FPSCR */
#define VFP_FPSCR_STAT_MASK 0xf800009f
#define VFP_FPSCR_CTRL_MASK 0x07f79f00
......
......@@ -113,7 +113,7 @@
#define ELF_HWCAP cpu_get_elf_hwcap()
#define ELF_HWCAP2 cpu_get_elf_hwcap2()
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
#define COMPAT_ELF_HWCAP (compat_elf_hwcap)
#define COMPAT_ELF_HWCAP2 (compat_elf_hwcap2)
extern unsigned int compat_elf_hwcap, compat_elf_hwcap2;
......@@ -121,7 +121,7 @@ extern unsigned int compat_elf_hwcap, compat_elf_hwcap2;
enum {
CAP_HWCAP = 1,
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
CAP_COMPAT_HWCAP,
CAP_COMPAT_HWCAP2,
#endif
......
......@@ -171,7 +171,7 @@ static inline void arch_thread_struct_whitelist(unsigned long *offset,
*size = sizeof_field(struct thread_struct, uw);
}
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
#define task_user_tls(t) \
({ \
unsigned long *__tls; \
......@@ -211,7 +211,7 @@ static inline void start_thread(struct pt_regs *regs, unsigned long pc,
regs->sp = sp;
}
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
static inline void compat_start_thread(struct pt_regs *regs, unsigned long pc,
unsigned long sp)
{
......
......@@ -213,7 +213,7 @@ static inline void forget_syscall(struct pt_regs *regs)
#define arch_has_single_step() (1)
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
#define compat_thumb_mode(regs) \
(((regs)->pstate & PSR_AA32_T_BIT))
#else
......
......@@ -10,7 +10,7 @@
#include <asm/unistd.h>
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
#define __NR_seccomp_read_32 __NR_compat_read
#define __NR_seccomp_write_32 __NR_compat_write
#define __NR_seccomp_exit_32 __NR_compat_exit
......
......@@ -5,7 +5,7 @@
#ifndef __ASM_SIGNAL32_H
#define __ASM_SIGNAL32_H
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
#include <linux/compat.h>
struct compat_sigcontext {
......@@ -77,5 +77,5 @@ static inline int compat_setup_rt_frame(int usig, struct ksignal *ksig, sigset_t
static inline void compat_setup_restart_syscall(struct pt_regs *regs)
{
}
#endif /* CONFIG_COMPAT */
#endif /* CONFIG_AARCH32_EL0 */
#endif /* __ASM_SIGNAL32_H */
......@@ -13,7 +13,7 @@ typedef long (*syscall_fn_t)(const struct pt_regs *regs);
extern const syscall_fn_t sys_call_table[];
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
extern const syscall_fn_t compat_sys_call_table[];
#endif
......
......@@ -2,7 +2,7 @@
/*
* Copyright (C) 2012 ARM Ltd.
*/
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
#define __ARCH_WANT_COMPAT_STAT64
#define __ARCH_WANT_SYS_GETHOSTNAME
#define __ARCH_WANT_SYS_PAUSE
......
......@@ -25,9 +25,9 @@ OBJCOPYFLAGS := --prefix-symbols=__efistub_
$(obj)/%.stub.o: $(obj)/%.o FORCE
$(call if_changed,objcopy)
obj-$(CONFIG_COMPAT) += sys32.o signal32.o \
obj-$(CONFIG_AARCH32_EL0) += sys32.o signal32.o \
sys_compat.o
obj-$(CONFIG_COMPAT) += sigreturn32.o
obj-$(CONFIG_AARCH32_EL0) += sigreturn32.o
obj-$(CONFIG_KUSER_HELPERS) += kuser32.o
obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o
obj-$(CONFIG_MODULES) += module.o
......
......@@ -75,7 +75,7 @@ int main(void)
DEFINE(S_STACKFRAME, offsetof(struct pt_regs, stackframe));
DEFINE(S_FRAME_SIZE, sizeof(struct pt_regs));
BLANK();
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
DEFINE(COMPAT_SIGFRAME_REGS_OFFSET, offsetof(struct compat_sigframe, uc.uc_mcontext.arm_r0));
DEFINE(COMPAT_RT_SIGFRAME_REGS_OFFSET, offsetof(struct compat_rt_sigframe, sig.uc.uc_mcontext.arm_r0));
BLANK();
......
......@@ -84,7 +84,7 @@
/* Kernel representation of AT_HWCAP and AT_HWCAP2 */
static unsigned long elf_hwcap __read_mostly;
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
#define COMPAT_ELF_HWCAP_DEFAULT \
(COMPAT_HWCAP_HALF|COMPAT_HWCAP_THUMB|\
COMPAT_HWCAP_FAST_MULT|COMPAT_HWCAP_EDSP|\
......@@ -2260,7 +2260,7 @@ static const struct arm64_cpu_capabilities arm64_elf_hwcaps[] = {
{},
};
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
static bool compat_has_neon(const struct arm64_cpu_capabilities *cap, int scope)
{
/*
......@@ -2283,7 +2283,7 @@ static bool compat_has_neon(const struct arm64_cpu_capabilities *cap, int scope)
#endif
static const struct arm64_cpu_capabilities compat_elf_hwcaps[] = {
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
HWCAP_CAP_MATCH(compat_has_neon, CAP_COMPAT_HWCAP, COMPAT_HWCAP_NEON),
HWCAP_CAP(SYS_MVFR1_EL1, MVFR1_SIMDFMAC_SHIFT, FTR_UNSIGNED, 1, CAP_COMPAT_HWCAP, COMPAT_HWCAP_VFPv4),
/* Arm v8 mandates MVFR0.FPDP == {0, 2}. So, piggy back on this for the presence of VFP support */
......@@ -2304,7 +2304,7 @@ static void __init cap_set_elf_hwcap(const struct arm64_cpu_capabilities *cap)
case CAP_HWCAP:
cpu_set_feature(cap->hwcap);
break;
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
case CAP_COMPAT_HWCAP:
compat_elf_hwcap |= (u32)cap->hwcap;
break;
......@@ -2327,7 +2327,7 @@ static bool cpus_have_elf_hwcap(const struct arm64_cpu_capabilities *cap)
case CAP_HWCAP:
rc = cpu_have_feature(cap->hwcap);
break;
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
case CAP_COMPAT_HWCAP:
rc = (compat_elf_hwcap & (u32)cap->hwcap) != 0;
break;
......
......@@ -96,7 +96,7 @@ static const char *const hwcap_str[] = {
[KERNEL_HWCAP_MTE] = "mte",
};
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
#define COMPAT_KERNEL_HWCAP(x) const_ilog2(COMPAT_HWCAP_ ## x)
static const char *const compat_hwcap_str[] = {
[COMPAT_KERNEL_HWCAP(SWP)] = "swp",
......@@ -131,7 +131,7 @@ static const char *const compat_hwcap2_str[] = {
[COMPAT_KERNEL_HWCAP2(SHA2)] = "sha2",
[COMPAT_KERNEL_HWCAP2(CRC32)] = "crc32",
};
#endif /* CONFIG_COMPAT */
#endif /* CONFIG_AARCH32_EL0 */
static int c_show(struct seq_file *m, void *v)
{
......@@ -164,7 +164,7 @@ static int c_show(struct seq_file *m, void *v)
*/
seq_puts(m, "Features\t:");
if (compat) {
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
for (j = 0; j < ARRAY_SIZE(compat_hwcap_str); j++) {
if (compat_elf_hwcap & (1 << j)) {
/*
......@@ -181,7 +181,7 @@ static int c_show(struct seq_file *m, void *v)
for (j = 0; j < ARRAY_SIZE(compat_hwcap2_str); j++)
if (compat_elf_hwcap2 & (1 << j))
seq_printf(m, " %s", compat_hwcap2_str[j]);
#endif /* CONFIG_COMPAT */
#endif /* CONFIG_AARCH32_EL0 */
} else {
for (j = 0; j < ARRAY_SIZE(hwcap_str); j++)
if (cpu_have_feature(j))
......
......@@ -427,7 +427,7 @@ asmlinkage void noinstr el0_sync_handler(struct pt_regs *regs)
}
}
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
static void noinstr el0_cp15(struct pt_regs *regs, unsigned long esr)
{
enter_from_user_mode();
......@@ -487,4 +487,4 @@ asmlinkage void noinstr el0_sync_compat_handler(struct pt_regs *regs)
el0_inv(regs, esr);
}
}
#endif /* CONFIG_COMPAT */
#endif /* CONFIG_AARCH32_EL0 */
......@@ -526,7 +526,7 @@ SYM_CODE_START(vectors)
kernel_ventry 0, fiq_invalid // FIQ 64-bit EL0
kernel_ventry 0, error // Error 64-bit EL0
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
kernel_ventry 0, sync_compat, 32 // Synchronous 32-bit EL0
kernel_ventry 0, irq_compat, 32 // IRQ 32-bit EL0
kernel_ventry 0, fiq_invalid_compat, 32 // FIQ 32-bit EL0
......@@ -595,7 +595,7 @@ SYM_CODE_START_LOCAL(el0_error_invalid)
inv_entry 0, BAD_ERROR
SYM_CODE_END(el0_error_invalid)
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
SYM_CODE_START_LOCAL(el0_fiq_invalid_compat)
inv_entry 0, BAD_FIQ, 32
SYM_CODE_END(el0_fiq_invalid_compat)
......@@ -671,7 +671,7 @@ SYM_CODE_START_LOCAL_NOALIGN(el0_sync)
b ret_to_user
SYM_CODE_END(el0_sync)
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
.align 6
SYM_CODE_START_LOCAL_NOALIGN(el0_sync_compat)
kernel_entry 0, 32
......
......@@ -563,7 +563,7 @@ set_hcr:
msr vpidr_el2, x0
msr vmpidr_el2, x1
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
msr hstr_el2, xzr // Disable CP15 traps to EL2
#endif
......
......@@ -52,7 +52,7 @@ user_backtrace(struct frame_tail __user *tail,
return buftail.fp;
}
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
/*
* The registers we're interested in are at the end of the variable
* length saved register structure. The fp points at the end of this
......@@ -97,7 +97,7 @@ compat_user_backtrace(struct compat_frame_tail __user *tail,
return (struct compat_frame_tail __user *)compat_ptr(buftail.fp) - 1;
}
#endif /* CONFIG_COMPAT */
#endif /* CONFIG_AARCH32_EL0 */
void perf_callchain_user(struct perf_callchain_entry_ctx *entry,
struct pt_regs *regs)
......@@ -119,7 +119,7 @@ void perf_callchain_user(struct perf_callchain_entry_ctx *entry,
tail && !((unsigned long)tail & 0xf))
tail = user_backtrace(tail, entry);
} else {
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
/* AARCH32 compat mode */
struct compat_frame_tail __user *tail;
......
......@@ -174,7 +174,7 @@ static void ptrace_hbptriggered(struct perf_event *bp,
struct arch_hw_breakpoint *bkpt = counter_arch_bp(bp);
const char *desc = "Hardware breakpoint trap (ptrace)";
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
if (is_compat_task()) {
int si_errno = 0;
int i;
......@@ -1198,7 +1198,9 @@ static const struct user_regset_view user_aarch64_view = {
.regsets = aarch64_regsets, .n = ARRAY_SIZE(aarch64_regsets)
};
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
#include <linux/compat.h>
enum compat_regset {
REGSET_COMPAT_GPR,
REGSET_COMPAT_VFP,
......@@ -1712,11 +1714,11 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
return ret;
}
#endif /* CONFIG_COMPAT */
#endif /* CONFIG_AARCH32_EL0 */
const struct user_regset_view *task_user_regset_view(struct task_struct *task)
{
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
/*
* Core dumping of 32-bit tasks or compat ptrace requests must use the
* user_aarch32_view compatible with arm32. Native ptrace requests on
......
......@@ -19,7 +19,7 @@ long sys_ni_syscall(void);
static long do_ni_syscall(struct pt_regs *regs, int scno)
{
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
long ret;
if (is_compat_task()) {
ret = compat_arm_syscall(regs, scno);
......@@ -204,7 +204,7 @@ void do_el0_svc(struct pt_regs *regs)
el0_svc_common(regs, regs->regs[8], __NR_syscalls, sys_call_table);
}
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
void do_el0_svc_compat(struct pt_regs *regs)
{
el0_svc_common(regs, regs->regs[7], __NR_compat_syscalls,
......
......@@ -276,7 +276,7 @@ static int __setup_additional_pages(enum vdso_abi abi,
return PTR_ERR(ret);
}
#ifdef CONFIG_COMPAT
#ifdef CONFIG_AARCH32_EL0
/*
* Create and map the vectors page for AArch32 tasks.
*/
......@@ -451,7 +451,7 @@ int aarch32_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
mmap_write_unlock(mm);
return ret;
}
#endif /* CONFIG_COMPAT */
#endif /* CONFIG_AARCH32_EL0 */
static int vdso_mremap(const struct vm_special_mapping *sm,
struct vm_area_struct *new_vma)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册