cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

signal.h (14092B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _LINUX_SIGNAL_H
      3#define _LINUX_SIGNAL_H
      4
      5#include <linux/bug.h>
      6#include <linux/signal_types.h>
      7#include <linux/string.h>
      8
      9struct task_struct;
     10
     11/* for sysctl */
     12extern int print_fatal_signals;
     13
     14static inline void copy_siginfo(kernel_siginfo_t *to,
     15				const kernel_siginfo_t *from)
     16{
     17	memcpy(to, from, sizeof(*to));
     18}
     19
     20static inline void clear_siginfo(kernel_siginfo_t *info)
     21{
     22	memset(info, 0, sizeof(*info));
     23}
     24
     25#define SI_EXPANSION_SIZE (sizeof(struct siginfo) - sizeof(struct kernel_siginfo))
     26
     27static inline void copy_siginfo_to_external(siginfo_t *to,
     28					    const kernel_siginfo_t *from)
     29{
     30	memcpy(to, from, sizeof(*from));
     31	memset(((char *)to) + sizeof(struct kernel_siginfo), 0,
     32		SI_EXPANSION_SIZE);
     33}
     34
     35int copy_siginfo_to_user(siginfo_t __user *to, const kernel_siginfo_t *from);
     36int copy_siginfo_from_user(kernel_siginfo_t *to, const siginfo_t __user *from);
     37
     38enum siginfo_layout {
     39	SIL_KILL,
     40	SIL_TIMER,
     41	SIL_POLL,
     42	SIL_FAULT,
     43	SIL_FAULT_TRAPNO,
     44	SIL_FAULT_MCEERR,
     45	SIL_FAULT_BNDERR,
     46	SIL_FAULT_PKUERR,
     47	SIL_FAULT_PERF_EVENT,
     48	SIL_CHLD,
     49	SIL_RT,
     50	SIL_SYS,
     51};
     52
     53enum siginfo_layout siginfo_layout(unsigned sig, int si_code);
     54
     55/*
     56 * Define some primitives to manipulate sigset_t.
     57 */
     58
     59#ifndef __HAVE_ARCH_SIG_BITOPS
     60#include <linux/bitops.h>
     61
     62/* We don't use <linux/bitops.h> for these because there is no need to
     63   be atomic.  */
     64static inline void sigaddset(sigset_t *set, int _sig)
     65{
     66	unsigned long sig = _sig - 1;
     67	if (_NSIG_WORDS == 1)
     68		set->sig[0] |= 1UL << sig;
     69	else
     70		set->sig[sig / _NSIG_BPW] |= 1UL << (sig % _NSIG_BPW);
     71}
     72
     73static inline void sigdelset(sigset_t *set, int _sig)
     74{
     75	unsigned long sig = _sig - 1;
     76	if (_NSIG_WORDS == 1)
     77		set->sig[0] &= ~(1UL << sig);
     78	else
     79		set->sig[sig / _NSIG_BPW] &= ~(1UL << (sig % _NSIG_BPW));
     80}
     81
     82static inline int sigismember(sigset_t *set, int _sig)
     83{
     84	unsigned long sig = _sig - 1;
     85	if (_NSIG_WORDS == 1)
     86		return 1 & (set->sig[0] >> sig);
     87	else
     88		return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW));
     89}
     90
     91#endif /* __HAVE_ARCH_SIG_BITOPS */
     92
     93static inline int sigisemptyset(sigset_t *set)
     94{
     95	switch (_NSIG_WORDS) {
     96	case 4:
     97		return (set->sig[3] | set->sig[2] |
     98			set->sig[1] | set->sig[0]) == 0;
     99	case 2:
    100		return (set->sig[1] | set->sig[0]) == 0;
    101	case 1:
    102		return set->sig[0] == 0;
    103	default:
    104		BUILD_BUG();
    105		return 0;
    106	}
    107}
    108
    109static inline int sigequalsets(const sigset_t *set1, const sigset_t *set2)
    110{
    111	switch (_NSIG_WORDS) {
    112	case 4:
    113		return	(set1->sig[3] == set2->sig[3]) &&
    114			(set1->sig[2] == set2->sig[2]) &&
    115			(set1->sig[1] == set2->sig[1]) &&
    116			(set1->sig[0] == set2->sig[0]);
    117	case 2:
    118		return	(set1->sig[1] == set2->sig[1]) &&
    119			(set1->sig[0] == set2->sig[0]);
    120	case 1:
    121		return	set1->sig[0] == set2->sig[0];
    122	}
    123	return 0;
    124}
    125
    126#define sigmask(sig)	(1UL << ((sig) - 1))
    127
    128#ifndef __HAVE_ARCH_SIG_SETOPS
    129
    130#define _SIG_SET_BINOP(name, op)					\
    131static inline void name(sigset_t *r, const sigset_t *a, const sigset_t *b) \
    132{									\
    133	unsigned long a0, a1, a2, a3, b0, b1, b2, b3;			\
    134									\
    135	switch (_NSIG_WORDS) {						\
    136	case 4:								\
    137		a3 = a->sig[3]; a2 = a->sig[2];				\
    138		b3 = b->sig[3]; b2 = b->sig[2];				\
    139		r->sig[3] = op(a3, b3);					\
    140		r->sig[2] = op(a2, b2);					\
    141		fallthrough;						\
    142	case 2:								\
    143		a1 = a->sig[1]; b1 = b->sig[1];				\
    144		r->sig[1] = op(a1, b1);					\
    145		fallthrough;						\
    146	case 1:								\
    147		a0 = a->sig[0]; b0 = b->sig[0];				\
    148		r->sig[0] = op(a0, b0);					\
    149		break;							\
    150	default:							\
    151		BUILD_BUG();						\
    152	}								\
    153}
    154
    155#define _sig_or(x,y)	((x) | (y))
    156_SIG_SET_BINOP(sigorsets, _sig_or)
    157
    158#define _sig_and(x,y)	((x) & (y))
    159_SIG_SET_BINOP(sigandsets, _sig_and)
    160
    161#define _sig_andn(x,y)	((x) & ~(y))
    162_SIG_SET_BINOP(sigandnsets, _sig_andn)
    163
    164#undef _SIG_SET_BINOP
    165#undef _sig_or
    166#undef _sig_and
    167#undef _sig_andn
    168
    169#define _SIG_SET_OP(name, op)						\
    170static inline void name(sigset_t *set)					\
    171{									\
    172	switch (_NSIG_WORDS) {						\
    173	case 4:	set->sig[3] = op(set->sig[3]);				\
    174		set->sig[2] = op(set->sig[2]);				\
    175		fallthrough;						\
    176	case 2:	set->sig[1] = op(set->sig[1]);				\
    177		fallthrough;						\
    178	case 1:	set->sig[0] = op(set->sig[0]);				\
    179		    break;						\
    180	default:							\
    181		BUILD_BUG();						\
    182	}								\
    183}
    184
    185#define _sig_not(x)	(~(x))
    186_SIG_SET_OP(signotset, _sig_not)
    187
    188#undef _SIG_SET_OP
    189#undef _sig_not
    190
    191static inline void sigemptyset(sigset_t *set)
    192{
    193	switch (_NSIG_WORDS) {
    194	default:
    195		memset(set, 0, sizeof(sigset_t));
    196		break;
    197	case 2: set->sig[1] = 0;
    198		fallthrough;
    199	case 1:	set->sig[0] = 0;
    200		break;
    201	}
    202}
    203
    204static inline void sigfillset(sigset_t *set)
    205{
    206	switch (_NSIG_WORDS) {
    207	default:
    208		memset(set, -1, sizeof(sigset_t));
    209		break;
    210	case 2: set->sig[1] = -1;
    211		fallthrough;
    212	case 1:	set->sig[0] = -1;
    213		break;
    214	}
    215}
    216
    217/* Some extensions for manipulating the low 32 signals in particular.  */
    218
    219static inline void sigaddsetmask(sigset_t *set, unsigned long mask)
    220{
    221	set->sig[0] |= mask;
    222}
    223
    224static inline void sigdelsetmask(sigset_t *set, unsigned long mask)
    225{
    226	set->sig[0] &= ~mask;
    227}
    228
    229static inline int sigtestsetmask(sigset_t *set, unsigned long mask)
    230{
    231	return (set->sig[0] & mask) != 0;
    232}
    233
    234static inline void siginitset(sigset_t *set, unsigned long mask)
    235{
    236	set->sig[0] = mask;
    237	switch (_NSIG_WORDS) {
    238	default:
    239		memset(&set->sig[1], 0, sizeof(long)*(_NSIG_WORDS-1));
    240		break;
    241	case 2: set->sig[1] = 0;
    242		break;
    243	case 1: ;
    244	}
    245}
    246
    247static inline void siginitsetinv(sigset_t *set, unsigned long mask)
    248{
    249	set->sig[0] = ~mask;
    250	switch (_NSIG_WORDS) {
    251	default:
    252		memset(&set->sig[1], -1, sizeof(long)*(_NSIG_WORDS-1));
    253		break;
    254	case 2: set->sig[1] = -1;
    255		break;
    256	case 1: ;
    257	}
    258}
    259
    260#endif /* __HAVE_ARCH_SIG_SETOPS */
    261
    262static inline void init_sigpending(struct sigpending *sig)
    263{
    264	sigemptyset(&sig->signal);
    265	INIT_LIST_HEAD(&sig->list);
    266}
    267
    268extern void flush_sigqueue(struct sigpending *queue);
    269
    270/* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */
    271static inline int valid_signal(unsigned long sig)
    272{
    273	return sig <= _NSIG ? 1 : 0;
    274}
    275
    276struct timespec;
    277struct pt_regs;
    278enum pid_type;
    279
    280extern int next_signal(struct sigpending *pending, sigset_t *mask);
    281extern int do_send_sig_info(int sig, struct kernel_siginfo *info,
    282				struct task_struct *p, enum pid_type type);
    283extern int group_send_sig_info(int sig, struct kernel_siginfo *info,
    284			       struct task_struct *p, enum pid_type type);
    285extern int send_signal_locked(int sig, struct kernel_siginfo *info,
    286			      struct task_struct *p, enum pid_type type);
    287extern int sigprocmask(int, sigset_t *, sigset_t *);
    288extern void set_current_blocked(sigset_t *);
    289extern void __set_current_blocked(const sigset_t *);
    290extern int show_unhandled_signals;
    291
    292extern bool get_signal(struct ksignal *ksig);
    293extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping);
    294extern void exit_signals(struct task_struct *tsk);
    295extern void kernel_sigaction(int, __sighandler_t);
    296
    297#define SIG_KTHREAD ((__force __sighandler_t)2)
    298#define SIG_KTHREAD_KERNEL ((__force __sighandler_t)3)
    299
    300static inline void allow_signal(int sig)
    301{
    302	/*
    303	 * Kernel threads handle their own signals. Let the signal code
    304	 * know it'll be handled, so that they don't get converted to
    305	 * SIGKILL or just silently dropped.
    306	 */
    307	kernel_sigaction(sig, SIG_KTHREAD);
    308}
    309
    310static inline void allow_kernel_signal(int sig)
    311{
    312	/*
    313	 * Kernel threads handle their own signals. Let the signal code
    314	 * know signals sent by the kernel will be handled, so that they
    315	 * don't get silently dropped.
    316	 */
    317	kernel_sigaction(sig, SIG_KTHREAD_KERNEL);
    318}
    319
    320static inline void disallow_signal(int sig)
    321{
    322	kernel_sigaction(sig, SIG_IGN);
    323}
    324
    325extern struct kmem_cache *sighand_cachep;
    326
    327extern bool unhandled_signal(struct task_struct *tsk, int sig);
    328
    329/*
    330 * In POSIX a signal is sent either to a specific thread (Linux task)
    331 * or to the process as a whole (Linux thread group).  How the signal
    332 * is sent determines whether it's to one thread or the whole group,
    333 * which determines which signal mask(s) are involved in blocking it
    334 * from being delivered until later.  When the signal is delivered,
    335 * either it's caught or ignored by a user handler or it has a default
    336 * effect that applies to the whole thread group (POSIX process).
    337 *
    338 * The possible effects an unblocked signal set to SIG_DFL can have are:
    339 *   ignore	- Nothing Happens
    340 *   terminate	- kill the process, i.e. all threads in the group,
    341 * 		  similar to exit_group.  The group leader (only) reports
    342 *		  WIFSIGNALED status to its parent.
    343 *   coredump	- write a core dump file describing all threads using
    344 *		  the same mm and then kill all those threads
    345 *   stop 	- stop all the threads in the group, i.e. TASK_STOPPED state
    346 *
    347 * SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.
    348 * Other signals when not blocked and set to SIG_DFL behaves as follows.
    349 * The job control signals also have other special effects.
    350 *
    351 *	+--------------------+------------------+
    352 *	|  POSIX signal      |  default action  |
    353 *	+--------------------+------------------+
    354 *	|  SIGHUP            |  terminate	|
    355 *	|  SIGINT            |	terminate	|
    356 *	|  SIGQUIT           |	coredump 	|
    357 *	|  SIGILL            |	coredump 	|
    358 *	|  SIGTRAP           |	coredump 	|
    359 *	|  SIGABRT/SIGIOT    |	coredump 	|
    360 *	|  SIGBUS            |	coredump 	|
    361 *	|  SIGFPE            |	coredump 	|
    362 *	|  SIGKILL           |	terminate(+)	|
    363 *	|  SIGUSR1           |	terminate	|
    364 *	|  SIGSEGV           |	coredump 	|
    365 *	|  SIGUSR2           |	terminate	|
    366 *	|  SIGPIPE           |	terminate	|
    367 *	|  SIGALRM           |	terminate	|
    368 *	|  SIGTERM           |	terminate	|
    369 *	|  SIGCHLD           |	ignore   	|
    370 *	|  SIGCONT           |	ignore(*)	|
    371 *	|  SIGSTOP           |	stop(*)(+)  	|
    372 *	|  SIGTSTP           |	stop(*)  	|
    373 *	|  SIGTTIN           |	stop(*)  	|
    374 *	|  SIGTTOU           |	stop(*)  	|
    375 *	|  SIGURG            |	ignore   	|
    376 *	|  SIGXCPU           |	coredump 	|
    377 *	|  SIGXFSZ           |	coredump 	|
    378 *	|  SIGVTALRM         |	terminate	|
    379 *	|  SIGPROF           |	terminate	|
    380 *	|  SIGPOLL/SIGIO     |	terminate	|
    381 *	|  SIGSYS/SIGUNUSED  |	coredump 	|
    382 *	|  SIGSTKFLT         |	terminate	|
    383 *	|  SIGWINCH          |	ignore   	|
    384 *	|  SIGPWR            |	terminate	|
    385 *	|  SIGRTMIN-SIGRTMAX |	terminate       |
    386 *	+--------------------+------------------+
    387 *	|  non-POSIX signal  |  default action  |
    388 *	+--------------------+------------------+
    389 *	|  SIGEMT            |  coredump	|
    390 *	+--------------------+------------------+
    391 *
    392 * (+) For SIGKILL and SIGSTOP the action is "always", not just "default".
    393 * (*) Special job control effects:
    394 * When SIGCONT is sent, it resumes the process (all threads in the group)
    395 * from TASK_STOPPED state and also clears any pending/queued stop signals
    396 * (any of those marked with "stop(*)").  This happens regardless of blocking,
    397 * catching, or ignoring SIGCONT.  When any stop signal is sent, it clears
    398 * any pending/queued SIGCONT signals; this happens regardless of blocking,
    399 * catching, or ignored the stop signal, though (except for SIGSTOP) the
    400 * default action of stopping the process may happen later or never.
    401 */
    402
    403#ifdef SIGEMT
    404#define SIGEMT_MASK	rt_sigmask(SIGEMT)
    405#else
    406#define SIGEMT_MASK	0
    407#endif
    408
    409#if SIGRTMIN > BITS_PER_LONG
    410#define rt_sigmask(sig)	(1ULL << ((sig)-1))
    411#else
    412#define rt_sigmask(sig)	sigmask(sig)
    413#endif
    414
    415#define siginmask(sig, mask) \
    416	((sig) > 0 && (sig) < SIGRTMIN && (rt_sigmask(sig) & (mask)))
    417
    418#define SIG_KERNEL_ONLY_MASK (\
    419	rt_sigmask(SIGKILL)   |  rt_sigmask(SIGSTOP))
    420
    421#define SIG_KERNEL_STOP_MASK (\
    422	rt_sigmask(SIGSTOP)   |  rt_sigmask(SIGTSTP)   | \
    423	rt_sigmask(SIGTTIN)   |  rt_sigmask(SIGTTOU)   )
    424
    425#define SIG_KERNEL_COREDUMP_MASK (\
    426        rt_sigmask(SIGQUIT)   |  rt_sigmask(SIGILL)    | \
    427	rt_sigmask(SIGTRAP)   |  rt_sigmask(SIGABRT)   | \
    428        rt_sigmask(SIGFPE)    |  rt_sigmask(SIGSEGV)   | \
    429	rt_sigmask(SIGBUS)    |  rt_sigmask(SIGSYS)    | \
    430        rt_sigmask(SIGXCPU)   |  rt_sigmask(SIGXFSZ)   | \
    431	SIGEMT_MASK				       )
    432
    433#define SIG_KERNEL_IGNORE_MASK (\
    434        rt_sigmask(SIGCONT)   |  rt_sigmask(SIGCHLD)   | \
    435	rt_sigmask(SIGWINCH)  |  rt_sigmask(SIGURG)    )
    436
    437#define SIG_SPECIFIC_SICODES_MASK (\
    438	rt_sigmask(SIGILL)    |  rt_sigmask(SIGFPE)    | \
    439	rt_sigmask(SIGSEGV)   |  rt_sigmask(SIGBUS)    | \
    440	rt_sigmask(SIGTRAP)   |  rt_sigmask(SIGCHLD)   | \
    441	rt_sigmask(SIGPOLL)   |  rt_sigmask(SIGSYS)    | \
    442	SIGEMT_MASK                                    )
    443
    444#define sig_kernel_only(sig)		siginmask(sig, SIG_KERNEL_ONLY_MASK)
    445#define sig_kernel_coredump(sig)	siginmask(sig, SIG_KERNEL_COREDUMP_MASK)
    446#define sig_kernel_ignore(sig)		siginmask(sig, SIG_KERNEL_IGNORE_MASK)
    447#define sig_kernel_stop(sig)		siginmask(sig, SIG_KERNEL_STOP_MASK)
    448#define sig_specific_sicodes(sig)	siginmask(sig, SIG_SPECIFIC_SICODES_MASK)
    449
    450#define sig_fatal(t, signr) \
    451	(!siginmask(signr, SIG_KERNEL_IGNORE_MASK|SIG_KERNEL_STOP_MASK) && \
    452	 (t)->sighand->action[(signr)-1].sa.sa_handler == SIG_DFL)
    453
    454void signals_init(void);
    455
    456int restore_altstack(const stack_t __user *);
    457int __save_altstack(stack_t __user *, unsigned long);
    458
    459#define unsafe_save_altstack(uss, sp, label) do { \
    460	stack_t __user *__uss = uss; \
    461	struct task_struct *t = current; \
    462	unsafe_put_user((void __user *)t->sas_ss_sp, &__uss->ss_sp, label); \
    463	unsafe_put_user(t->sas_ss_flags, &__uss->ss_flags, label); \
    464	unsafe_put_user(t->sas_ss_size, &__uss->ss_size, label); \
    465} while (0);
    466
    467#ifdef CONFIG_DYNAMIC_SIGFRAME
    468bool sigaltstack_size_valid(size_t ss_size);
    469#else
    470static inline bool sigaltstack_size_valid(size_t size) { return true; }
    471#endif /* !CONFIG_DYNAMIC_SIGFRAME */
    472
    473#ifdef CONFIG_PROC_FS
    474struct seq_file;
    475extern void render_sigset_t(struct seq_file *, const char *, sigset_t *);
    476#endif
    477
    478#ifndef arch_untagged_si_addr
    479/*
    480 * Given a fault address and a signal and si_code which correspond to the
    481 * _sigfault union member, returns the address that must appear in si_addr if
    482 * the signal handler does not have SA_EXPOSE_TAGBITS enabled in sa_flags.
    483 */
    484static inline void __user *arch_untagged_si_addr(void __user *addr,
    485						 unsigned long sig,
    486						 unsigned long si_code)
    487{
    488	return addr;
    489}
    490#endif
    491
    492#endif /* _LINUX_SIGNAL_H */