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

📄 trap.c

📁 著名的AT&T UNIX v6 源码
💻 C
字号:
#include "../h/param.h"#include "../h/systm.h"#include "../h/dir.h"#include "../h/user.h"#include "../h/proc.h"#include "../h/reg.h"#include "../h/seg.h"#include "../h/trap.h"#include "../h/psl.h"#define	USER	040		/* user-mode flag added to type */struct	sysent	sysent[64];/* * Called from the trap handler when a processor trap occurs. */trap(params, r0, r1, r2, r3, r4, r5 ,r6, r7, r8, r9, r10,	r11, r12, r13, sp, type, code, pc, psl)caddr_t params;{	register i, a;	register struct sysent *callp;	register caddr_t errorp;	register time_t syst;	register int *locr0;	locr0 = &r0;	syst = u.u_stime;	u.u_ar0 = locr0;	if (USERMODE(locr0[PS]))		type |= USER;	u.u_ar0 = locr0;	switch (type) {	/*	 * Trap not expected.	 * Usually a kernel mode bus error.	 */	default:		printf("user = ");		for(i=0; i<UPAGES; i++)			printf("%x ", u.u_procp->p_addr[i]);		printf("\n");		printf("ps = %x\n", locr0[PS]);		printf("pc = %x\n", locr0[PC]);		printf("trap type %x\n", type);		printf("code = %x\n", code);		panic("trap");	case PROTFLT + USER:	/* protection fault */		i = SIGBUS;		break;	case PRIVINFLT + USER:	/* privileged instruction fault */	case RESADFLT + USER:	/* reserved addressing fault */	case RESOPFLT + USER:	/* resereved operand fault */		i = SIGINS;		break;	case RESCHED + USER:	/* Allow process switch */		goto out;	case SYSCALL + USER: /* sys call */		params += NBPW;		/* skip word with param count */		u.u_error = 0;		callp = &sysent[code&077];		if (callp == sysent) { /* indirect */			a = fuword(params);			params += NBPW;			callp = &sysent[a&077];		}		for(i=0; i<callp->sy_narg; i++) {			u.u_arg[i] = fuword(params);			params += NBPW;		}		u.u_ap = u.u_arg;		locr0[PS] &= ~PSL_C;		u.u_dirp = (caddr_t)u.u_arg[0];		u.u_r.r_val1 = 0;		u.u_r.r_val2 = locr0[R1];		if(save(u.u_qsav)){			if(u.u_error==0)				u.u_error = EINTR;		} else {			(*(callp->sy_call))();		}		if(u.u_error) {			locr0[R0] = u.u_error;			locr0[PS] |= PSL_C;	/* carry bit */		 } else {			locr0[R0] = u.u_r.r_val1;			locr0[R1] = u.u_r.r_val2;		}		goto out;	case ARITHTRAP + USER:		i = SIGFPT;		break;	/*	 * If the user SP is above the stack segment,	 * grow the stack automatically.	 */	case SEGFLT + USER: /* segmentation exception */		if(grow(locr0[SP]) || grow(code))			goto out;		i = SIGSEG;		break;	case BPTFLT + USER:	/* bpt instruction fault */	case TRCTRAP + USER:	/* trace trap */		locr0[PS] &= ~PSL_T;	/* turn off trace bit */		i = SIGTRC;		break;	case XFCFLT + USER:	/* xfc instruction fault */		i = SIGEMT;		break;	case COMPATFLT + USER: /* compatibility mode fault */				/* so far, just send a SIGINS signal */		i = SIGINS;		break;	}	psignal(u.u_procp, i);out:	if(issig())		psig();	curpri = setpri(u.u_procp);	if (runrun)		qswtch();	if(u.u_prof.pr_scale)		addupc((caddr_t)locr0[PC], &u.u_prof, (int)(u.u_stime-syst));	return;}/* * nonexistent system call-- set fatal error code. */nosys(){	u.u_error = 100;}/* * Ignored system call */nullsys(){}random(dev, stat, ps, pc, ccb){	printf("Random interrupt, device %x\n", dev);}

⌨️ 快捷键说明

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