亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? irixsig.c

?? 嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開(kāi)發(fā)源碼
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/* * irixsig.c: WHEEE, IRIX signals!  YOW, am I compatable or what?!?! * * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) * Copyright (C) 1997 - 2000 Ralf Baechle (ralf@gnu.org) * Copyright (C) 2000 Silicon Graphics, Inc. */#include <linux/kernel.h>#include <linux/sched.h>#include <linux/mm.h>#include <linux/errno.h>#include <linux/smp.h>#include <linux/smp_lock.h>#include <linux/time.h>#include <asm/ptrace.h>#include <asm/uaccess.h>extern asmlinkage void syscall_trace(void);#undef DEBUG_SIG#define _S(nr) (1<<((nr)-1))#define _BLOCKABLE (~(_S(SIGKILL) | _S(SIGSTOP)))typedef struct {	unsigned long sig[4];} irix_sigset_t;struct sigctx_irix5 {	u32 rmask, cp0_status;	u64 pc;	u64 regs[32];	u64 fpregs[32];	u32 usedfp, fpcsr, fpeir, sstk_flags;	u64 hi, lo;	u64 cp0_cause, cp0_badvaddr, _unused0;	irix_sigset_t sigset;	u64 weird_fpu_thing;	u64 _unused1[31];};#ifdef DEBUG_SIG/* Debugging */static inline void dump_irix5_sigctx(struct sigctx_irix5 *c){	int i;	printk("misc: rmask[%08lx] status[%08lx] pc[%08lx]\n",	       (unsigned long) c->rmask,	       (unsigned long) c->cp0_status,	       (unsigned long) c->pc);	printk("regs: ");	for(i = 0; i < 16; i++)		printk("[%d]<%08lx> ", i, (unsigned long) c->regs[i]);	printk("\nregs: ");	for(i = 16; i < 32; i++)		printk("[%d]<%08lx> ", i, (unsigned long) c->regs[i]);	printk("\nfpregs: ");	for(i = 0; i < 16; i++)		printk("[%d]<%08lx> ", i, (unsigned long) c->fpregs[i]);	printk("\nfpregs: ");	for(i = 16; i < 32; i++)		printk("[%d]<%08lx> ", i, (unsigned long) c->fpregs[i]);	printk("misc: usedfp[%d] fpcsr[%08lx] fpeir[%08lx] stk_flgs[%08lx]\n",	       (int) c->usedfp, (unsigned long) c->fpcsr,	       (unsigned long) c->fpeir, (unsigned long) c->sstk_flags);	printk("misc: hi[%08lx] lo[%08lx] cause[%08lx] badvaddr[%08lx]\n",	       (unsigned long) c->hi, (unsigned long) c->lo,	       (unsigned long) c->cp0_cause, (unsigned long) c->cp0_badvaddr);	printk("misc: sigset<0>[%08lx] sigset<1>[%08lx] sigset<2>[%08lx] "	       "sigset<3>[%08lx]\n", (unsigned long) c->sigset.sig[0],	       (unsigned long) c->sigset.sig[1],	       (unsigned long) c->sigset.sig[2],	       (unsigned long) c->sigset.sig[3]);}#endifstatic void setup_irix_frame(struct k_sigaction *ka, struct pt_regs *regs,			     int signr, sigset_t *oldmask){	unsigned long sp;	struct sigctx_irix5 *ctx;	int i;	sp = regs->regs[29];	sp -= sizeof(struct sigctx_irix5);	sp &= ~(0xf);	ctx = (struct sigctx_irix5 *) sp;	if (!access_ok(VERIFY_WRITE, ctx, sizeof(*ctx)))		goto segv_and_exit;	__put_user(0, &ctx->weird_fpu_thing);	__put_user(~(0x00000001), &ctx->rmask);	__put_user(0, &ctx->regs[0]);	for(i = 1; i < 32; i++)		__put_user((u64) regs->regs[i], &ctx->regs[i]);	__put_user((u64) regs->hi, &ctx->hi);	__put_user((u64) regs->lo, &ctx->lo);	__put_user((u64) regs->cp0_epc, &ctx->pc);	__put_user(current->used_math, &ctx->usedfp);	__put_user((u64) regs->cp0_cause, &ctx->cp0_cause);	__put_user((u64) regs->cp0_badvaddr, &ctx->cp0_badvaddr);	__put_user(0, &ctx->sstk_flags); /* XXX sigstack unimp... todo... */	__copy_to_user(&ctx->sigset, oldmask, sizeof(irix_sigset_t));#ifdef DEBUG_SIG	dump_irix5_sigctx(ctx);#endif	regs->regs[4] = (unsigned long) signr;	regs->regs[5] = 0; /* XXX sigcode XXX */	regs->regs[6] = regs->regs[29] = sp;	regs->regs[7] = (unsigned long) ka->sa.sa_handler;	regs->regs[25] = regs->cp0_epc = (unsigned long) ka->sa.sa_restorer;	return;segv_and_exit:	if (signr == SIGSEGV)		ka->sa.sa_handler = SIG_DFL;	force_sig(SIGSEGV, current);}static void inlinesetup_irix_rt_frame(struct k_sigaction * ka, struct pt_regs *regs,               int signr, sigset_t *oldmask, siginfo_t *info){	printk("Aiee: setup_tr_frame wants to be written");	do_exit(SIGSEGV);}static inline void handle_signal(unsigned long sig, struct k_sigaction *ka,        siginfo_t *info, sigset_t *oldset, struct pt_regs * regs){	if (ka->sa.sa_flags & SA_SIGINFO)		setup_irix_rt_frame(ka, regs, sig, oldset, info);	else		setup_irix_frame(ka, regs, sig, oldset);	if (ka->sa.sa_flags & SA_ONESHOT)		ka->sa.sa_handler = SIG_DFL;	if (!(ka->sa.sa_flags & SA_NODEFER)) {		spin_lock_irq(&current->sigmask_lock);		sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);	sigaddset(&current->blocked,sig);	recalc_sigpending(current);	spin_unlock_irq(&current->sigmask_lock);	}}static inline void syscall_restart(struct pt_regs *regs, struct k_sigaction *ka){	switch(regs->regs[0]) {	case ERESTARTNOHAND:		regs->regs[2] = EINTR;		break;	case ERESTARTSYS:		if(!(ka->sa.sa_flags & SA_RESTART)) {			regs->regs[2] = EINTR;			break;		}	/* fallthrough */	case ERESTARTNOINTR:		/* Userland will reload $v0.  */		regs->cp0_epc -= 8;	}	regs->regs[0] = 0;		/* Don't deal with this again.  */}asmlinkage int do_irix_signal(sigset_t *oldset, struct pt_regs *regs){	struct k_sigaction *ka;	siginfo_t info;	if (!oldset)		oldset = &current->blocked;	for (;;) {		unsigned long signr;		spin_lock_irq(&current->sigmask_lock);		signr = dequeue_signal(&current->blocked, &info);		spin_unlock_irq(&current->sigmask_lock);		if (!signr)			break;		if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {			/* Let the debugger run.  */			current->exit_code = signr;			current->state = TASK_STOPPED;			notify_parent(current, SIGCHLD);			schedule();			/* We're back.  Did the debugger cancel the sig?  */			if (!(signr = current->exit_code))				continue;			current->exit_code = 0;			/* The debugger continued.  Ignore SIGSTOP.  */			if (signr == SIGSTOP)				continue;			/* Update the siginfo structure.  Is this good?  */			if (signr != info.si_signo) {				info.si_signo = signr;				info.si_errno = 0;				info.si_code = SI_USER;				info.si_pid = current->p_pptr->pid;				info.si_uid = current->p_pptr->uid;			}			/* If the (new) signal is now blocked, requeue it.  */			if (sigismember(&current->blocked, signr)) {				send_sig_info(signr, &info, current);				continue;			}		}		ka = &current->sig->action[signr-1];		if (ka->sa.sa_handler == SIG_IGN) {			if (signr != SIGCHLD)				continue;			/* Check for SIGCHLD: it's special.  */			while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)				/* nothing */;			continue;		}		if (ka->sa.sa_handler == SIG_DFL) {			int exit_code = signr;			/* Init gets no signals it doesn't want.  */			if (current->pid == 1)				continue;			switch (signr) {			case SIGCONT: case SIGCHLD: case SIGWINCH:				continue;			case SIGTSTP: case SIGTTIN: case SIGTTOU:				if (is_orphaned_pgrp(current->pgrp))					continue;				/* FALLTHRU */			case SIGSTOP:				current->state = TASK_STOPPED;				current->exit_code = signr;				if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))					notify_parent(current, SIGCHLD);				schedule();				continue;			case SIGQUIT: case SIGILL: case SIGTRAP:			case SIGABRT: case SIGFPE: case SIGSEGV:				if (do_coredump(signr, regs))					exit_code |= 0x80;				/* FALLTHRU */			default:				sigaddset(&current->pending.signal, signr);				recalc_sigpending(current);				current->flags |= PF_SIGNALED;				do_exit(exit_code);				/* NOTREACHED */			}		}		if (regs->regs[0])			syscall_restart(regs, ka);		/* Whee!  Actually deliver the signal.  */		handle_signal(signr, ka, &info, oldset, regs);		return 1;	}	/*	 * Who's code doesn't conform to the restartable syscall convention	 * dies here!!!  The li instruction, a single machine instruction,	 * must directly be followed by the syscall instruction.	 */	if (regs->regs[0]) {		if (regs->regs[2] == ERESTARTNOHAND ||		    regs->regs[2] == ERESTARTSYS ||		    regs->regs[2] == ERESTARTNOINTR) {			regs->cp0_epc -= 8;		}	}	return 0;}asmlinkage voidirix_sigreturn(struct pt_regs *regs){	struct sigctx_irix5 *context, *magic;	unsigned long umask, mask;	u64 *fregs;	int sig, i, base = 0;	sigset_t blocked;	if(regs->regs[2] == 1000)		base = 1;	context = (struct sigctx_irix5 *) regs->regs[base + 4];	magic = (struct sigctx_irix5 *) regs->regs[base + 5];	sig = (int) regs->regs[base + 6];#ifdef DEBUG_SIG	printk("[%s:%d] IRIX sigreturn(scp[%p],ucp[%p],sig[%d])\n",	       current->comm, current->pid, context, magic, sig);#endif	if (!context)		context = magic;	if (!access_ok(VERIFY_READ, context, sizeof(struct sigctx_irix5)))		goto badframe;#ifdef DEBUG_SIG	dump_irix5_sigctx(context);#endif	__get_user(regs->cp0_epc, &context->pc);	umask = context->rmask; mask = 2;	for (i = 1; i < 32; i++, mask <<= 1) {		if(umask & mask)			__get_user(regs->regs[i], &context->regs[i]);	}	__get_user(regs->hi, &context->hi);	__get_user(regs->lo, &context->lo);	if ((umask & 1) && context->usedfp) {		fregs = (u64 *) &current->thread.fpu;		for(i = 0; i < 32; i++)			fregs[i] = (u64) context->fpregs[i];		__get_user(current->thread.fpu.hard.control, &context->fpcsr);	}	/* XXX do sigstack crapola here... XXX */	if (__copy_from_user(&blocked, &context->sigset, sizeof(blocked)))		goto badframe;	sigdelsetmask(&blocked, ~_BLOCKABLE);	spin_lock_irq(&current->sigmask_lock);	current->blocked = blocked;	recalc_sigpending(current);	spin_unlock_irq(&current->sigmask_lock);	/*	 * Don't let your children do this ...	 */	if (current->ptrace & PT_TRACESYS)		syscall_trace();	__asm__ __volatile__(		"move\t$29,%0\n\t"		"j\tret_from_sys_call"		:/* no outputs */		:"r" (&regs));		/* Unreached */badframe:	force_sig(SIGSEGV, current);}struct sigact_irix5 {	int flags;	void (*handler)(int);	u32 sigset[4];	int _unused0[2];};#ifdef DEBUG_SIGstatic inline void dump_sigact_irix5(struct sigact_irix5 *p){	printk("<f[%d] hndlr[%08lx] msk[%08lx]>", p->flags,	       (unsigned long) p->handler,	       (unsigned long) p->sigset[0]);}#endifasmlinkage int irix_sigaction(int sig, const struct sigaction *act,	      struct sigaction *oact, void *trampoline){	struct k_sigaction new_ka, old_ka;	int ret;#ifdef DEBUG_SIG	printk(" (%d,%s,%s,%08lx) ", sig, (!new ? "0" : "NEW"),	       (!old ? "0" : "OLD"), trampoline);	if(new) {		dump_sigact_irix5(new); printk(" ");	}#endif	if (act) {		sigset_t mask;		if (verify_area(VERIFY_READ, act, sizeof(*act)) ||		    __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||		    __get_user(new_ka.sa.sa_flags, &act->sa_flags))			return -EFAULT;		__copy_from_user(&mask, &act->sa_mask, sizeof(sigset_t));		/*		 * Hmmm... methinks IRIX libc always passes a valid trampoline		 * value for all invocations of sigaction.  Will have to		 * investigate.  POSIX POSIX, die die die...		 */		new_ka.sa.sa_restorer = trampoline;	}/* XXX Implement SIG_SETMASK32 for IRIX compatibility */	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);	if (!ret && oact) {		if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||		    __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||		    __put_user(old_ka.sa.sa_flags, &oact->sa_flags))			return -EFAULT;		__copy_to_user(&old_ka.sa.sa_mask, &oact->sa_mask,		               sizeof(sigset_t));	}	return ret;}asmlinkage int irix_sigpending(irix_sigset_t *set){	return do_sigpending(set, sizeof(*set));}asmlinkage int irix_sigprocmask(int how, irix_sigset_t *new, irix_sigset_t *old){	sigset_t oldbits, newbits;	int error;	if (new) {		error = verify_area(VERIFY_READ, new, sizeof(*new));		if (error)			return error;		__copy_from_user(&newbits, new, sizeof(unsigned long)*4);		sigdelsetmask(&newbits, ~_BLOCKABLE);		spin_lock_irq(&current->sigmask_lock);		oldbits = current->blocked;		switch(how) {		case 1:			sigorsets(&newbits, &oldbits, &newbits);			break;		case 2:			sigandsets(&newbits, &oldbits, &newbits);			break;		case 3:			break;		case 256:			siginitset(&newbits, newbits.sig[0]);			break;		default:			return -EINVAL;		}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一区二区三区视频播放 | 国产欧美精品一区| 国产91精品免费| 亚洲精品免费电影| 欧美一区二区三区的| zzijzzij亚洲日本少妇熟睡| 一区二区成人在线视频| 日韩一区二区三区免费看| 国产乱码字幕精品高清av | 一本大道久久a久久综合| 日韩不卡一二三区| 国产精品久久久久久福利一牛影视| 欧美日韩综合不卡| 国产尤物一区二区| 色老汉一区二区三区| 精品一二三四在线| 亚洲成人黄色影院| 国产欧美日韩不卡免费| 欧美精品18+| 成人精品在线视频观看| 人妖欧美一区二区| 91丨九色丨黑人外教| 精品一区二区三区视频在线观看| 亚洲黄一区二区三区| 精品在线播放免费| 日韩1区2区3区| 一区二区三区四区中文字幕| 国产亚洲精品超碰| 日韩视频免费直播| 欧美精品日韩精品| 91久久一区二区| 国产精品久久久久久久久晋中| 欧美一区二区视频观看视频| 欧美丝袜自拍制服另类| 91老司机福利 在线| 成人性生交大片免费看视频在线 | 成人午夜电影小说| 国内久久精品视频| 国产精品综合二区| 久久99久久精品| 久久www免费人成看片高清| 亚洲动漫第一页| 亚洲成人av一区| 亚洲地区一二三色| 天堂蜜桃91精品| 视频一区欧美精品| 日韩精品一二三四| 久久精工是国产品牌吗| 精品一区二区三区av| 国产乱淫av一区二区三区 | 亚洲欧美综合网| 中文字幕一区二区三区视频| 亚洲嫩草精品久久| 亚洲制服丝袜在线| 免费精品视频最新在线| 精品一区二区三区视频在线观看| 国产高清在线观看免费不卡| 国产亚洲污的网站| 一区二区三区成人在线视频| 日本在线不卡视频| 国产电影精品久久禁18| 91丨porny丨户外露出| 欧美日韩电影一区| 久久精品一区四区| 1024成人网| 日本sm残虐另类| 国产精品影视在线| 欧美色精品在线视频| 欧美美女网站色| 日韩精品一区二区三区蜜臀| 日韩精品专区在线| 久久精品这里都是精品| 亚洲欧美日韩在线不卡| 一区二区三区小说| 国产一区二区主播在线| 成人免费视频网站在线观看| 欧美影院午夜播放| 欧美人与性动xxxx| 久久综合久久综合九色| 亚洲一区在线观看视频| 国产福利91精品一区| 91精品欧美综合在线观看最新| 中文一区在线播放| 亚洲综合在线免费观看| 国产九九视频一区二区三区| 欧美群妇大交群中文字幕| 日本一区二区成人| 天堂在线亚洲视频| 91亚洲精品久久久蜜桃网站| 久久免费看少妇高潮| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美这里有精品| 国产精品久久久久久久久搜平片| 国内不卡的二区三区中文字幕| 欧美人妖巨大在线| 日本精品一级二级| 日韩一区日韩二区| 成人av在线影院| 国产精品天美传媒| 丁香亚洲综合激情啪啪综合| 中文字幕乱码一区二区免费| 国产成人av电影在线观看| 久久久电影一区二区三区| 国产成人在线电影| 中文字幕精品一区二区精品绿巨人| 韩国av一区二区| 国产亚洲一区二区三区四区| 国产成人av一区| 亚洲欧洲成人精品av97| www.欧美日韩国产在线| 综合激情网...| 欧美亚洲国产一区在线观看网站 | 欧美另类videos死尸| 免费精品视频在线| 久久久久国产免费免费 | 视频一区二区国产| 精品欧美乱码久久久久久1区2区| 国精产品一区一区三区mba视频| 日韩精品一区国产麻豆| 国产成人在线影院| 久久99精品视频| 日韩精品一区二区三区蜜臀| 精品国产91九色蝌蚪| 风流少妇一区二区| 亚洲影视在线播放| 日韩欧美123| 99精品视频在线观看| 亚洲综合久久av| 精品少妇一区二区| 91免费观看视频| 久久疯狂做爰流白浆xx| 亚洲国产岛国毛片在线| 91精品国产综合久久久久| 成人中文字幕电影| 奇米一区二区三区| 亚洲免费观看在线视频| 欧美精品一区二区三区蜜桃| 97久久超碰精品国产| 精品一区二区免费在线观看| 中文字幕欧美一| 精品日韩在线观看| 欧美日韩精品一区视频| 成人黄色电影在线| 国内精品伊人久久久久av影院| 亚洲一区自拍偷拍| 国产精品不卡在线| 久久精品一级爱片| 日韩限制级电影在线观看| 在线观看国产91| 成人av网站免费观看| 国产一区二区成人久久免费影院 | 久久免费偷拍视频| 精品少妇一区二区三区在线播放| 欧美日韩日日摸| 色婷婷综合久久久| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 一区二区在线电影| 亚洲欧洲精品一区二区三区不卡| 久久亚洲捆绑美女| 精品国产网站在线观看| 亚洲天堂av老司机| 中文字幕亚洲区| 欧美—级在线免费片| 中文字幕国产一区| 欧美国产日韩a欧美在线观看| 精品国产乱码久久久久久夜甘婷婷| 7777精品伊人久久久大香线蕉最新版| 欧美性xxxxxx少妇| 欧美日韩专区在线| 在线综合+亚洲+欧美中文字幕| 欧美日韩电影在线| 欧美一级艳片视频免费观看| 91麻豆精品国产综合久久久久久 | 一本一道综合狠狠老| 欧美亚洲综合在线| 欧美精品自拍偷拍动漫精品| 欧美日韩精品二区第二页| 欧美日韩精品电影| 日韩免费高清av| 国产精品不卡视频| 五月天欧美精品| 久久99精品久久久久久国产越南 | 亚洲一区二区三区视频在线播放| 亚洲已满18点击进入久久| 免费在线观看不卡| 高清成人免费视频| 在线一区二区三区| 日韩一级完整毛片| 国产精品伦理一区二区| 一区二区三区日韩在线观看| 日本不卡一区二区三区高清视频| 精品一区二区三区影院在线午夜| 波多野结衣一区二区三区 | 中文字幕不卡在线| 性做久久久久久免费观看| 国产精品综合二区| 欧美系列一区二区| 中文字幕av一区二区三区| 欧美日韩一卡二卡三卡| 日韩久久免费av|