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

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

?? irixsig.c

?? 《嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā)實(shí)驗(yàn)教材二源碼》Linux內(nèi)核移植與編譯實(shí)驗(yàn)
?? 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;		}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产乱码字幕精品高清av| 日韩av高清在线观看| 麻豆精品视频在线观看免费| 91在线精品一区二区三区| 日韩精品一区二区三区在线| 亚洲精品少妇30p| 国产91丝袜在线观看| 欧美高清激情brazzers| 亚洲欧美偷拍另类a∨色屁股| 久久99精品国产.久久久久久 | 亚洲在线一区二区三区| 国产老女人精品毛片久久| 欧美夫妻性生活| 亚洲女人的天堂| 国产·精品毛片| 精品久久久久久久人人人人传媒 | 国产欧美一区二区精品性色超碰| 日韩国产在线一| 日本丶国产丶欧美色综合| 国产欧美精品在线观看| 精品一区二区久久久| 欧美一区二区三区视频免费| 亚洲一区二区视频在线| 99久久精品国产一区二区三区| 久久先锋影音av鲁色资源| 麻豆国产精品一区二区三区| 欧美精品久久一区二区三区| 亚洲在线视频网站| 色哟哟亚洲精品| 中文字幕中文字幕中文字幕亚洲无线| 国模娜娜一区二区三区| 日韩午夜精品视频| 日韩黄色一级片| 欧美久久一二三四区| 亚洲成人免费视| 欧美在线视频不卡| 一区二区高清免费观看影视大全| 99久久99久久精品免费看蜜桃| 中文字幕av在线一区二区三区| 国产一区二区精品在线观看| 精品剧情v国产在线观看在线| 日本91福利区| 日韩免费看的电影| 另类小说视频一区二区| 欧美成人一区二区三区片免费| 青青青爽久久午夜综合久久午夜| 日韩写真欧美这视频| 美女脱光内衣内裤视频久久影院| 日韩精品资源二区在线| 麻豆91在线播放| 精品成人免费观看| 国产成人综合在线| 国产精品女同一区二区三区| 成人开心网精品视频| 国产精品毛片久久久久久| 97久久精品人人爽人人爽蜜臀| 亚洲色图在线看| 欧美亚洲国产bt| 亚洲一区二区三区在线播放| 在线不卡欧美精品一区二区三区| 日本不卡的三区四区五区| 欧美不卡视频一区| 国产成人精品网址| 中文字幕日韩一区| 91电影在线观看| 日韩中文字幕亚洲一区二区va在线| 欧美人与性动xxxx| 麻豆国产一区二区| 国产日韩高清在线| 日本乱码高清不卡字幕| 日精品一区二区| 国产亚洲精品精华液| 99视频在线精品| 亚洲高清免费视频| 精品国产伦一区二区三区观看方式| 国产精品亚洲视频| 亚洲精品国产一区二区精华液| 精品1区2区3区| 久久成人综合网| 国产精品免费久久| 欧美亚洲日本国产| 国产中文字幕精品| 亚洲欧美偷拍三级| 欧美一区二区啪啪| 丁香婷婷综合五月| 亚洲国产精品嫩草影院| 久久青草欧美一区二区三区| 99riav一区二区三区| 日韩国产高清在线| 国产欧美一区二区精品性色| 91福利精品视频| 激情六月婷婷综合| 一区二区欧美国产| 精品日产卡一卡二卡麻豆| aaa欧美色吧激情视频| 日韩黄色免费网站| 中文字幕日韩一区| 日韩三级精品电影久久久| 成人免费高清视频在线观看| 午夜精品福利在线| 欧美国产综合一区二区| 91精品国产高清一区二区三区蜜臀| 国产v综合v亚洲欧| 奇米在线7777在线精品| 亚洲欧洲成人av每日更新| 欧美一卡在线观看| 成人app软件下载大全免费| 日韩国产欧美在线观看| 国产精品久久久久久久久快鸭| 欧美一区二区美女| 日本精品视频一区二区三区| 国产一区二区主播在线| 亚洲午夜国产一区99re久久| 欧美激情资源网| 欧美一级日韩不卡播放免费| 91官网在线观看| 国产成人精品影院| 免费在线成人网| 亚洲综合色网站| 国产精品福利影院| 欧美变态口味重另类| 欧美乱熟臀69xxxxxx| 99久久99久久久精品齐齐| 国产一区二区三区四区五区美女 | 国产精品伦一区二区三级视频| 日韩欧美亚洲一区二区| 欧美伊人精品成人久久综合97 | 蜜桃久久av一区| 亚洲国产精品麻豆| 亚洲色图.com| 中文字幕一区二区在线播放| 久久视频一区二区| 欧美一级高清大全免费观看| 欧美性生活久久| 色欲综合视频天天天| av一区二区三区黑人| 国产精品自拍网站| 精品一二线国产| 开心九九激情九九欧美日韩精美视频电影| 一区二区三区高清不卡| 综合婷婷亚洲小说| 中文字幕一区二区日韩精品绯色| 久久久久久久综合狠狠综合| 精品福利av导航| 欧美一级欧美三级| 欧美一区二区三区视频免费播放 | 欧美性受xxxx黑人xyx性爽| 99久久精品免费| 99在线视频精品| 不卡的看片网站| 成a人片亚洲日本久久| 成人激情动漫在线观看| 国产经典欧美精品| 国产91精品精华液一区二区三区| 国产精品综合一区二区三区| 韩国一区二区视频| 麻豆精品蜜桃视频网站| 麻豆精品新av中文字幕| 久久不见久久见免费视频7| 美女免费视频一区二区| 久久99精品国产| 国产一区二区三区综合| 国产精品资源站在线| 国产很黄免费观看久久| 国产高清不卡一区二区| 国产精品12区| 不卡av免费在线观看| 99re在线视频这里只有精品| 色综合久久88色综合天天6| 91高清视频在线| 欧美精品久久久久久久多人混战| 777xxx欧美| 日韩女优制服丝袜电影| 久久九九影视网| 国产精品久久看| 亚洲精品乱码久久久久| 午夜激情综合网| 美女网站视频久久| 国产精品白丝av| 不卡免费追剧大全电视剧网站| 91丝袜美腿高跟国产极品老师| 欧美影视一区二区三区| 欧美精品aⅴ在线视频| 精品国产乱码久久久久久图片| 久久精品夜色噜噜亚洲aⅴ| 国产精品国产成人国产三级| 伊人性伊人情综合网| 天堂在线亚洲视频| 老司机精品视频在线| 成人免费视频网站在线观看| 色综合天天在线| 91超碰这里只有精品国产| 精品欧美黑人一区二区三区| 国产精品嫩草影院com| 亚洲精品亚洲人成人网在线播放| 日韩国产成人精品| 国产精品系列在线播放| 日本韩国精品在线| 日韩丝袜美女视频| 中文字幕高清一区|