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

📄 machdep.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
			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 {		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;	/*	 * XXX include the final RAM page which is not included in physmem.	 */	dumpsize = physmem + 1;	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(dumpsize));	}	/*	 * 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;	}}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();#ifdef USELEDS	ledinit();#endif}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}intrhand(sr)	int sr;{	register struct isr *isr;	register int found = 0;	register int ipl;	extern struct isr isrqueue[];	static int straycount;	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)			straycount = 0;		else if (++straycount > 50)			panic("intrhand: stray interrupt");		else			printf("stray interrupt, sr 0x%x\n", sr);		break;	case 0:	case 1:	case 2:	case 6:	case 7:		if (++straycount > 50)			panic("intrhand: unexpected sr");		else			printf("intrhand: unexpected sr 0x%x\n", sr);		break;	}}#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;{	if (kbdnmi()) {#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;	}	if (parityerror(&frame))		return;	/* panic?? */	printf("unexpected level 7 interrupt ignored\n");}/* * Parity error section.  Contains magic. */#define PARREG		((volatile short *)IIOV(0x5B0000))static int gotparmem = 0;#ifdef DEBUGint ignorekperr = 0;	/* ignore kernel parity errors */#endif/* * Enable parity detection */parityenable(){	label_t	faultbuf;	nofault = (int *) &faultbuf;	if (setjmp((label_t *)nofault)) {		nofault = (int *) 0;#ifdef DEBUG		printf("No parity memory\n");#endif		return;	}	*PARREG = 1;	nofault = (int *) 0;	gotparmem = 1;#ifdef DEBUG	printf("Parity detection enabled\n");#endif}/* * Determine if level 7 interrupt was caused by a parity error * and deal with it if it was.  Returns 1 if it was a parity error. */parityerror(fp)	struct frame *fp;{	if (!gotparmem)		return(0);	*PARREG = 0;	DELAY(10);	*PARREG = 1;	if (panicstr) {		printf("parity error after panic ignored\n");		return(1);	}	if (!findparerror())		printf("WARNING: transient parity error ignored\n");	else if (USERMODE(fp->f_sr)) {		printf("pid %d: parity error\n", curproc->p_pid);		uprintf("sorry, pid %d killed due to memory parity error\n",			curproc->p_pid);		psignal(curproc, SIGKILL);#ifdef DEBUG	} else if (ignorekperr) {		printf("WARNING: kernel parity error ignored\n");#endif	} else {		regdump(fp, 128);		panic("kernel parity error");	}	return(1);}/* * Yuk!  There has got to be a better way to do this! * Searching all of memory with interrupts blocked can lead to disaster. */findparerror(){	static label_t parcatch;	static int looking = 0;	volatile int pg, o, s;	register volatile int *ip;	register int i;	int found;#ifdef lint	i = o = pg = 0; if (i) return(0);#endif	/*	 * If looking is true we are searching for a known parity error	 * and it has just occured.  All we do is return to the higher	 * level invocation.	 */	if (looking)		longjmp(&parcatch);	s = splhigh();	/*	 * If setjmp returns true, the parity error we were searching	 * for has just occured (longjmp above) at the current pg+o	 */	if (setjmp(&parcatch)) {		printf("Parity error at 0x%x\n", ctob(pg)|o);		found = 1;		goto done;	}	/*	 * If we get here, a parity error has occured for the first time	 * and we need to find it.  We turn off any external caches and	 * loop thru memory, testing every longword til a fault occurs and	 * we regain control at setjmp above.  Note that because of the	 * setjmp, pg and o need to be volatile or their values will be lost.	 */	looking = 1;	ecacheoff();	for (pg = btoc(lowram); pg < btoc(lowram)+physmem; pg++) {		pmap_enter(kernel_pmap, (vm_offset_t)vmmap, ctob(pg),		    VM_PROT_READ, TRUE);		ip = (int *)vmmap;		for (o = 0; o < NBPG; o += sizeof(int))			i = *ip++;	}	/*	 * Getting here implies no fault was found.  Should never happen.	 */	printf("Couldn't locate parity error\n");	found = 0;done:	looking = 0;	pmap_remove(kernel_pmap, (vm_offset_t)vmmap, (vm_offset_t)&vmmap[NBPG]);	ecacheon();	splx(s);	return(found);}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, ustack;{	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;	int len;{	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;{	extern char kstackatbase[];	printf("%s: sp should be %x\n", 	       oflow ? oflowmsg : uflowmsg,	       kstackatbase - (exframesize[fr.f_format] + 8));	regdump(&fr, 0);	panic(oflow ? oflowmsg : uflowmsg);}#endif

⌨️ 快捷键说明

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