4.3BSD-Reno/src/sys/kdb/kdb_trap.c

Compare this file to the similar file:
Show the results in this format:

/*
 * Copyright (c) 1986, 1989 Regents of the University of California.
 * All rights reserved.  The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 *
 *	@(#)kdb_trap.c	7.8 (Berkeley) 5/3/90
 */

/*
 * Trap handler - command loop entry point.
 */
#include "../kdb/defs.h"

char	*kdbNOEOR;

int	kdbexecuting;
char	*kdblp;

char	kdblastc;

ADDR	kdbuserpc;
int	kdblastcom;

ADDR	kdbmaxoff = MAXOFF;
long	kdbmaxpos = MAXPOS;

/*
 * Kdb trap handler; entered on all fatal
 * and/or debugger related traps or faults.
 */
kdb(type, code, curproc, kstack)
	int type, code;
	struct proc *curproc;
	int kstack;
{

	kdbvar[kdbvarchk('t')] = type;
	kdbvar[kdbvarchk('c')] = code;
	kdbvar[kdbvarchk('p')] = (int)curproc;
	if (kdbexecuting)
		kdbdelbp();
	kdbexecuting = 0;
	if (kstack)
		kdbprintf("(from kernel stack)\n"); /* after delbp() */
	kdbprinttrap((long)type, (long)code);
	kdbuserpc = kdbdot = kdbpcb.pcb_pc;
	switch (setexit()) {

	case SINGLE:
		setsstep();		/* hardware single step */
		/* fall thru... */
	case CONTIN:
		return (1);
	case PANIC:
		return (0);
	case 0:
		if (kdbnextpcs(type))
			kdbprintf("breakpoint%16t");
		else
			kdbprintf("stopped at%16t");
		kdbprintpc();
		break;
	}
	if (kdbexecuting)
		kdbdelbp();
	kdbexecuting = 0;
	for (;;) {
		kdbflushbuf();
		if (kdberrflg) {
			kdbprintf("%s\n", kdberrflg);
			kdberrflg = 0;
		}
		if (kdbmkfault) {
			kdbmkfault=0;
			kdbprintc('\n');
			kdbprintf(DBNAME);
		}
		kdbwrite("kdb> ", 5);
		kdblp=0; (void) kdbrdc(); kdblp--;
		(void) kdbcommand((char *)0, kdblastcom);
		if (kdblp && kdblastc!='\n')
			kdberror(kdbNOEOR);
	}
}

/*
 * If there has been an error or a fault, take the error.
 */
kdbchkerr()
{
	if (kdberrflg || kdbmkfault)
		kdberror(kdberrflg);
}

/*
 * An error occurred; save the message for
 * later printing, and reset to main command loop.
 */
kdberror(n)
	char *n;
{

	kdberrflg = n;
	reset(ERROR);
}