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.c (18501B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *  linux/arch/arm/kernel/signal.c
      4 *
      5 *  Copyright (C) 1995-2009 Russell King
      6 */
      7#include <linux/errno.h>
      8#include <linux/random.h>
      9#include <linux/signal.h>
     10#include <linux/personality.h>
     11#include <linux/uaccess.h>
     12#include <linux/resume_user_mode.h>
     13#include <linux/uprobes.h>
     14#include <linux/syscalls.h>
     15
     16#include <asm/elf.h>
     17#include <asm/cacheflush.h>
     18#include <asm/traps.h>
     19#include <asm/unistd.h>
     20#include <asm/vfp.h>
     21
     22#include "signal.h"
     23
     24extern const unsigned long sigreturn_codes[17];
     25
     26static unsigned long signal_return_offset;
     27
     28#ifdef CONFIG_IWMMXT
     29
     30static int preserve_iwmmxt_context(struct iwmmxt_sigframe __user *frame)
     31{
     32	char kbuf[sizeof(*frame) + 8];
     33	struct iwmmxt_sigframe *kframe;
     34	int err = 0;
     35
     36	/* the iWMMXt context must be 64 bit aligned */
     37	kframe = (struct iwmmxt_sigframe *)((unsigned long)(kbuf + 8) & ~7);
     38
     39	if (test_thread_flag(TIF_USING_IWMMXT)) {
     40		kframe->magic = IWMMXT_MAGIC;
     41		kframe->size = IWMMXT_STORAGE_SIZE;
     42		iwmmxt_task_copy(current_thread_info(), &kframe->storage);
     43	} else {
     44		/*
     45		 * For bug-compatibility with older kernels, some space
     46		 * has to be reserved for iWMMXt even if it's not used.
     47		 * Set the magic and size appropriately so that properly
     48		 * written userspace can skip it reliably:
     49		 */
     50		*kframe = (struct iwmmxt_sigframe) {
     51			.magic = DUMMY_MAGIC,
     52			.size  = IWMMXT_STORAGE_SIZE,
     53		};
     54	}
     55
     56	err = __copy_to_user(frame, kframe, sizeof(*kframe));
     57
     58	return err;
     59}
     60
     61static int restore_iwmmxt_context(char __user **auxp)
     62{
     63	struct iwmmxt_sigframe __user *frame =
     64		(struct iwmmxt_sigframe __user *)*auxp;
     65	char kbuf[sizeof(*frame) + 8];
     66	struct iwmmxt_sigframe *kframe;
     67
     68	/* the iWMMXt context must be 64 bit aligned */
     69	kframe = (struct iwmmxt_sigframe *)((unsigned long)(kbuf + 8) & ~7);
     70	if (__copy_from_user(kframe, frame, sizeof(*frame)))
     71		return -1;
     72
     73	/*
     74	 * For non-iWMMXt threads: a single iwmmxt_sigframe-sized dummy
     75	 * block is discarded for compatibility with setup_sigframe() if
     76	 * present, but we don't mandate its presence.  If some other
     77	 * magic is here, it's not for us:
     78	 */
     79	if (!test_thread_flag(TIF_USING_IWMMXT) &&
     80	    kframe->magic != DUMMY_MAGIC)
     81		return 0;
     82
     83	if (kframe->size != IWMMXT_STORAGE_SIZE)
     84		return -1;
     85
     86	if (test_thread_flag(TIF_USING_IWMMXT)) {
     87		if (kframe->magic != IWMMXT_MAGIC)
     88			return -1;
     89
     90		iwmmxt_task_restore(current_thread_info(), &kframe->storage);
     91	}
     92
     93	*auxp += IWMMXT_STORAGE_SIZE;
     94	return 0;
     95}
     96
     97#endif
     98
     99#ifdef CONFIG_VFP
    100
    101static int preserve_vfp_context(struct vfp_sigframe __user *frame)
    102{
    103	struct vfp_sigframe kframe;
    104	int err = 0;
    105
    106	memset(&kframe, 0, sizeof(kframe));
    107	kframe.magic = VFP_MAGIC;
    108	kframe.size = VFP_STORAGE_SIZE;
    109
    110	err = vfp_preserve_user_clear_hwstate(&kframe.ufp, &kframe.ufp_exc);
    111	if (err)
    112		return err;
    113
    114	return __copy_to_user(frame, &kframe, sizeof(kframe));
    115}
    116
    117static int restore_vfp_context(char __user **auxp)
    118{
    119	struct vfp_sigframe frame;
    120	int err;
    121
    122	err = __copy_from_user(&frame, *auxp, sizeof(frame));
    123	if (err)
    124		return err;
    125
    126	if (frame.magic != VFP_MAGIC || frame.size != VFP_STORAGE_SIZE)
    127		return -EINVAL;
    128
    129	*auxp += sizeof(frame);
    130	return vfp_restore_user_hwstate(&frame.ufp, &frame.ufp_exc);
    131}
    132
    133#endif
    134
    135/*
    136 * Do a signal return; undo the signal stack.  These are aligned to 64-bit.
    137 */
    138
    139static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf)
    140{
    141	struct sigcontext context;
    142	char __user *aux;
    143	sigset_t set;
    144	int err;
    145
    146	err = __copy_from_user(&set, &sf->uc.uc_sigmask, sizeof(set));
    147	if (err == 0)
    148		set_current_blocked(&set);
    149
    150	err |= __copy_from_user(&context, &sf->uc.uc_mcontext, sizeof(context));
    151	if (err == 0) {
    152		regs->ARM_r0 = context.arm_r0;
    153		regs->ARM_r1 = context.arm_r1;
    154		regs->ARM_r2 = context.arm_r2;
    155		regs->ARM_r3 = context.arm_r3;
    156		regs->ARM_r4 = context.arm_r4;
    157		regs->ARM_r5 = context.arm_r5;
    158		regs->ARM_r6 = context.arm_r6;
    159		regs->ARM_r7 = context.arm_r7;
    160		regs->ARM_r8 = context.arm_r8;
    161		regs->ARM_r9 = context.arm_r9;
    162		regs->ARM_r10 = context.arm_r10;
    163		regs->ARM_fp = context.arm_fp;
    164		regs->ARM_ip = context.arm_ip;
    165		regs->ARM_sp = context.arm_sp;
    166		regs->ARM_lr = context.arm_lr;
    167		regs->ARM_pc = context.arm_pc;
    168		regs->ARM_cpsr = context.arm_cpsr;
    169	}
    170
    171	err |= !valid_user_regs(regs);
    172
    173	aux = (char __user *) sf->uc.uc_regspace;
    174#ifdef CONFIG_IWMMXT
    175	if (err == 0)
    176		err |= restore_iwmmxt_context(&aux);
    177#endif
    178#ifdef CONFIG_VFP
    179	if (err == 0)
    180		err |= restore_vfp_context(&aux);
    181#endif
    182
    183	return err;
    184}
    185
    186asmlinkage int sys_sigreturn(struct pt_regs *regs)
    187{
    188	struct sigframe __user *frame;
    189
    190	/* Always make any pending restarted system calls return -EINTR */
    191	current->restart_block.fn = do_no_restart_syscall;
    192
    193	/*
    194	 * Since we stacked the signal on a 64-bit boundary,
    195	 * then 'sp' should be word aligned here.  If it's
    196	 * not, then the user is trying to mess with us.
    197	 */
    198	if (regs->ARM_sp & 7)
    199		goto badframe;
    200
    201	frame = (struct sigframe __user *)regs->ARM_sp;
    202
    203	if (!access_ok(frame, sizeof (*frame)))
    204		goto badframe;
    205
    206	if (restore_sigframe(regs, frame))
    207		goto badframe;
    208
    209	return regs->ARM_r0;
    210
    211badframe:
    212	force_sig(SIGSEGV);
    213	return 0;
    214}
    215
    216asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
    217{
    218	struct rt_sigframe __user *frame;
    219
    220	/* Always make any pending restarted system calls return -EINTR */
    221	current->restart_block.fn = do_no_restart_syscall;
    222
    223	/*
    224	 * Since we stacked the signal on a 64-bit boundary,
    225	 * then 'sp' should be word aligned here.  If it's
    226	 * not, then the user is trying to mess with us.
    227	 */
    228	if (regs->ARM_sp & 7)
    229		goto badframe;
    230
    231	frame = (struct rt_sigframe __user *)regs->ARM_sp;
    232
    233	if (!access_ok(frame, sizeof (*frame)))
    234		goto badframe;
    235
    236	if (restore_sigframe(regs, &frame->sig))
    237		goto badframe;
    238
    239	if (restore_altstack(&frame->sig.uc.uc_stack))
    240		goto badframe;
    241
    242	return regs->ARM_r0;
    243
    244badframe:
    245	force_sig(SIGSEGV);
    246	return 0;
    247}
    248
    249static int
    250setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set)
    251{
    252	struct aux_sigframe __user *aux;
    253	struct sigcontext context;
    254	int err = 0;
    255
    256	context = (struct sigcontext) {
    257		.arm_r0        = regs->ARM_r0,
    258		.arm_r1        = regs->ARM_r1,
    259		.arm_r2        = regs->ARM_r2,
    260		.arm_r3        = regs->ARM_r3,
    261		.arm_r4        = regs->ARM_r4,
    262		.arm_r5        = regs->ARM_r5,
    263		.arm_r6        = regs->ARM_r6,
    264		.arm_r7        = regs->ARM_r7,
    265		.arm_r8        = regs->ARM_r8,
    266		.arm_r9        = regs->ARM_r9,
    267		.arm_r10       = regs->ARM_r10,
    268		.arm_fp        = regs->ARM_fp,
    269		.arm_ip        = regs->ARM_ip,
    270		.arm_sp        = regs->ARM_sp,
    271		.arm_lr        = regs->ARM_lr,
    272		.arm_pc        = regs->ARM_pc,
    273		.arm_cpsr      = regs->ARM_cpsr,
    274
    275		.trap_no       = current->thread.trap_no,
    276		.error_code    = current->thread.error_code,
    277		.fault_address = current->thread.address,
    278		.oldmask       = set->sig[0],
    279	};
    280
    281	err |= __copy_to_user(&sf->uc.uc_mcontext, &context, sizeof(context));
    282
    283	err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set));
    284
    285	aux = (struct aux_sigframe __user *) sf->uc.uc_regspace;
    286#ifdef CONFIG_IWMMXT
    287	if (err == 0)
    288		err |= preserve_iwmmxt_context(&aux->iwmmxt);
    289#endif
    290#ifdef CONFIG_VFP
    291	if (err == 0)
    292		err |= preserve_vfp_context(&aux->vfp);
    293#endif
    294	err |= __put_user(0, &aux->end_magic);
    295
    296	return err;
    297}
    298
    299static inline void __user *
    300get_sigframe(struct ksignal *ksig, struct pt_regs *regs, int framesize)
    301{
    302	unsigned long sp = sigsp(regs->ARM_sp, ksig);
    303	void __user *frame;
    304
    305	/*
    306	 * ATPCS B01 mandates 8-byte alignment
    307	 */
    308	frame = (void __user *)((sp - framesize) & ~7);
    309
    310	/*
    311	 * Check that we can actually write to the signal frame.
    312	 */
    313	if (!access_ok(frame, framesize))
    314		frame = NULL;
    315
    316	return frame;
    317}
    318
    319static int
    320setup_return(struct pt_regs *regs, struct ksignal *ksig,
    321	     unsigned long __user *rc, void __user *frame)
    322{
    323	unsigned long handler = (unsigned long)ksig->ka.sa.sa_handler;
    324	unsigned long handler_fdpic_GOT = 0;
    325	unsigned long retcode;
    326	unsigned int idx, thumb = 0;
    327	unsigned long cpsr = regs->ARM_cpsr & ~(PSR_f | PSR_E_BIT);
    328	bool fdpic = IS_ENABLED(CONFIG_BINFMT_ELF_FDPIC) &&
    329		     (current->personality & FDPIC_FUNCPTRS);
    330
    331	if (fdpic) {
    332		unsigned long __user *fdpic_func_desc =
    333					(unsigned long __user *)handler;
    334		if (__get_user(handler, &fdpic_func_desc[0]) ||
    335		    __get_user(handler_fdpic_GOT, &fdpic_func_desc[1]))
    336			return 1;
    337	}
    338
    339	cpsr |= PSR_ENDSTATE;
    340
    341	/*
    342	 * Maybe we need to deliver a 32-bit signal to a 26-bit task.
    343	 */
    344	if (ksig->ka.sa.sa_flags & SA_THIRTYTWO)
    345		cpsr = (cpsr & ~MODE_MASK) | USR_MODE;
    346
    347#ifdef CONFIG_ARM_THUMB
    348	if (elf_hwcap & HWCAP_THUMB) {
    349		/*
    350		 * The LSB of the handler determines if we're going to
    351		 * be using THUMB or ARM mode for this signal handler.
    352		 */
    353		thumb = handler & 1;
    354
    355		/*
    356		 * Clear the If-Then Thumb-2 execution state.  ARM spec
    357		 * requires this to be all 000s in ARM mode.  Snapdragon
    358		 * S4/Krait misbehaves on a Thumb=>ARM signal transition
    359		 * without this.
    360		 *
    361		 * We must do this whenever we are running on a Thumb-2
    362		 * capable CPU, which includes ARMv6T2.  However, we elect
    363		 * to always do this to simplify the code; this field is
    364		 * marked UNK/SBZP for older architectures.
    365		 */
    366		cpsr &= ~PSR_IT_MASK;
    367
    368		if (thumb) {
    369			cpsr |= PSR_T_BIT;
    370		} else
    371			cpsr &= ~PSR_T_BIT;
    372	}
    373#endif
    374
    375	if (ksig->ka.sa.sa_flags & SA_RESTORER) {
    376		retcode = (unsigned long)ksig->ka.sa.sa_restorer;
    377		if (fdpic) {
    378			/*
    379			 * We need code to load the function descriptor.
    380			 * That code follows the standard sigreturn code
    381			 * (6 words), and is made of 3 + 2 words for each
    382			 * variant. The 4th copied word is the actual FD
    383			 * address that the assembly code expects.
    384			 */
    385			idx = 6 + thumb * 3;
    386			if (ksig->ka.sa.sa_flags & SA_SIGINFO)
    387				idx += 5;
    388			if (__put_user(sigreturn_codes[idx],   rc  ) ||
    389			    __put_user(sigreturn_codes[idx+1], rc+1) ||
    390			    __put_user(sigreturn_codes[idx+2], rc+2) ||
    391			    __put_user(retcode,                rc+3))
    392				return 1;
    393			goto rc_finish;
    394		}
    395	} else {
    396		idx = thumb << 1;
    397		if (ksig->ka.sa.sa_flags & SA_SIGINFO)
    398			idx += 3;
    399
    400		/*
    401		 * Put the sigreturn code on the stack no matter which return
    402		 * mechanism we use in order to remain ABI compliant
    403		 */
    404		if (__put_user(sigreturn_codes[idx],   rc) ||
    405		    __put_user(sigreturn_codes[idx+1], rc+1))
    406			return 1;
    407
    408rc_finish:
    409#ifdef CONFIG_MMU
    410		if (cpsr & MODE32_BIT) {
    411			struct mm_struct *mm = current->mm;
    412
    413			/*
    414			 * 32-bit code can use the signal return page
    415			 * except when the MPU has protected the vectors
    416			 * page from PL0
    417			 */
    418			retcode = mm->context.sigpage + signal_return_offset +
    419				  (idx << 2) + thumb;
    420		} else
    421#endif
    422		{
    423			/*
    424			 * Ensure that the instruction cache sees
    425			 * the return code written onto the stack.
    426			 */
    427			flush_icache_range((unsigned long)rc,
    428					   (unsigned long)(rc + 3));
    429
    430			retcode = ((unsigned long)rc) + thumb;
    431		}
    432	}
    433
    434	regs->ARM_r0 = ksig->sig;
    435	regs->ARM_sp = (unsigned long)frame;
    436	regs->ARM_lr = retcode;
    437	regs->ARM_pc = handler;
    438	if (fdpic)
    439		regs->ARM_r9 = handler_fdpic_GOT;
    440	regs->ARM_cpsr = cpsr;
    441
    442	return 0;
    443}
    444
    445static int
    446setup_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
    447{
    448	struct sigframe __user *frame = get_sigframe(ksig, regs, sizeof(*frame));
    449	int err = 0;
    450
    451	if (!frame)
    452		return 1;
    453
    454	/*
    455	 * Set uc.uc_flags to a value which sc.trap_no would never have.
    456	 */
    457	err = __put_user(0x5ac3c35a, &frame->uc.uc_flags);
    458
    459	err |= setup_sigframe(frame, regs, set);
    460	if (err == 0)
    461		err = setup_return(regs, ksig, frame->retcode, frame);
    462
    463	return err;
    464}
    465
    466static int
    467setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
    468{
    469	struct rt_sigframe __user *frame = get_sigframe(ksig, regs, sizeof(*frame));
    470	int err = 0;
    471
    472	if (!frame)
    473		return 1;
    474
    475	err |= copy_siginfo_to_user(&frame->info, &ksig->info);
    476
    477	err |= __put_user(0, &frame->sig.uc.uc_flags);
    478	err |= __put_user(NULL, &frame->sig.uc.uc_link);
    479
    480	err |= __save_altstack(&frame->sig.uc.uc_stack, regs->ARM_sp);
    481	err |= setup_sigframe(&frame->sig, regs, set);
    482	if (err == 0)
    483		err = setup_return(regs, ksig, frame->sig.retcode, frame);
    484
    485	if (err == 0) {
    486		/*
    487		 * For realtime signals we must also set the second and third
    488		 * arguments for the signal handler.
    489		 *   -- Peter Maydell <pmaydell@chiark.greenend.org.uk> 2000-12-06
    490		 */
    491		regs->ARM_r1 = (unsigned long)&frame->info;
    492		regs->ARM_r2 = (unsigned long)&frame->sig.uc;
    493	}
    494
    495	return err;
    496}
    497
    498/*
    499 * OK, we're invoking a handler
    500 */	
    501static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
    502{
    503	sigset_t *oldset = sigmask_to_save();
    504	int ret;
    505
    506	/*
    507	 * Perform fixup for the pre-signal frame.
    508	 */
    509	rseq_signal_deliver(ksig, regs);
    510
    511	/*
    512	 * Set up the stack frame
    513	 */
    514	if (ksig->ka.sa.sa_flags & SA_SIGINFO)
    515		ret = setup_rt_frame(ksig, oldset, regs);
    516	else
    517		ret = setup_frame(ksig, oldset, regs);
    518
    519	/*
    520	 * Check that the resulting registers are actually sane.
    521	 */
    522	ret |= !valid_user_regs(regs);
    523
    524	signal_setup_done(ret, ksig, 0);
    525}
    526
    527/*
    528 * Note that 'init' is a special process: it doesn't get signals it doesn't
    529 * want to handle. Thus you cannot kill init even with a SIGKILL even by
    530 * mistake.
    531 *
    532 * Note that we go through the signals twice: once to check the signals that
    533 * the kernel can handle, and then we build all the user-level signal handling
    534 * stack-frames in one go after that.
    535 */
    536static int do_signal(struct pt_regs *regs, int syscall)
    537{
    538	unsigned int retval = 0, continue_addr = 0, restart_addr = 0;
    539	struct ksignal ksig;
    540	int restart = 0;
    541
    542	/*
    543	 * If we were from a system call, check for system call restarting...
    544	 */
    545	if (syscall) {
    546		continue_addr = regs->ARM_pc;
    547		restart_addr = continue_addr - (thumb_mode(regs) ? 2 : 4);
    548		retval = regs->ARM_r0;
    549
    550		/*
    551		 * Prepare for system call restart.  We do this here so that a
    552		 * debugger will see the already changed PSW.
    553		 */
    554		switch (retval) {
    555		case -ERESTART_RESTARTBLOCK:
    556			restart -= 2;
    557			fallthrough;
    558		case -ERESTARTNOHAND:
    559		case -ERESTARTSYS:
    560		case -ERESTARTNOINTR:
    561			restart++;
    562			regs->ARM_r0 = regs->ARM_ORIG_r0;
    563			regs->ARM_pc = restart_addr;
    564			break;
    565		}
    566	}
    567
    568	/*
    569	 * Get the signal to deliver.  When running under ptrace, at this
    570	 * point the debugger may change all our registers ...
    571	 */
    572	/*
    573	 * Depending on the signal settings we may need to revert the
    574	 * decision to restart the system call.  But skip this if a
    575	 * debugger has chosen to restart at a different PC.
    576	 */
    577	if (get_signal(&ksig)) {
    578		/* handler */
    579		if (unlikely(restart) && regs->ARM_pc == restart_addr) {
    580			if (retval == -ERESTARTNOHAND ||
    581			    retval == -ERESTART_RESTARTBLOCK
    582			    || (retval == -ERESTARTSYS
    583				&& !(ksig.ka.sa.sa_flags & SA_RESTART))) {
    584				regs->ARM_r0 = -EINTR;
    585				regs->ARM_pc = continue_addr;
    586			}
    587		}
    588		handle_signal(&ksig, regs);
    589	} else {
    590		/* no handler */
    591		restore_saved_sigmask();
    592		if (unlikely(restart) && regs->ARM_pc == restart_addr) {
    593			regs->ARM_pc = continue_addr;
    594			return restart;
    595		}
    596	}
    597	return 0;
    598}
    599
    600asmlinkage int
    601do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
    602{
    603	/*
    604	 * The assembly code enters us with IRQs off, but it hasn't
    605	 * informed the tracing code of that for efficiency reasons.
    606	 * Update the trace code with the current status.
    607	 */
    608	trace_hardirqs_off();
    609	do {
    610		if (likely(thread_flags & _TIF_NEED_RESCHED)) {
    611			schedule();
    612		} else {
    613			if (unlikely(!user_mode(regs)))
    614				return 0;
    615			local_irq_enable();
    616			if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) {
    617				int restart = do_signal(regs, syscall);
    618				if (unlikely(restart)) {
    619					/*
    620					 * Restart without handlers.
    621					 * Deal with it without leaving
    622					 * the kernel space.
    623					 */
    624					return restart;
    625				}
    626				syscall = 0;
    627			} else if (thread_flags & _TIF_UPROBE) {
    628				uprobe_notify_resume(regs);
    629			} else {
    630				resume_user_mode_work(regs);
    631			}
    632		}
    633		local_irq_disable();
    634		thread_flags = read_thread_flags();
    635	} while (thread_flags & _TIF_WORK_MASK);
    636	return 0;
    637}
    638
    639struct page *get_signal_page(void)
    640{
    641	unsigned long ptr;
    642	unsigned offset;
    643	struct page *page;
    644	void *addr;
    645
    646	page = alloc_pages(GFP_KERNEL, 0);
    647
    648	if (!page)
    649		return NULL;
    650
    651	addr = page_address(page);
    652
    653	/* Poison the entire page */
    654	memset32(addr, __opcode_to_mem_arm(0xe7fddef1),
    655		 PAGE_SIZE / sizeof(u32));
    656
    657	/* Give the signal return code some randomness */
    658	offset = 0x200 + (get_random_int() & 0x7fc);
    659	signal_return_offset = offset;
    660
    661	/* Copy signal return handlers into the page */
    662	memcpy(addr + offset, sigreturn_codes, sizeof(sigreturn_codes));
    663
    664	/* Flush out all instructions in this page */
    665	ptr = (unsigned long)addr;
    666	flush_icache_range(ptr, ptr + PAGE_SIZE);
    667
    668	return page;
    669}
    670
    671#ifdef CONFIG_DEBUG_RSEQ
    672asmlinkage void do_rseq_syscall(struct pt_regs *regs)
    673{
    674	rseq_syscall(regs);
    675}
    676#endif
    677
    678/*
    679 * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as
    680 * changes likely come with new fields that should be added below.
    681 */
    682static_assert(NSIGILL	== 11);
    683static_assert(NSIGFPE	== 15);
    684static_assert(NSIGSEGV	== 9);
    685static_assert(NSIGBUS	== 5);
    686static_assert(NSIGTRAP	== 6);
    687static_assert(NSIGCHLD	== 6);
    688static_assert(NSIGSYS	== 2);
    689static_assert(sizeof(siginfo_t) == 128);
    690static_assert(__alignof__(siginfo_t) == 4);
    691static_assert(offsetof(siginfo_t, si_signo)	== 0x00);
    692static_assert(offsetof(siginfo_t, si_errno)	== 0x04);
    693static_assert(offsetof(siginfo_t, si_code)	== 0x08);
    694static_assert(offsetof(siginfo_t, si_pid)	== 0x0c);
    695static_assert(offsetof(siginfo_t, si_uid)	== 0x10);
    696static_assert(offsetof(siginfo_t, si_tid)	== 0x0c);
    697static_assert(offsetof(siginfo_t, si_overrun)	== 0x10);
    698static_assert(offsetof(siginfo_t, si_status)	== 0x14);
    699static_assert(offsetof(siginfo_t, si_utime)	== 0x18);
    700static_assert(offsetof(siginfo_t, si_stime)	== 0x1c);
    701static_assert(offsetof(siginfo_t, si_value)	== 0x14);
    702static_assert(offsetof(siginfo_t, si_int)	== 0x14);
    703static_assert(offsetof(siginfo_t, si_ptr)	== 0x14);
    704static_assert(offsetof(siginfo_t, si_addr)	== 0x0c);
    705static_assert(offsetof(siginfo_t, si_addr_lsb)	== 0x10);
    706static_assert(offsetof(siginfo_t, si_lower)	== 0x14);
    707static_assert(offsetof(siginfo_t, si_upper)	== 0x18);
    708static_assert(offsetof(siginfo_t, si_pkey)	== 0x14);
    709static_assert(offsetof(siginfo_t, si_perf_data)	== 0x10);
    710static_assert(offsetof(siginfo_t, si_perf_type)	== 0x14);
    711static_assert(offsetof(siginfo_t, si_perf_flags) == 0x18);
    712static_assert(offsetof(siginfo_t, si_band)	== 0x0c);
    713static_assert(offsetof(siginfo_t, si_fd)	== 0x10);
    714static_assert(offsetof(siginfo_t, si_call_addr)	== 0x0c);
    715static_assert(offsetof(siginfo_t, si_syscall)	== 0x10);
    716static_assert(offsetof(siginfo_t, si_arch)	== 0x14);