⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 signal-common.h

📁 h内核
💻 H
字号:
/* * This file is subject to the terms and conditions of the GNU General Public * License.  See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 1991, 1992  Linus Torvalds * Copyright (C) 1994 - 2000  Ralf Baechle * Copyright (C) 1999, 2000 Silicon Graphics, Inc. */static inline intsetup_sigcontext(struct pt_regs *regs, struct sigcontext *sc){	int err = 0;	err |= __put_user(regs->cp0_epc, &sc->sc_pc);	err |= __put_user(regs->cp0_status, &sc->sc_status);#define save_gp_reg(i) do {						\	err |= __put_user(regs->regs[i], &sc->sc_regs[i]);		\} while(0)	__put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);	save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);	save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);	save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);	save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);	save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);	save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);	save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);	save_gp_reg(31);#undef save_gp_reg	err |= __put_user(regs->hi, &sc->sc_mdhi);	err |= __put_user(regs->lo, &sc->sc_mdlo);	err |= __put_user(regs->cp0_cause, &sc->sc_cause);	err |= __put_user(regs->cp0_badvaddr, &sc->sc_badvaddr);	err |= __put_user(!!used_math(), &sc->sc_used_math);	if (!used_math())		goto out;	/*	 * Save FPU state to signal context.  Signal handler will "inherit"	 * current FPU state.	 */	preempt_disable();	if (!is_fpu_owner()) {		own_fpu();		restore_fp(current);	}	err |= save_fp_context(sc);	preempt_enable();out:	return err;}static inline intrestore_sigcontext(struct pt_regs *regs, struct sigcontext *sc){	int err = 0;	unsigned int used_math;	/* Always make any pending restarted system calls return -EINTR */	current_thread_info()->restart_block.fn = do_no_restart_syscall;	err |= __get_user(regs->cp0_epc, &sc->sc_pc);	err |= __get_user(regs->hi, &sc->sc_mdhi);	err |= __get_user(regs->lo, &sc->sc_mdlo);#define restore_gp_reg(i) do {						\	err |= __get_user(regs->regs[i], &sc->sc_regs[i]);		\} while(0)	restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);	restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);	restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);	restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);	restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);	restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);	restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);	restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);	restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);	restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);	restore_gp_reg(31);#undef restore_gp_reg	err |= __get_user(used_math, &sc->sc_used_math);	conditional_used_math(used_math);	preempt_disable();	if (used_math()) {		/* restore fpu context if we have used it before */		own_fpu();		err |= restore_fp_context(sc);	} else {		/* signal handler may have used FPU.  Give it up. */		lose_fpu();	}	preempt_enable();	return err;}/* * Determine which stack to use.. */static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size){	unsigned long sp, almask;	/* Default to using normal stack */	sp = regs->regs[29];	/* 	 * FPU emulator may have it's own trampoline active just 	 * above the user stack, 16-bytes before the next lowest 	 * 16 byte boundary.  Try to avoid trashing it. 	 */ 	sp -= 32;	/* This is the X/Open sanctioned signal stack switching.  */	if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))		sp = current->sas_ss_sp + current->sas_ss_size;	if (PLAT_TRAMPOLINE_STUFF_LINE)		almask = ~(PLAT_TRAMPOLINE_STUFF_LINE - 1);	else		almask = ALMASK;	return (void *)((sp - frame_size) & almask);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -