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

📄 machdep.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	/*	 * fuword failed (bogus sc_ap value).	 */	if (flags == -1)		return (EINVAL);	if (flags == 0 || copyin((caddr_t)rf, (caddr_t)&tstate, sizeof tstate))		return (EJUSTRETURN);#ifdef DEBUG	if ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid)		printf("sigreturn(%d): ssp %x usp %x scp %x ft %d\n",		       p->p_pid, &flags, scp->sc_sp, uap->sigcntxp,		       (flags&SS_RTEFRAME) ? tstate.ss_frame.f_format : -1);#endif	/*	 * Restore most of the users registers except for A6 and SP	 * which were handled above.	 */	if (flags & SS_USERREGS)		bcopy((caddr_t)tstate.ss_frame.f_regs,		      (caddr_t)frame->f_regs, sizeof(frame->f_regs)-2*NBPW);	/*	 * Restore long stack frames.  Note that we do not copy	 * back the saved SR or PC, they were picked up above from	 * the sigcontext structure.	 */	if (flags & SS_RTEFRAME) {		register int sz;				/* grab frame type and validate */		sz = tstate.ss_frame.f_format;		if (sz > 15 || (sz = exframesize[sz]) < 0)			return (EINVAL);		frame->f_stackadj -= sz;		frame->f_format = tstate.ss_frame.f_format;		frame->f_vector = tstate.ss_frame.f_vector;		bcopy((caddr_t)&tstate.ss_frame.F_u, (caddr_t)&frame->F_u, sz);#ifdef DEBUG		if (sigdebug & SDB_FOLLOW)			printf("sigreturn(%d): copy in %d of frame type %d\n",			       p->p_pid, sz, tstate.ss_frame.f_format);#endif	}#ifdef FPCOPROC	/*	 * Finally we restore the original FP context	 */	if (flags & SS_FPSTATE)		m68881_restore(&tstate.ss_fpstate);#ifdef DEBUG	if ((sigdebug & SDB_FPSTATE) && *(char *)&tstate.ss_fpstate)		printf("sigreturn(%d): copied in FP state (%x) at %x\n",		       p->p_pid, *(u_int *)&tstate.ss_fpstate,		       &tstate.ss_fpstate);#endif#endif#ifdef DEBUG	if ((sigdebug & SDB_FOLLOW) ||	    ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid))		printf("sigreturn(%d): returns\n", p->p_pid);#endif	return (EJUSTRETURN);}int	waittime = -1;boot(howto)	register int howto;{	/* take a snap shot before clobbering any registers */	if (curproc)		savectx(curproc->p_addr, 0);	boothowto = howto;	if ((howto&RB_NOSYNC) == 0 && waittime < 0) {		register struct buf *bp;		int iter, nbusy;		waittime = 0;		(void) spl0();		printf("syncing disks... ");		/*		 * Release vnodes held by texts before sync.		 */		if (panicstr == 0)			vnode_pager_umount(NULL);#ifdef notdef#include "fd.h"#if NFD > 0		fdshutdown();#endif#endif		sync(&proc0, (void *)NULL, (int *)NULL);		for (iter = 0; iter < 20; iter++) {			nbusy = 0;			for (bp = &buf[nbuf]; --bp >= buf; )				if ((bp->b_flags & (B_BUSY|B_INVAL)) == B_BUSY)					nbusy++;			if (nbusy == 0)				break;			printf("%d ", nbusy);			DELAY(40000 * iter);		}		if (nbusy)			printf("giving up\n");		else			printf("done\n");		/*		 * If we've been adjusting the clock, the todr		 * will be out of synch; adjust it now.		 */		resettodr();	}	splhigh();			/* extreme priority */	if (howto&RB_HALT) {		printf("halted\n\n");		asm("	stop	#0x2700");	} else {		printf("\r\n\n");		if (howto & RB_DUMP)			dumpsys();		doboot();		/*NOTREACHED*/	}	/*NOTREACHED*/}int	dumpmag = 0x8fca0101;	/* magic number for savecore */int	dumpsize = 0;		/* also for savecore */long	dumplo = 0;dumpconf(){	int nblks;	dumpsize = physmem;	if (dumpdev != NODEV && bdevsw[major(dumpdev)].d_psize) {		nblks = (*bdevsw[major(dumpdev)].d_psize)(dumpdev);		if (dumpsize > btoc(dbtob(nblks - dumplo)))			dumpsize = btoc(dbtob(nblks - dumplo));		else if (dumplo == 0)			dumplo = nblks - btodb(ctob(physmem));	}	/*	 * Don't dump on the first CLBYTES (why CLBYTES?)	 * in case the dump device includes a disk label.	 */	if (dumplo < btodb(CLBYTES))		dumplo = btodb(CLBYTES);}/* * Doadump comes here after turning off memory management and * getting on the dump stack, either when called above, or by * the auto-restart code. */dumpsys(){	msgbufmapped = 0;	if (dumpdev == NODEV)		return;	/*	 * For dumps during autoconfiguration,	 * if dump device has already configured...	 */	if (dumpsize == 0)		dumpconf();	if (dumplo < 0)		return;	printf("\ndumping to dev %x, offset %d\n", dumpdev, dumplo);	printf("dump ");	switch ((*bdevsw[major(dumpdev)].d_dump)(dumpdev)) {	case ENXIO:		printf("device bad\n");		break;	case EFAULT:		printf("device not ready\n");		break;	case EINVAL:		printf("area improper\n");		break;	case EIO:		printf("i/o error\n");		break;	default:		printf("succeeded\n");		break;	}}/* * machine dependent system variables. */cpu_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p)	int *name;	u_int namelen;	void *oldp;	size_t *oldlenp;	void *newp;	size_t newlen;	struct proc *p;{	/* all sysctl names at this level are terminal */	if (namelen != 1)		return (ENOTDIR);		/* overloaded */	switch (name[0]) {	case CPU_CONSDEV:		return (sysctl_rdstruct(oldp, oldlenp, newp, &cn_tty->t_dev,		    sizeof cn_tty->t_dev));	default:		return (EOPNOTSUPP);	}	/* NOTREACHED */}initcpu(){#ifdef MAPPEDCOPY	extern u_int mappedcopysize;	/*	 * Initialize lower bound for doing copyin/copyout using	 * page mapping (if not already set).  We don't do this on	 * VAC machines as it loses big time.	 */	if (mappedcopysize == 0) {		if (ectype == EC_VIRT)			mappedcopysize = (u_int) -1;		else			mappedcopysize = NBPG;	}#endif	parityenable();}straytrap(pc, evec)	int pc;	u_short evec;{	printf("unexpected trap (vector offset %x) from %x\n",	       evec & 0xFFF, pc);}int	*nofault;badaddr(addr)	register caddr_t addr;{	register int i;	label_t	faultbuf;#ifdef lint	i = *addr; if (i) return(0);#endif	nofault = (int *) &faultbuf;	if (setjmp((label_t *)nofault)) {		nofault = (int *) 0;		return(1);	}	i = *(volatile short *)addr;	nofault = (int *) 0;	return(0);}badbaddr(addr)	register caddr_t addr;{	register int i;	label_t	faultbuf;#ifdef lint	i = *addr; if (i) return(0);#endif	nofault = (int *) &faultbuf;	if (setjmp((label_t *)nofault)) {		nofault = (int *) 0;		return(1);	}	i = *(volatile char *)addr;	nofault = (int *) 0;	return(0);}netintr(){#ifdef INET	if (netisr & (1 << NETISR_ARP)) {		netisr &= ~(1 << NETISR_ARP);		arpintr();	}	if (netisr & (1 << NETISR_IP)) {		netisr &= ~(1 << NETISR_IP);		ipintr();	}#endif#ifdef NS	if (netisr & (1 << NETISR_NS)) {		netisr &= ~(1 << NETISR_NS);		nsintr();	}#endif#ifdef ISO	if (netisr & (1 << NETISR_ISO)) {		netisr &= ~(1 << NETISR_ISO);		clnlintr();	}#endif#ifdef CCITT	if (netisr & (1 << NETISR_CCITT)) {		netisr &= ~(1 << NETISR_CCITT);		ccittintr();	}#endif}#ifdef	notfdefintrhand(sr)	int sr;{	register struct isr *isr;	register int found = 0;	register int ipl;	extern struct isr isrqueue[];	ipl = (sr >> 8) & 7;	switch (ipl) {	case 3:	case 4:	case 5:		ipl = ISRIPL(ipl);		isr = isrqueue[ipl].isr_forw;		for (; isr != &isrqueue[ipl]; isr = isr->isr_forw) {			if ((isr->isr_intr)(isr->isr_arg)) {				found++;				break;			}		}		if (found == 0)			printf("stray interrupt, sr 0x%x\n", sr);		break;	case 0:	case 1:	case 2:	case 6:	case 7:		printf("intrhand: unexpected sr 0x%x\n", sr);		break;	}}#endif#if defined(DEBUG) && !defined(PANICBUTTON)#define PANICBUTTON#endif#ifdef PANICBUTTONint panicbutton = 1;	/* non-zero if panic buttons are enabled */int crashandburn = 0;int candbdelay = 50;	/* give em half a second */voidcandbtimer(arg)	void *arg;{	crashandburn = 0;}#endif/* * Level 7 interrupts can be caused by the keyboard or parity errors. */nmihand(frame)	struct frame frame;{#ifdef PANICBUTTON       	static int innmihand = 0;       	/*       	 * Attempt to reduce the window of vulnerability for recursive       	 * NMIs (e.g. someone holding down the keyboard reset button).       	 */       	if (innmihand == 0) {       		innmihand = 1;       		printf("Got a keyboard NMI\n");       		innmihand = 0;       	}       	if (panicbutton) {       		if (crashandburn) {       			crashandburn = 0;       			panic(panicstr ?       			      "forced crash, nosync" : "forced crash");       		}       		crashandburn++;       		timeout(candbtimer, (void *)0, candbdelay);       	}#endif       	return;}regdump(fp, sbytes)	struct frame *fp; /* must not be register */	int sbytes;{	static int doingdump = 0;	register int i;	int s;	extern char *hexstr();	if (doingdump)		return;	s = splhigh();	doingdump = 1;	printf("pid = %d, pc = %s, ",	       curproc ? curproc->p_pid : -1, hexstr(fp->f_pc, 8));	printf("ps = %s, ", hexstr(fp->f_sr, 4));	printf("sfc = %s, ", hexstr(getsfc(), 4));	printf("dfc = %s\n", hexstr(getdfc(), 4));	printf("Registers:\n     ");	for (i = 0; i < 8; i++)		printf("        %d", i);	printf("\ndreg:");	for (i = 0; i < 8; i++)		printf(" %s", hexstr(fp->f_regs[i], 8));	printf("\nareg:");	for (i = 0; i < 8; i++)		printf(" %s", hexstr(fp->f_regs[i+8], 8));	if (sbytes > 0) {		if (fp->f_sr & PSL_S) {			printf("\n\nKernel stack (%s):",			       hexstr((int)(((int *)&fp)-1), 8));			dumpmem(((int *)&fp)-1, sbytes, 0);		} else {			printf("\n\nUser stack (%s):", hexstr(fp->f_regs[SP], 8));			dumpmem((int *)fp->f_regs[SP], sbytes, 1);		}	}	doingdump = 0;	splx(s);}extern char kstack[];#define KSADDR	((int *)&(kstack[(UPAGES-1)*NBPG]))dumpmem(ptr, sz, ustack)	register int *ptr;	int sz;{	register int i, val;	extern char *hexstr();	for (i = 0; i < sz; i++) {		if ((i & 7) == 0)			printf("\n%s: ", hexstr((int)ptr, 6));		else			printf(" ");		if (ustack == 1) {			if ((val = fuword(ptr++)) == -1)				break;		} else {			if (ustack == 0 &&			    (ptr < KSADDR || ptr > KSADDR+(NBPG/4-1)))				break;			val = *ptr++;		}		printf("%s", hexstr(val, 8));	}	printf("\n");}char *hexstr(val, len)	register int val;{	static char nbuf[9];	register int x, i;	if (len > 8)		return("");	nbuf[len] = '\0';	for (i = len-1; i >= 0; --i) {		x = val & 0xF;		if (x > 9)			nbuf[i] = x - 10 + 'A';		else			nbuf[i] = x + '0';		val >>= 4;	}	return(nbuf);}#ifdef DEBUGchar oflowmsg[] = "k-stack overflow";char uflowmsg[] = "k-stack underflow";badkstack(oflow, fr)	int oflow;	struct frame fr;{#ifdef	notdef	extern char kstackatbase[];	printf("%s: sp should be %x\n", 	       oflow ? oflowmsg : uflowmsg,	       kstackatbase - (exframesize[fr.f_format] + 8));#endif	printf("%s: sp should be ????????\n", oflow ? oflowmsg : uflowmsg);	regdump(&fr, 0);	panic(oflow ? oflowmsg : uflowmsg);}#endif/* for LUNA *//* * Enable parity detection */#define PARREG		((volatile short *)0x49000003)#define	PARITY_ENABLE	0xCparityenable(){	*PARREG = PARITY_ENABLE;}#ifdef FPCOPROC#define EXT_FPP_ADDR		0x6F000000	/* External 68882 board  */#define INT_FPP_ADDR		0x6B000000	/* Internal 68881 chip   */#define FPP_ON			0x80		/* selected fpp on	 */#define FPP_OFF			0x00		/* selected fpp off    	 */#define	SET_INT_FPP	(*(char *)INT_FPP_ADDR = FPP_ON);(*(char *)EXT_FPP_ADDR = FPP_OFF)#define	SET_EXT_FPP	(*(char *)INT_FPP_ADDR = FPP_OFF);(*(char *)EXT_FPP_ADDR = FPP_ON)#define	FPP68881	1#define	FPP68882	2unsigned char fpp_svarea[212];#ifndef	OLD_LUNA/* * Check FPP type 68881/68882. */void checkfpp(){#ifdef LUNA2	if (machineid == LUNA_II) {		return;	}#endif    SET_INT_FPP;	/* internal = on, external = off */    if( is_68882() )      fpptype = FPP68882;    else      fpptype = FPP68881;    return;}#else/* * Check in/ex-ternal fpp, and determine which we use. * Also set fpp type(MC68881/68882). */void checkfpp(){int	internal_exist,external_exist;int	external_68882;#ifdef LUNA2	if (machineid == LUNA_II) {		return;	}#endif    SET_INT_FPP;	/* internal = on, external = off */    if ( internal_exist = havefpp() && is_68882() ) {	/* internal = 68882 */	fpptype = FPP68882;	return;    } else {		/* internal don't exist  or it is not 68882 */        SET_EXT_FPP;	/* internal = off, external = on */	if ( internal_exist && 	/* internal = 68882, external <> 68882 */	     (!(external_exist = havefpp()) || !(external_68882 = is_68882())) ) {	   SET_INT_FPP;	/* internal = on, external = off */	   fpptype = FPP68881;	   return;        }	if ( internal_exist ) { /* internal = 68881, external = 68882 */	   fpptype = FPP68882;	   return;        }	if ( external_exist )  /* internal not exist, external exist */	    if ( external_68882 ) { 	/* external = 68882 */		fpptype = FPP68882;		return;	    } else { 			/* external = 68881 */		fpptype = FPP68881;		return;	    }	else		/* in/ex-ternal non exist */	    panic("fpp non-existence");    }}#endif#endif

⌨️ 快捷键说明

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