2019-06-04 10:11:33 +02:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
2005-04-16 15:20:36 -07:00
|
|
|
/*
|
2008-08-02 10:55:55 +01:00
|
|
|
* arch/arm/include/asm/thread_info.h
|
2005-04-16 15:20:36 -07:00
|
|
|
*
|
|
|
|
* Copyright (C) 2002 Russell King.
|
|
|
|
*/
|
|
|
|
#ifndef __ASM_ARM_THREAD_INFO_H
|
|
|
|
#define __ASM_ARM_THREAD_INFO_H
|
|
|
|
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
|
2005-11-16 17:23:57 +00:00
|
|
|
#include <linux/compiler.h>
|
2005-04-16 15:20:36 -07:00
|
|
|
#include <asm/fpstate.h>
|
2014-06-18 16:12:40 +01:00
|
|
|
#include <asm/page.h>
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2020-10-25 23:55:16 +01:00
|
|
|
#ifdef CONFIG_KASAN
|
|
|
|
/*
|
|
|
|
* KASan uses a lot of extra stack space so the thread size order needs to
|
|
|
|
* be increased.
|
|
|
|
*/
|
|
|
|
#define THREAD_SIZE_ORDER 2
|
|
|
|
#else
|
2005-05-05 13:11:00 +01:00
|
|
|
#define THREAD_SIZE_ORDER 1
|
2020-10-25 23:55:16 +01:00
|
|
|
#endif
|
2014-06-18 16:12:40 +01:00
|
|
|
#define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
|
2005-05-05 13:11:00 +01:00
|
|
|
#define THREAD_START_SP (THREAD_SIZE - 8)
|
|
|
|
|
2021-09-23 09:15:53 +02:00
|
|
|
#ifdef CONFIG_VMAP_STACK
|
|
|
|
#define THREAD_ALIGN (2 * THREAD_SIZE)
|
|
|
|
#else
|
|
|
|
#define THREAD_ALIGN THREAD_SIZE
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define OVERFLOW_STACK_SIZE SZ_4K
|
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
|
|
|
|
struct task_struct;
|
|
|
|
|
ARM: smp: Store current pointer in TPIDRURO register if available
Now that the user space TLS register is assigned on every return to user
space, we can use it to keep the 'current' pointer while running in the
kernel. This removes the need to access it via thread_info, which is
located at the base of the stack, but will be moved out of there in a
subsequent patch.
Use the __builtin_thread_pointer() helper when available - this will
help GCC understand that reloading the value within the same function is
not necessary, even when using the per-task stack protector (which also
generates accesses via the TLS register). For example, the generated
code below loads TPIDRURO only once, and uses it to access both the
stack canary and the preempt_count fields.
<do_one_initcall>:
e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr}
ee1d 4f70 mrc 15, 0, r4, cr13, cr0, {3}
4606 mov r6, r0
b094 sub sp, #80 ; 0x50
f8d4 34e8 ldr.w r3, [r4, #1256] ; 0x4e8 <- stack canary
9313 str r3, [sp, #76] ; 0x4c
f8d4 8004 ldr.w r8, [r4, #4] <- preempt count
Co-developed-by: Keith Packard <keithpac@amazon.com>
Signed-off-by: Keith Packard <keithpac@amazon.com>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Tested-by: Amit Daniel Kachhap <amit.kachhap@arm.com>
2021-09-18 10:44:37 +02:00
|
|
|
DECLARE_PER_CPU(struct task_struct *, __entry_task);
|
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
#include <asm/types.h>
|
|
|
|
|
|
|
|
struct cpu_context_save {
|
|
|
|
__u32 r4;
|
|
|
|
__u32 r5;
|
|
|
|
__u32 r6;
|
|
|
|
__u32 r7;
|
|
|
|
__u32 r8;
|
|
|
|
__u32 r9;
|
|
|
|
__u32 sl;
|
|
|
|
__u32 fp;
|
|
|
|
__u32 sp;
|
|
|
|
__u32 pc;
|
|
|
|
__u32 extra[2]; /* Xscale 'acc' register, etc */
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* low level task data that entry.S needs immediate access to.
|
|
|
|
* __switch_to() assumes cpu_context follows immediately after cpu_domain.
|
|
|
|
*/
|
|
|
|
struct thread_info {
|
|
|
|
unsigned long flags; /* low level flags */
|
2005-06-23 00:09:07 -07:00
|
|
|
int preempt_count; /* 0 => preemptable, <0 => bug */
|
2005-04-16 15:20:36 -07:00
|
|
|
__u32 cpu; /* cpu */
|
|
|
|
__u32 cpu_domain; /* cpu domain */
|
|
|
|
struct cpu_context_save cpu_context; /* cpu context */
|
ARM: 9107/1: syscall: always store thread_info->abi_syscall
The system call number is used in a a couple of places, in particular
ptrace, seccomp and /proc/<pid>/syscall.
The last one apparently never worked reliably on ARM for tasks that are
not currently getting traced.
Storing the syscall number in the normal entry path makes it work,
as well as allowing us to see if the current system call is for OABI
compat mode, which is the next thing I want to hook into.
Since the thread_info->syscall field is not just the number any more, it
is now renamed to abi_syscall. In kernels that enable both OABI and EABI,
the upper bits of this field encode 0x900000 (__NR_OABI_SYSCALL_BASE)
for OABI tasks, while normal EABI tasks do not set the upper bits. This
makes it possible to implement the in_oabi_syscall() helper later.
All other users of thread_info->syscall go through the syscall_get_nr()
helper, which in turn filters out the ABI bits.
Note that the ABI information is lost with PTRACE_SET_SYSCALL, so one
cannot set the internal number to a particular version, but this was
already the case. We could change it to let gdb encode the ABI type along
with the syscall in a CONFIG_OABI_COMPAT-enabled kernel, but that itself
would be a (backwards-compatible) ABI change, so I don't do it here.
Acked-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
2021-08-11 08:30:21 +01:00
|
|
|
__u32 abi_syscall; /* ABI type and syscall nr */
|
2005-04-16 15:20:36 -07:00
|
|
|
__u8 used_cp[16]; /* thread used copro */
|
2013-06-18 23:23:26 +01:00
|
|
|
unsigned long tp_value[2]; /* TLS registers */
|
2006-03-12 22:36:06 +00:00
|
|
|
union fp_state fpstate __attribute__((aligned(8)));
|
2005-04-16 15:20:36 -07:00
|
|
|
union vfp_state vfpstate;
|
2008-04-18 22:43:06 +01:00
|
|
|
#ifdef CONFIG_ARM_THUMBEE
|
|
|
|
unsigned long thumbee_state; /* ThumbEE Handler Base register */
|
|
|
|
#endif
|
2005-04-16 15:20:36 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
#define INIT_THREAD_INFO(tsk) \
|
|
|
|
{ \
|
|
|
|
.flags = 0, \
|
2009-07-10 14:57:56 +02:00
|
|
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
2005-04-16 15:20:36 -07:00
|
|
|
}
|
|
|
|
|
2021-10-29 17:45:32 +01:00
|
|
|
static inline struct task_struct *thread_task(struct thread_info* ti)
|
|
|
|
{
|
|
|
|
return (struct task_struct *)ti;
|
|
|
|
}
|
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
#define thread_saved_pc(tsk) \
|
2008-09-06 10:14:24 +01:00
|
|
|
((unsigned long)(task_thread_info(tsk)->cpu_context.pc))
|
2009-02-11 13:07:53 +01:00
|
|
|
#define thread_saved_sp(tsk) \
|
|
|
|
((unsigned long)(task_thread_info(tsk)->cpu_context.sp))
|
2014-06-03 19:47:14 +01:00
|
|
|
|
|
|
|
#ifndef CONFIG_THUMB2_KERNEL
|
2005-04-16 15:20:36 -07:00
|
|
|
#define thread_saved_fp(tsk) \
|
2006-01-12 01:05:56 -08:00
|
|
|
((unsigned long)(task_thread_info(tsk)->cpu_context.fp))
|
2014-06-03 19:47:14 +01:00
|
|
|
#else
|
|
|
|
#define thread_saved_fp(tsk) \
|
|
|
|
((unsigned long)(task_thread_info(tsk)->cpu_context.r7))
|
|
|
|
#endif
|
2005-04-16 15:20:36 -07:00
|
|
|
|
|
|
|
extern void iwmmxt_task_disable(struct thread_info *);
|
|
|
|
extern void iwmmxt_task_copy(struct thread_info *, void *);
|
|
|
|
extern void iwmmxt_task_restore(struct thread_info *, void *);
|
|
|
|
extern void iwmmxt_task_release(struct thread_info *);
|
2006-07-01 19:56:48 +01:00
|
|
|
extern void iwmmxt_task_switch(struct thread_info *);
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2010-02-06 11:36:23 +00:00
|
|
|
extern void vfp_sync_hwstate(struct thread_info *);
|
|
|
|
extern void vfp_flush_hwstate(struct thread_info *);
|
2009-02-11 13:12:56 +01:00
|
|
|
|
2012-04-23 15:38:28 +01:00
|
|
|
struct user_vfp;
|
|
|
|
struct user_vfp_exc;
|
|
|
|
|
2018-09-11 10:12:18 +01:00
|
|
|
extern int vfp_preserve_user_clear_hwstate(struct user_vfp *,
|
|
|
|
struct user_vfp_exc *);
|
2018-07-09 10:13:36 +01:00
|
|
|
extern int vfp_restore_user_hwstate(struct user_vfp *,
|
|
|
|
struct user_vfp_exc *);
|
2005-04-16 15:20:36 -07:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* thread information flags:
|
|
|
|
* TIF_USEDFPU - FPU was used by this task this quantum (SMP)
|
|
|
|
* TIF_POLLING_NRFLAG - true if poll_idle() is polling TIF_NEED_RESCHED
|
2020-10-09 16:00:49 -06:00
|
|
|
*
|
|
|
|
* Any bit in the range of 0..15 will cause do_work_pending() to be invoked.
|
2005-04-16 15:20:36 -07:00
|
|
|
*/
|
2015-08-20 16:13:37 +01:00
|
|
|
#define TIF_SIGPENDING 0 /* signal pending */
|
|
|
|
#define TIF_NEED_RESCHED 1 /* rescheduling necessary */
|
2009-09-02 09:14:16 +01:00
|
|
|
#define TIF_NOTIFY_RESUME 2 /* callback before returning to user */
|
2015-08-20 16:13:37 +01:00
|
|
|
#define TIF_UPROBE 3 /* breakpointed or singlestepping */
|
2017-09-07 08:30:45 -07:00
|
|
|
#define TIF_SYSCALL_TRACE 4 /* syscall trace active */
|
|
|
|
#define TIF_SYSCALL_AUDIT 5 /* syscall auditing active */
|
|
|
|
#define TIF_SYSCALL_TRACEPOINT 6 /* syscall tracepoint instrumentation */
|
|
|
|
#define TIF_SECCOMP 7 /* seccomp syscall filtering active */
|
2020-10-09 16:00:49 -06:00
|
|
|
#define TIF_NOTIFY_SIGNAL 8 /* signal notifications exist */
|
2015-08-20 16:13:37 +01:00
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
#define TIF_USING_IWMMXT 17
|
2010-05-14 11:13:27 +02:00
|
|
|
#define TIF_MEMDIE 18 /* is terminating due to OOM killer */
|
ARM: 5677/1: ARM support for TIF_RESTORE_SIGMASK/pselect6/ppoll/epoll_pwait
This patch adds support for TIF_RESTORE_SIGMASK to ARM's
signal handling, which allows to hook up the pselect6, ppoll,
and epoll_pwait syscalls on ARM.
Tested here with eabi userspace and a test program with a
deliberate race between a child's exit and the parent's
sigprocmask/select sequence. Using sys_pselect6() instead
of sigprocmask/select reliably prevents the race.
The other arch's support for TIF_RESTORE_SIGMASK has evolved
over time:
In 2.6.16:
- add TIF_RESTORE_SIGMASK which parallels TIF_SIGPENDING
- test both when checking for pending signal [changed later]
- reimplement sys_sigsuspend() to use current->saved_sigmask,
TIF_RESTORE_SIGMASK [changed later], and -ERESTARTNOHAND;
ditto for sys_rt_sigsuspend(), but drop private code and
use common code via __ARCH_WANT_SYS_RT_SIGSUSPEND;
- there are now no "extra" calls to do_signal() so its oldset
parameter is always ¤t->blocked so need not be passed,
also its return value is changed to void
- change handle_signal() to return 0/-errno
- change do_signal() to honor TIF_RESTORE_SIGMASK:
+ get oldset from current->saved_sigmask if TIF_RESTORE_SIGMASK
is set
+ if handle_signal() was successful then clear TIF_RESTORE_SIGMASK
+ if no signal was delivered and TIF_RESTORE_SIGMASK is set then
clear it and restore the sigmask
- hook up sys_pselect6() and sys_ppoll()
In 2.6.19:
- hook up sys_epoll_pwait()
In 2.6.26:
- allow archs to override how TIF_RESTORE_SIGMASK is implemented;
default set_restore_sigmask() sets both TIF_RESTORE_SIGMASK and
TIF_SIGPENDING; archs need now just test TIF_SIGPENDING again
when checking for pending signal work; some archs now implement
TIF_RESTORE_SIGMASK as a secondary/non-atomic thread flag bit
- call set_restore_sigmask() in sys_sigsuspend() instead of setting
TIF_RESTORE_SIGMASK
In 2.6.29-rc:
- kill sys_pselect7() which no arch wanted
So for 2.6.31-rc6/ARM this patch does the following:
- Add TIF_RESTORE_SIGMASK. Use the generic set_restore_sigmask()
which sets both TIF_SIGPENDING and TIF_RESTORE_SIGMASK, so
TIF_RESTORE_SIGMASK need not claim one of the scarce low thread
flags, and existing TIF_SIGPENDING and _TIF_WORK_MASK tests need
not be extended for TIF_RESTORE_SIGMASK.
- sys_sigsuspend() is reimplemented to use current->saved_sigmask
and set_restore_sigmask(), making it identical to most other archs
- The private code for sys_rt_sigsuspend() is removed, instead
generic code supplies it via __ARCH_WANT_SYS_RT_SIGSUSPEND.
- sys_sigsuspend() and sys_rt_sigsuspend() no longer need a pt_regs
parameter, so their assembly code wrappers are removed.
- handle_signal() is changed to return 0 on success or -errno.
- The oldset parameter to do_signal() is now redundant and removed,
and the return value is now also redundant and changed to void.
- do_signal() is changed to honor TIF_RESTORE_SIGMASK:
+ get oldset from current->saved_sigmask if TIF_RESTORE_SIGMASK
is set
+ if handle_signal() was successful then clear TIF_RESTORE_SIGMASK
+ if no signal was delivered and TIF_RESTORE_SIGMASK is set then
clear it and restore the sigmask
- Hook up sys_pselect6, sys_ppoll, and sys_epoll_pwait.
Signed-off-by: Mikael Pettersson <mikpe@it.uu.se>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2009-08-15 12:58:11 +01:00
|
|
|
#define TIF_RESTORE_SIGMASK 20
|
2005-04-16 15:20:36 -07:00
|
|
|
|
|
|
|
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
|
|
|
|
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
|
2009-09-02 09:14:16 +01:00
|
|
|
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
|
2014-03-07 11:23:04 -05:00
|
|
|
#define _TIF_UPROBE (1 << TIF_UPROBE)
|
2005-04-16 15:20:36 -07:00
|
|
|
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
|
2012-01-03 14:23:09 -05:00
|
|
|
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
|
2012-09-07 18:18:25 +01:00
|
|
|
#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT)
|
2010-08-26 15:08:35 -07:00
|
|
|
#define _TIF_SECCOMP (1 << TIF_SECCOMP)
|
2020-10-09 16:00:49 -06:00
|
|
|
#define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL)
|
2012-11-15 22:12:00 +01:00
|
|
|
#define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT)
|
2005-04-16 15:20:36 -07:00
|
|
|
|
2012-01-03 14:23:09 -05:00
|
|
|
/* Checks for any syscall work in entry-common.S */
|
2012-11-15 22:12:00 +01:00
|
|
|
#define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
|
|
|
|
_TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP)
|
2012-01-03 14:23:09 -05:00
|
|
|
|
2005-04-16 15:20:36 -07:00
|
|
|
/*
|
|
|
|
* Change these and you break ASM code in entry-common.S
|
|
|
|
*/
|
2017-09-07 08:30:45 -07:00
|
|
|
#define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \
|
2020-10-09 16:00:49 -06:00
|
|
|
_TIF_NOTIFY_RESUME | _TIF_UPROBE | \
|
|
|
|
_TIF_NOTIFY_SIGNAL)
|
2005-04-16 15:20:36 -07:00
|
|
|
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
#endif /* __ASM_ARM_THREAD_INFO_H */
|