Commit 5d413124 authored by Yury Norov's avatar Yury Norov Committed by Chen Jun
Browse files

arm64: introduce is_a32_compat_{task,thread} for AArch32 compat

maillist inclusion
category: feature
bugzilla: 46790
CVE: NA

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



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

Based on patch of Andrew Pinski.

This patch introduces is_a32_compat_task and is_a32_thread so it is
easier to say this is a a32 specific thread or a generic compat
thread/task. Corresponding functions are located in <asm/is_compat.h>
to avoid mess in headers.

Some files include both <linux/compat.h> and <asm/compat.h>,
and this is wrong because <linux/compat.h> has <asm/compat.h> already
included. It was fixed too.

Signed-off-by: default avatarYury Norov <ynorov@caviumnetworks.com>
Signed-off-by: default avatarAndrew Pinski <Andrew.Pinski@caviumnetworks.com>
Signed-off-by: default avatarBamvor Jian Zhang <bamv2005@gmail.com>
Signed-off-by: default avatarYury Norov <ynorov@marvell.com>

 Conflicts:
	arch/arm64/include/asm/compat.h
	arch/arm64/kernel/process.c
	arch/arm64/kernel/traps.c
	arch/arm64/mm/mmap.c

Signed-off-by: default avatarXiongfeng Wang <wangxiongfeng2@huawei.com>
Acked-by: default avatarXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: default avatarChen Jun <chenjun102@huawei.com>
parent b37e0eb4
Loading
Loading
Loading
Loading
+2 −17
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@
#include <linux/sched.h>
#include <linux/sched/task_stack.h>

#include <asm/is_compat.h>

#define COMPAT_USER_HZ		100
#ifdef __AARCH64EB__
#define COMPAT_UTS_MACHINE	"armv8b\0\0"
@@ -178,22 +180,5 @@ struct compat_shmid64_ds {
	compat_ulong_t __unused5;
};

static inline int is_compat_task(void)
{
	return test_thread_flag(TIF_32BIT);
}

static inline int is_compat_thread(struct thread_info *thread)
{
	return test_ti_thread_flag(thread, TIF_32BIT);
}

#else /* !CONFIG_COMPAT */

static inline int is_compat_thread(struct thread_info *thread)
{
	return 0;
}

#endif /* CONFIG_COMPAT */
#endif /* __ASM_COMPAT_H */
+5 −5
Original line number Diff line number Diff line
@@ -5,6 +5,10 @@
#ifndef __ASM_ELF_H
#define __ASM_ELF_H

#ifndef __ASSEMBLY__
#include <linux/compat.h>
#endif

#include <asm/hwcap.h>

/*
@@ -187,13 +191,9 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm,
				       int uses_interp);

/* 1GB of VA */
#ifdef CONFIG_COMPAT
#define STACK_RND_MASK			(test_thread_flag(TIF_32BIT) ? \
#define STACK_RND_MASK			(is_compat_task() ? \
						0x7ff >> (PAGE_SHIFT - 12) : \
						0x3ffff >> (PAGE_SHIFT - 12))
#else
#define STACK_RND_MASK			(0x3ffff >> (PAGE_SHIFT - 12))
#endif

#ifdef __AARCH64EB__
#define COMPAT_ELF_PLATFORM		("v8b")
+1 −1
Original line number Diff line number Diff line
@@ -88,7 +88,7 @@ int ftrace_init_nop(struct module *mod, struct dyn_ftrace *rec);
#define ARCH_TRACE_IGNORE_COMPAT_SYSCALLS
static inline bool arch_trace_is_compat_syscall(struct pt_regs *regs)
{
	return is_compat_task();
	return is_a32_compat_task();
}

#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
+52 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */

#ifndef __ASM_IS_COMPAT_H
#define __ASM_IS_COMPAT_H
#ifndef __ASSEMBLY__

#include <linux/thread_bits.h>

#ifdef CONFIG_AARCH32_EL0

static inline int is_a32_compat_task(void)
{
	return test_thread_flag(TIF_32BIT);
}

static inline int is_a32_compat_thread(struct thread_info *thread)
{
	return test_ti_thread_flag(thread, TIF_32BIT);
}

#else

static inline int is_a32_compat_task(void)

{
	return 0;
}

static inline int is_a32_compat_thread(struct thread_info *thread)
{
	return 0;
}

#endif /* CONFIG_AARCH32_EL0 */

#ifdef CONFIG_COMPAT

static inline int is_compat_task(void)
{
	return is_a32_compat_task();
}

#endif /* CONFIG_COMPAT */

static inline int is_compat_thread(struct thread_info *thread)
{
	return is_a32_compat_thread(thread);
}


#endif /* !__ASSEMBLY__ */
#endif /* __ASM_IS_COMPAT_H */
+6 −5
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@

#include <asm/alternative.h>
#include <asm/cpufeature.h>
#include <asm/is_compat.h>
#include <asm/hw_breakpoint.h>
#include <asm/kasan.h>
#include <asm/lse.h>
@@ -59,11 +60,11 @@
#else
#define TASK_SIZE_32		(UL(0x100000000) - PAGE_SIZE)
#endif /* CONFIG_ARM64_64K_PAGES */
#define TASK_SIZE		(test_thread_flag(TIF_32BIT) ? \
#define TASK_SIZE		(is_compat_task() ? \
				TASK_SIZE_32 : TASK_SIZE_64)
#define TASK_SIZE_OF(tsk)	(test_tsk_thread_flag(tsk, TIF_32BIT) ? \
#define TASK_SIZE_OF(tsk)	(is_compat_thread(tsk) ? \
				TASK_SIZE_32 : TASK_SIZE_64)
#define DEFAULT_MAP_WINDOW	(test_thread_flag(TIF_32BIT) ? \
#define DEFAULT_MAP_WINDOW	(is_compat_task() ? \
				TASK_SIZE_32 : DEFAULT_MAP_WINDOW_64)
#else
#define TASK_SIZE		TASK_SIZE_64
@@ -80,7 +81,7 @@

#ifdef CONFIG_COMPAT
#define AARCH32_VECTORS_BASE	0xffff0000
#define STACK_TOP		(test_thread_flag(TIF_32BIT) ? \
#define STACK_TOP		(is_compat_task() ? \
				AARCH32_VECTORS_BASE : STACK_TOP_MAX)
#else
#define STACK_TOP		STACK_TOP_MAX
@@ -175,7 +176,7 @@ static inline void arch_thread_struct_whitelist(unsigned long *offset,
#define task_user_tls(t)						\
({									\
	unsigned long *__tls;						\
	if (is_compat_thread(task_thread_info(t)))			\
	if (is_a32_compat_thread(task_thread_info(t)))			\
		__tls = &(t)->thread.uw.tp2_value;			\
	else								\
		__tls = &(t)->thread.uw.tp_value;			\
Loading