AUSAM/source/S/coreit.c

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

#

/*
 * prints out a brief summary of the status
 * of a core dump.
 */

#include <param.h>
#include <file.h>
#include <user.h>
#include <reg.h>

struct	{
	char	*rname;
	int	rnum;
	} regs[9] {
	"R0",	R0,
	"R1",	R1,
	"R2",	R2,
	"R3",	R3,
	"R4",	R4,
	"R5",	R5,
	"SP",	R6,
	"PC",	R7,
	"PS",	RPS
	};

char	*sigmsg[NSIG] {
	"0",
	"hangup",
	"interrupt",
	"quit",
	"illegal instruction",
	"trace/breakpoint",
	"iot",
	"emt",
	"floating exception",
	"kill",
	"bus error",
	"segmentation violation",
	"bad system call",
	"broken pipe",
	"terminated",
	"real-time limit",
	"cpu-time limit",
	"17",
	"18",
	"19"
	};

struct	{
	int	f_dummy;
	double	ac0,ac4,ac5,ac1,ac2,ac3;
	};

int	thebuff[1024/2];

int	inode[18];

char	abuff[512];	/* for argument evaluation */

main(argc, argv)
int	argc;
char	*argv[];
{
	int	i, stuffed;

	stuffed = 0;
	if (argc < 2) {
		if (dumpc("core") < 0)
			stuffed++;
	} else
		for (i = 1; i < argc; i++)
			if (dumpc(argv[i]) < 0) {
				stuffed++;
				break;
			}
	flush();
	exit(stuffed != 0);
}

dumpc(afile)
char	*afile;
{
	int	fid;
	register struct user	*p;
	register int	i;
	int	flag;
	long	fsize;
	struct {
		int	long2[2];
		};

	p = thebuff;

	if (stat(afile, inode) < 0) {
		printf("no such file - %s\n", afile);
		return(-1);
	}
	if (inode[2] & 060000) {
		printf("not an ordinary file - %s\n", afile);
		return(-1);
	}

	if ((fid = open(afile, 0)) < 0) {
		printf("can't open file - %s\n", afile);
		return(-1);
	}
	if (read(fid, p, 1024) != 1024) {
		close(fid);
		printf("invalid file - %s\n", afile);
		return(-1);
	}

	fsize.long2[0] = (inode[4] >> 8) & 0377;
	fsize.long2[1] = inode[5];
	i = p->u_dsize + p->u_ssize;
	if (p->u_flags & USHRDATA)
		i =+ p->u_tsize;	/* shared data */
	i =+ (1024 >> 6);
	if ((fsize >> 6) != i) {
		printf("invalid core file : %s\n", afile);
		return(-1);
	}

	printf("\n--> file: %s <--\n\n", afile);

	if (anal(fid) < 0)
		return(-1);
	close(fid);


	if (p->u_tsize != 0)
		printf("text size = %o bytes\n", p->u_tsize<<6);
	if (p->u_dsize != 0)
		printf("data size = %o bytes\n", p->u_dsize<<6);
	printf("stack size = %o bytes\n", p->u_ssize<<6);
	if (p->u_sep)
		printf("separated I/D spaces\n");
	if (p->u_flags & USHRDATA)
		printf("shared data segment\n");

	printf("Reason for dump: %s\n", sigmsg[p->u_arg[0]]);

	printf("user id: (real)=%o, (effective)=%o\n", p->u_uid, p->u_ruid);

	printf("system time usage = %D. ticks\n", p->u_stime);
	printf("user time usage = %D. ticks\n", p->u_utime);
	if (p->u_cstime!=0 || p->u_cutime!=0) {
		printf("sum of childrens...:\n");
		printf("  system time = %D. ticks\n", p->u_cstime);
		printf("  user time = %D. ticks\n", p->u_cutime);
	}

	if (p->u_prof[3] != 0) {
		printf("profiling enabled:\n");
		printf("  buffer = %o\n", p->u_prof[0]);
		printf("  buff size = %o\n", p->u_prof[1]);
		printf("  offset = %o\n", p->u_prof[2]);
		printf("  scale = %o\n", p->u_prof[3]);
	}

	flag = 0;
	for (i = 0; i < NOFILE; i++)
		if (p->u_ofile[i] != 0) {
			if (!flag) {
				printf("open files:");
				printf(" (filedescriptor and &inode)\n");
				flag++;
			} else
				printf(", ");
			printf("%d. - %o", i, p->u_ofile[i]);
		}
	if (!flag)
		printf("no open files\n");
	else
		printf("\n");

/*
	printf("prototype segmentation registers:\n");
	for (i = 0; i < 8; i++)
		if (p->uisd[i] & 060) {
			printf(" PAR/PDR %d", i);
			printf(" %6o", p->u_uisa[i]);
			printf(" %3o", (p->u_uisd[i] >> 8) & 0377);
			printf(" %s\n", ((p->u_uisd[i] & 060) == 060) ? "rw" : "ro");
		}
 */

	printf("system call arguments:\n");
	for (i = 0; i < 5; i++)
		printf(" %o", p->u_arg[i]);
	printf("\n");

	printf("registers:\n");
	i = p;
	i =+ p->u_ar0;
	i =- 0140000;
	p->u_ar0 = i;
	for (i = 0; i < 9; i++)
		printf(" %s %o\n", regs[i].rname, p->u_ar0[regs[i].rnum]);
#ifdef	FPU
	printf("Floating point registers:\n");
		printf("FEC = %o, FEA = %o, FPS = %o\n",
			p->u_fec, p->u_fea, p->u_fsav[0]);
		printf("AC0 = %24.18e\n", p->u_fsav->ac0);
		printf("AC1 = %24.18e\n", p->u_fsav->ac1);
		printf("AC2 = %24.18e\n", p->u_fsav->ac2);
		printf("AC3 = %24.18e\n", p->u_fsav->ac3);
		printf("AC4 = %24.18e\n", p->u_fsav->ac4);
		printf("AC5 = %24.18e\n", p->u_fsav->ac5);

#endif	FPU
	printf("signals:\n");
	for (i = 0; i < NSIG; i++)
		if (p->u_signal[i] != 0) {
			printf("  %s:  ", sigmsg[i]);
			if (p->u_signal[i] & 01)
				printf("ignored\n");
			else
				printf("trap to - %o\n", p->u_signal[i]);
		}


	return(0);
}

anal(afid)
int	afid;
{
	register int	*ip;
	register char	*cp;

	seek(afid, -512, 2);
	if (read(afid, abuff, 512) != 512) {
		printf("Can't read arguments from file?\n");
		return(-1);
	}
	ip = &abuff[512];
	while (*--ip != -1)
		if (ip == abuff) {
			printf("** File exec'ed with no arguments.\n");
			return(0);
		}
	cp = ip + 1;
	if (*cp == '\0')
		cp++;
	printf("name - %s\n", cp);
	return(0);
}