svn commit: r219043 - in head/usr.bin: kdump ktrace

Dmitry Chagin dchagin at FreeBSD.org
Fri Feb 25 22:07:24 UTC 2011


Author: dchagin
Date: Fri Feb 25 22:07:23 2011
New Revision: 219043
URL: http://svn.freebsd.org/changeset/base/219043

Log:
  Teach kdump to understand sv_flags records in the trace files.
  
  MFC after:	1 Month.

Modified:
  head/usr.bin/kdump/kdump.c
  head/usr.bin/ktrace/ktrace.c
  head/usr.bin/ktrace/ktrace.h

Modified: head/usr.bin/kdump/kdump.c
==============================================================================
--- head/usr.bin/kdump/kdump.c	Fri Feb 25 22:05:33 2011	(r219042)
+++ head/usr.bin/kdump/kdump.c	Fri Feb 25 22:07:23 2011	(r219043)
@@ -55,7 +55,9 @@ extern int errno;
 #include <sys/ioctl.h>
 #include <sys/socket.h>
 #include <sys/stat.h>
+#include <sys/sysent.h>
 #include <sys/un.h>
+#include <sys/queue.h>
 #ifdef IPX
 #include <sys/types.h>
 #include <netipx/ipx.h>
@@ -81,15 +83,17 @@ extern int errno;
 #include "ktrace.h"
 #include "kdump_subr.h"
 
+u_int abidump(struct ktr_header *);
+int fetchprocinfo(struct ktr_header *, u_int *);
 int fread_tail(void *, int, int);
 void dumpheader(struct ktr_header *);
-void ktrsyscall(struct ktr_syscall *);
-void ktrsysret(struct ktr_sysret *);
+void ktrsyscall(struct ktr_syscall *, u_int);
+void ktrsysret(struct ktr_sysret *, u_int);
 void ktrnamei(char *, int);
 void hexdump(char *, int, int);
 void visdump(char *, int, int);
 void ktrgenio(struct ktr_genio *, int);
-void ktrpsig(struct ktr_psig *);
+void ktrpsig(struct ktr_psig *, u_int);
 void ktrcsw(struct ktr_csw *);
 void ktruser(int, unsigned char *);
 void ktrsockaddr(struct sockaddr *);
@@ -100,13 +104,22 @@ void sockfamilyname(int);
 const char *ioctlname(u_long);
 
 int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
-    resolv = 0;
+    resolv = 0, abiflag = 0;
 const char *tracefile = DEF_TRACEFILE;
 struct ktr_header ktr_header;
 
 #define TIME_FORMAT	"%b %e %T %Y"
 #define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
 
+struct proc_info
+{
+	TAILQ_ENTRY(proc_info)	info;
+	u_int			sv_flags;
+	pid_t			pid;
+};
+
+TAILQ_HEAD(trace_procs, proc_info) trace_procs;
+
 int
 main(int argc, char *argv[])
 {
@@ -115,11 +128,15 @@ main(int argc, char *argv[])
 	int trpoints = ALL_POINTS;
 	int drop_logged;
 	pid_t pid = 0;
+	u_int sv_flags;
 
 	(void) setlocale(LC_CTYPE, "");
 
-	while ((ch = getopt(argc,argv,"f:dElm:np:HRrsTt:")) != -1)
+	while ((ch = getopt(argc,argv,"f:dElm:np:AHRrsTt:")) != -1)
 		switch((char)ch) {
+		case 'A':
+			abiflag = 1;
+			break;
 		case 'f':
 			tracefile = optarg;
 			break;
@@ -173,6 +190,7 @@ main(int argc, char *argv[])
 		errx(1, "%s", strerror(ENOMEM));
 	if (!freopen(tracefile, "r", stdin))
 		err(1, "%s", tracefile);
+	TAILQ_INIT(&trace_procs);
 	drop_logged = 0;
 	while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
 		if (ktr_header.ktr_type & KTR_DROP) {
@@ -205,6 +223,9 @@ main(int argc, char *argv[])
 		}
 		if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
 			errx(1, "data too short");
+		if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
+			continue;
+		sv_flags = abidump(&ktr_header);
 		if (pid && ktr_header.ktr_pid != pid)
 			continue;
 		if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
@@ -212,10 +233,10 @@ main(int argc, char *argv[])
 		drop_logged = 0;
 		switch (ktr_header.ktr_type) {
 		case KTR_SYSCALL:
-			ktrsyscall((struct ktr_syscall *)m);
+			ktrsyscall((struct ktr_syscall *)m, sv_flags);
 			break;
 		case KTR_SYSRET:
-			ktrsysret((struct ktr_sysret *)m);
+			ktrsysret((struct ktr_sysret *)m, sv_flags);
 			break;
 		case KTR_NAMEI:
 		case KTR_SYSCTL:
@@ -225,7 +246,7 @@ main(int argc, char *argv[])
 			ktrgenio((struct ktr_genio *)m, ktrlen);
 			break;
 		case KTR_PSIG:
-			ktrpsig((struct ktr_psig *)m);
+			ktrpsig((struct ktr_psig *)m, sv_flags);
 			break;
 		case KTR_CSW:
 			ktrcsw((struct ktr_csw *)m);
@@ -258,6 +279,84 @@ fread_tail(void *buf, int size, int num)
 	return (i);
 }
 
+int
+fetchprocinfo(struct ktr_header *kth, u_int *flags)
+{
+	struct proc_info *pi;
+
+	switch (kth->ktr_type) {
+	case KTR_PROCCTOR:
+		TAILQ_FOREACH(pi, &trace_procs, info) {
+			if (pi->pid == kth->ktr_pid) {
+				TAILQ_REMOVE(&trace_procs, pi, info);
+				break;
+			}
+		}
+		pi = malloc(sizeof(struct proc_info));
+		if (pi == NULL)
+			errx(1, "%s", strerror(ENOMEM));
+		pi->sv_flags = *flags;
+		pi->pid = kth->ktr_pid;
+		TAILQ_INSERT_TAIL(&trace_procs, pi, info);
+		return (1);
+
+	case KTR_PROCDTOR:
+		TAILQ_FOREACH(pi, &trace_procs, info) {
+			if (pi->pid == kth->ktr_pid) {
+				TAILQ_REMOVE(&trace_procs, pi, info);
+				free(pi);
+				break;
+			}
+		}
+		return (1);
+	}
+
+	return (0);
+}
+
+u_int
+abidump(struct ktr_header *kth)
+{
+	struct proc_info *pi;
+	const char *abi;
+	const char *arch;
+	u_int flags = 0;
+
+	TAILQ_FOREACH(pi, &trace_procs, info) {
+		if (pi->pid == kth->ktr_pid) {
+			flags = pi->sv_flags;
+			break;
+		}
+	}
+
+	if (abiflag == 0)
+		return (flags);
+
+	switch (flags & SV_ABI_MASK) {
+	case SV_ABI_LINUX:
+		abi = "L";
+		break;
+	case SV_ABI_FREEBSD:
+		abi = "F";
+		break;
+	default:
+		abi = "U";
+		break;
+	}
+
+	if (flags != 0) {
+		if (flags & SV_LP64)
+			arch = "64";
+		else
+			arch = "32";
+	} else
+		arch = "00";
+
+	printf("%s%s  ", abi, arch);
+
+	return (flags);
+}
+
 void
 dumpheader(struct ktr_header *kth)
 {
@@ -293,6 +392,10 @@ dumpheader(struct ktr_header *kth)
 	case KTR_SYSCTL:
 		type = "SCTL";
 		break;
+	case KTR_PROCCTOR:
+		/* FALLTHROUGH */
+	case KTR_PROCDTOR:
+		return;
 	default:
 		(void)sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
 		type = unknown;
@@ -337,19 +440,21 @@ dumpheader(struct ktr_header *kth)
 int nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]);
 
 void
-ktrsyscall(struct ktr_syscall *ktr)
+ktrsyscall(struct ktr_syscall *ktr, u_int flags)
 {
 	int narg = ktr->ktr_narg;
 	register_t *ip;
 
-	if (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0)
+	if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
+	    (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0))
 		(void)printf("[%d]", ktr->ktr_code);
 	else
 		(void)printf("%s", syscallnames[ktr->ktr_code]);
 	ip = &ktr->ktr_args[0];
 	if (narg) {
 		char c = '(';
-		if (fancy) {
+		if (fancy &&
+		    (flags == 0 || (flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) {
 
 #define print_number(i,n,c) do {                      \
 	if (decimal)                                  \
@@ -807,13 +912,14 @@ ktrsyscall(struct ktr_syscall *ktr)
 }
 
 void
-ktrsysret(struct ktr_sysret *ktr)
+ktrsysret(struct ktr_sysret *ktr, u_int flags)
 {
 	register_t ret = ktr->ktr_retval;
 	int error = ktr->ktr_error;
 	int code = ktr->ktr_code;
 
-	if (code >= nsyscalls || code < 0)
+	if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
+	    (code >= nsyscalls || code < 0))
 		(void)printf("[%d] ", code);
 	else
 		(void)printf("%s ", syscallnames[code]);
@@ -987,9 +1093,10 @@ const char *signames[] = {
 };
 
 void
-ktrpsig(struct ktr_psig *psig)
+ktrpsig(struct ktr_psig *psig, u_int flags)
 {
-	if (psig->signo > 0 && psig->signo < NSIG)
+	if ((flags & SV_ABI_MASK) == SV_ABI_FREEBSD &&
+	    psig->signo > 0 && psig->signo < NSIG)
 		(void)printf("SIG%s ", signames[psig->signo]);
 	else
 		(void)printf("SIG %d ", psig->signo);
@@ -1367,7 +1474,7 @@ invalid:
 void
 usage(void)
 {
-	fprintf(stderr, "usage: kdump [-dEnlHRrsT] [-f trfile] "
+	fprintf(stderr, "usage: kdump [-dEnlHRrsTA] [-f trfile] "
 	    "[-m maxdata] [-p pid] [-t trstr]\n");
 	exit(1);
 }

Modified: head/usr.bin/ktrace/ktrace.c
==============================================================================
--- head/usr.bin/ktrace/ktrace.c	Fri Feb 25 22:05:33 2011	(r219042)
+++ head/usr.bin/ktrace/ktrace.c	Fri Feb 25 22:07:23 2011	(r219043)
@@ -159,6 +159,8 @@ main(int argc, char *argv[])
 	(void)umask(omask);
 	(void)close(fd);
 
+	trpoints |= PROC_ABI_POINTS;
+
 	if (*argv) { 
 		if (ktrace(tracefile, ops, trpoints, getpid()) < 0)
 			err(1, "%s", tracefile);

Modified: head/usr.bin/ktrace/ktrace.h
==============================================================================
--- head/usr.bin/ktrace/ktrace.h	Fri Feb 25 22:05:33 2011	(r219042)
+++ head/usr.bin/ktrace/ktrace.h	Fri Feb 25 22:07:23 2011	(r219043)
@@ -34,7 +34,9 @@
 		    KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_USER | \
 		    KTRFAC_STRUCT | KTRFAC_SYSCTL)
 
-#define ALL_POINTS (DEF_POINTS | KTRFAC_CSW)
+#define PROC_ABI_POINTS (KTRFAC_PROCCTOR | KTRFAC_PROCDTOR)
+
+#define ALL_POINTS (DEF_POINTS | KTRFAC_CSW | PROC_ABI_POINTS)
 
 #define DEF_TRACEFILE	"ktrace.out"
 


More information about the svn-src-head mailing list