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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? irixsig.c

?? ARM 嵌入式 系統(tǒng) 設計與實例開發(fā) 實驗教材 二源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * 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;		}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久久av麻豆果冻| 亚洲国产色一区| 国产精品三级电影| 国产人成亚洲第一网站在线播放| 26uuu久久综合| 久久综合九色综合97婷婷女人| 精品国产一区二区国模嫣然| 精品久久一区二区| 国产无人区一区二区三区| 国产三级欧美三级| 最近日韩中文字幕| 亚洲精品成人在线| 亚洲成人免费av| 日韩国产成人精品| 韩国欧美一区二区| 粉嫩av一区二区三区| 成人午夜在线免费| 一本大道av伊人久久综合| 在线欧美小视频| 777精品伊人久久久久大香线蕉| 欧美一区二区三区男人的天堂| 日韩免费高清电影| 国产色婷婷亚洲99精品小说| 国产精品卡一卡二| 亚洲第一成人在线| 激情另类小说区图片区视频区| 风间由美一区二区av101| 色婷婷综合久久久久中文一区二区 | 秋霞影院一区二区| 九九九久久久精品| 99久久亚洲一区二区三区青草| 色爱区综合激月婷婷| 91精品国产综合久久精品麻豆| 午夜精品一区在线观看| 日韩高清在线电影| 国产一区二区在线看| 91美女在线视频| 日韩欧美国产综合一区 | 亚洲午夜激情av| 另类中文字幕网| 99精品久久只有精品| 欧美日韩精品一区二区三区四区| 精品不卡在线视频| 亚洲综合激情网| 久久超碰97人人做人人爱| 97se亚洲国产综合自在线不卡| 欧美日韩免费观看一区二区三区| 26uuu亚洲婷婷狠狠天堂| 亚洲欧美日韩国产另类专区 | 欧美裸体一区二区三区| 精品精品国产高清a毛片牛牛| 国产精品久久综合| 美脚の诱脚舐め脚责91| 色综合视频在线观看| 日韩免费看网站| 亚洲夂夂婷婷色拍ww47| 国产精品中文字幕一区二区三区| 欧洲精品在线观看| 欧美极品xxx| 另类人妖一区二区av| 色综合天天综合在线视频| 精品99一区二区| 亚洲国产成人高清精品| 成人av电影在线播放| 欧美成人女星排名| 亚洲网友自拍偷拍| 成人福利视频在线| 精品乱人伦小说| 日韩综合一区二区| 色综合亚洲欧洲| 日本一区二区三区久久久久久久久不| 五月婷婷欧美视频| 在线免费观看不卡av| 亚洲国产激情av| 久久av资源网| 88在线观看91蜜桃国自产| 亚洲综合色婷婷| 99视频精品全部免费在线| 久久蜜臀中文字幕| 免费高清成人在线| 欧美精品在线观看一区二区| 亚洲欧美视频在线观看视频| 成人免费毛片aaaaa**| xnxx国产精品| 精品一区二区日韩| 日韩色视频在线观看| 香蕉成人伊视频在线观看| 91国在线观看| 一区二区三区在线不卡| 99久久久精品| 日韩一区在线看| 成人网男人的天堂| 欧美极品少妇xxxxⅹ高跟鞋| 国产高清久久久| 久久精品视频网| 国产剧情一区二区| 国产农村妇女毛片精品久久麻豆| 激情综合色综合久久| 精品入口麻豆88视频| 激情综合色播激情啊| 欧美电影免费观看完整版| 日韩二区三区四区| 欧美成人欧美edvon| 黄色日韩网站视频| 久久久综合精品| 国产乱码精品一区二区三区av | 国内一区二区视频| 国产亚洲综合在线| 成人黄色免费短视频| 中文字幕一区免费在线观看 | 精品国产乱码久久久久久免费 | 在线观看亚洲a| 亚洲国产一区在线观看| 欧美精品一二三| 久久电影网电视剧免费观看| 久久久噜噜噜久久人人看 | 日韩视频免费观看高清完整版在线观看| 日本欧美肥老太交大片| 日韩欧美一级在线播放| 国产精品99久久不卡二区| 国产精品久久久99| 在线免费观看成人短视频| 天天做天天摸天天爽国产一区| 欧美电视剧免费观看| 国产一区二区女| 国产精品久久毛片av大全日韩| 色女孩综合影院| 首页国产欧美日韩丝袜| 欧美sm极限捆绑bd| 成人国产精品免费观看| 亚洲一二三四在线观看| 日韩久久精品一区| 成人永久看片免费视频天堂| 亚洲免费在线播放| 欧美一区二区三区视频免费播放| 国产麻豆精品在线观看| 亚洲三级免费电影| 欧美一级欧美一级在线播放| 国产精品一卡二卡| 亚洲欧美偷拍三级| 欧美一区二区私人影院日本| 成人性视频网站| 午夜久久久影院| 久久久欧美精品sm网站| 91九色最新地址| 国产综合久久久久影院| 一区二区三区色| 久久蜜臀中文字幕| 欧美色图免费看| 国产精品一区二区视频| 午夜久久电影网| 国产精品美女一区二区在线观看| 欧美老女人第四色| jlzzjlzz亚洲日本少妇| 日本午夜精品一区二区三区电影| 国产精品美女久久久久av爽李琼| 91.xcao| av中文字幕不卡| 极品销魂美女一区二区三区| 亚洲三级免费电影| 久久天天做天天爱综合色| 欧美性生活一区| 成人精品鲁一区一区二区| 免费观看日韩av| 亚洲综合久久久久| 国产精品美女久久久久久久久久久| 欧美一级欧美三级| 欧美综合一区二区| 成人激情文学综合网| 狠狠色丁香婷综合久久| 日韩精品91亚洲二区在线观看 | 成人丝袜视频网| 久久99久久久欧美国产| 亚洲国产中文字幕| 亚洲天堂2014| 欧美激情一二三区| 久久综合色鬼综合色| 欧美日产在线观看| 91久久一区二区| av午夜精品一区二区三区| 国产乱码字幕精品高清av| 蜜臀av一区二区在线免费观看| 亚洲线精品一区二区三区 | 91麻豆成人久久精品二区三区| 3d动漫精品啪啪一区二区竹菊| 国产美女精品人人做人人爽| 日本亚洲电影天堂| 五月激情综合婷婷| 99亚偷拍自图区亚洲| 国产在线播放一区| 美腿丝袜亚洲三区| 免费不卡在线视频| 天堂午夜影视日韩欧美一区二区| 亚洲一区二区在线观看视频 | 亚洲在线成人精品| 一区二区三区国产精华| 亚洲色图在线视频| 亚洲欧洲精品一区二区精品久久久| 久久久久青草大香线综合精品| 日韩视频在线一区二区|