Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Jan 2013 18:01:47 +0000 (UTC)
From:      Alfred Perlstein <alfred@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r245260 - in projects/utrace2: lib/libc/sys sys/compat/freebsd32 sys/kern sys/sys usr.bin/kdump usr.bin/ktrace
Message-ID:  <201301101801.r0AI1lb9081229@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: alfred
Date: Thu Jan 10 18:01:46 2013
New Revision: 245260
URL: http://svnweb.freebsd.org/changeset/base/245260

Log:
  utrace2(2) system call and kdump support.

Modified:
  projects/utrace2/lib/libc/sys/Symbol.map
  projects/utrace2/sys/compat/freebsd32/syscalls.master
  projects/utrace2/sys/kern/init_sysent.c
  projects/utrace2/sys/kern/kern_ktrace.c
  projects/utrace2/sys/kern/syscalls.c
  projects/utrace2/sys/kern/syscalls.master
  projects/utrace2/sys/kern/systrace_args.c
  projects/utrace2/sys/sys/ktrace.h
  projects/utrace2/sys/sys/syscall.h
  projects/utrace2/sys/sys/syscall.mk
  projects/utrace2/sys/sys/sysproto.h
  projects/utrace2/usr.bin/kdump/kdump.c
  projects/utrace2/usr.bin/ktrace/ktrace.h
  projects/utrace2/usr.bin/ktrace/subr.c

Modified: projects/utrace2/lib/libc/sys/Symbol.map
==============================================================================
--- projects/utrace2/lib/libc/sys/Symbol.map	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/lib/libc/sys/Symbol.map	Thu Jan 10 18:01:46 2013	(r245260)
@@ -384,6 +384,7 @@ FBSD_1.3 {
 	ffclock_getestimate;
 	ffclock_setestimate;
 	posix_fadvise;
+	utrace2;
 	wait6;
 };
 
@@ -1014,6 +1015,8 @@ FBSDprivate_1.0 {
 	__sys_utimes;
 	_utrace;
 	__sys_utrace;
+	_utrace2;
+	__sys_utrace2;
 	_uuidgen;
 	__sys_uuidgen;
 	_vadvise;

Modified: projects/utrace2/sys/compat/freebsd32/syscalls.master
==============================================================================
--- projects/utrace2/sys/compat/freebsd32/syscalls.master	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/sys/compat/freebsd32/syscalls.master	Thu Jan 10 18:01:46 2013	(r245260)
@@ -1004,4 +1004,5 @@
 				    int *status, int options, \
 				    struct wrusage32 *wrusage, \
 				    siginfo_t *info); }
+533     AUE_NULL        STD     { int utrace2(const void *addr, size_t len); }
 

Modified: projects/utrace2/sys/kern/init_sysent.c
==============================================================================
--- projects/utrace2/sys/kern/init_sysent.c	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/sys/kern/init_sysent.c	Thu Jan 10 18:01:46 2013	(r245260)
@@ -567,4 +567,5 @@ struct sysent sysent[] = {
 	{ AS(posix_fallocate_args), (sy_call_t *)sys_posix_fallocate, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC },	/* 530 = posix_fallocate */
 	{ AS(posix_fadvise_args), (sy_call_t *)sys_posix_fadvise, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC },	/* 531 = posix_fadvise */
 	{ AS(wait6_args), (sy_call_t *)sys_wait6, AUE_WAIT6, NULL, 0, 0, 0, SY_THR_STATIC },	/* 532 = wait6 */
+	{ AS(utrace2_args), (sy_call_t *)sys_utrace2, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC },	/* 533 = utrace2 */
 };

Modified: projects/utrace2/sys/kern/kern_ktrace.c
==============================================================================
--- projects/utrace2/sys/kern/kern_ktrace.c	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/sys/kern/kern_ktrace.c	Thu Jan 10 18:01:46 2013	(r245260)
@@ -123,6 +123,7 @@ static int data_lengths[] = {
 	sizeof(struct ktr_cap_fail),		/* KTR_CAPFAIL */
 	sizeof(struct ktr_fault),		/* KTR_FAULT */
 	sizeof(struct ktr_faultend),		/* KTR_FAULTEND */
+	0,					/* KTR_USER2 */
 };
 
 static STAILQ_HEAD(, ktr_request) ktr_free;
@@ -1025,6 +1026,42 @@ sys_utrace(td, uap)
 #endif /* KTRACE */
 }
 
+/* ARGSUSED */
+int
+sys_utrace2(td, uap)
+	struct thread *td;
+	register struct utrace2_args *uap;
+{
+
+#ifdef KTRACE
+	struct ktr_request *req;
+	void *cp;
+	int error;
+
+	if (!KTRPOINT(td, KTR_USER2))
+		return (0);
+	if (uap->len > KTR_USER_MAXLEN)
+		return (EINVAL);
+	cp = malloc(uap->len, M_KTRACE, M_WAITOK);
+	error = copyin(uap->addr, cp, uap->len);
+	if (error) {
+		free(cp, M_KTRACE);
+		return (error);
+	}
+	req = ktr_getrequest(KTR_USER2);
+	if (req == NULL) {
+		free(cp, M_KTRACE);
+		return (ENOMEM);
+	}
+	req->ktr_buffer = cp;
+	req->ktr_header.ktr_len = uap->len;
+	ktr_submitrequest(td, req);
+	return (0);
+#else /* !KTRACE */
+	return (ENOSYS);
+#endif /* KTRACE */
+}
+
 #ifdef KTRACE
 static int
 ktrops(td, p, ops, facs, vp)

Modified: projects/utrace2/sys/kern/syscalls.c
==============================================================================
--- projects/utrace2/sys/kern/syscalls.c	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/sys/kern/syscalls.c	Thu Jan 10 18:01:46 2013	(r245260)
@@ -540,4 +540,5 @@ const char *syscallnames[] = {
 	"posix_fallocate",			/* 530 = posix_fallocate */
 	"posix_fadvise",			/* 531 = posix_fadvise */
 	"wait6",			/* 532 = wait6 */
+	"utrace2",			/* 533 = utrace2 */
 };

Modified: projects/utrace2/sys/kern/syscalls.master
==============================================================================
--- projects/utrace2/sys/kern/syscalls.master	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/sys/kern/syscalls.master	Thu Jan 10 18:01:46 2013	(r245260)
@@ -955,5 +955,6 @@
 				    int *status, int options, \
 				    struct __wrusage *wrusage, \
 				    siginfo_t *info); }
+533	AUE_NULL	STD	{ int utrace2(const void *addr, size_t len); }
 ; Please copy any additions and changes to the following compatability tables:
 ; sys/compat/freebsd32/syscalls.master

Modified: projects/utrace2/sys/kern/systrace_args.c
==============================================================================
--- projects/utrace2/sys/kern/systrace_args.c	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/sys/kern/systrace_args.c	Thu Jan 10 18:01:46 2013	(r245260)
@@ -3286,6 +3286,14 @@ systrace_args(int sysnum, void *params, 
 		*n_args = 6;
 		break;
 	}
+	/* utrace2 */
+	case 533: {
+		struct utrace2_args *p = params;
+		uarg[0] = (intptr_t) p->addr; /* const void * */
+		uarg[1] = p->len; /* size_t */
+		*n_args = 2;
+		break;
+	}
 	default:
 		*n_args = 0;
 		break;
@@ -8745,6 +8753,19 @@ systrace_entry_setargdesc(int sysnum, in
 			break;
 		};
 		break;
+	/* utrace2 */
+	case 533:
+		switch(ndx) {
+		case 0:
+			p = "const void *";
+			break;
+		case 1:
+			p = "size_t";
+			break;
+		default:
+			break;
+		};
+		break;
 	default:
 		break;
 	};
@@ -10638,6 +10659,11 @@ systrace_return_setargdesc(int sysnum, i
 		if (ndx == 0 || ndx == 1)
 			p = "int";
 		break;
+	/* utrace2 */
+	case 533:
+		if (ndx == 0 || ndx == 1)
+			p = "int";
+		break;
 	default:
 		break;
 	};

Modified: projects/utrace2/sys/sys/ktrace.h
==============================================================================
--- projects/utrace2/sys/sys/ktrace.h	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/sys/sys/ktrace.h	Thu Jan 10 18:01:46 2013	(r245260)
@@ -216,6 +216,8 @@ struct ktr_faultend {
 	int result;
 };
 
+#define KTR_USER2	15
+
 /*
  * KTR_DROP - If this bit is set in ktr_type, then at least one event
  * between the previous record and this record was dropped.
@@ -240,6 +242,7 @@ struct ktr_faultend {
 #define KTRFAC_CAPFAIL	(1<<KTR_CAPFAIL)
 #define KTRFAC_FAULT	(1<<KTR_FAULT)
 #define KTRFAC_FAULTEND	(1<<KTR_FAULTEND)
+#define KTRFAC_USER2	(1<<KTR_USER2)
 
 /*
  * trace flags (also in p_traceflags)
@@ -277,8 +280,13 @@ void	ktrcapfail(enum ktr_cap_fail_type, 
 __BEGIN_DECLS
 int	ktrace(const char *, int, int, pid_t);
 int	utrace(const void *, size_t);
+int	utrace2(const void *, size_t);
 __END_DECLS
 
+#define	UTRACE_MALLOC		0x001
+#define UTRACE_SYSMAX		0x100
+#define UTRACE_APPLICATIONMIN	0x101
+
 #endif
 
 #endif

Modified: projects/utrace2/sys/sys/syscall.h
==============================================================================
--- projects/utrace2/sys/sys/syscall.h	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/sys/sys/syscall.h	Thu Jan 10 18:01:46 2013	(r245260)
@@ -452,4 +452,5 @@
 #define	SYS_posix_fallocate	530
 #define	SYS_posix_fadvise	531
 #define	SYS_wait6	532
-#define	SYS_MAXSYSCALL	533
+#define	SYS_utrace2	533
+#define	SYS_MAXSYSCALL	534

Modified: projects/utrace2/sys/sys/syscall.mk
==============================================================================
--- projects/utrace2/sys/sys/syscall.mk	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/sys/sys/syscall.mk	Thu Jan 10 18:01:46 2013	(r245260)
@@ -400,4 +400,5 @@ MIASM =  \
 	rctl_remove_rule.o \
 	posix_fallocate.o \
 	posix_fadvise.o \
-	wait6.o
+	wait6.o \
+	utrace2.o

Modified: projects/utrace2/sys/sys/sysproto.h
==============================================================================
--- projects/utrace2/sys/sys/sysproto.h	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/sys/sys/sysproto.h	Thu Jan 10 18:01:46 2013	(r245260)
@@ -1762,6 +1762,10 @@ struct wait6_args {
 	char wrusage_l_[PADL_(struct __wrusage *)]; struct __wrusage * wrusage; char wrusage_r_[PADR_(struct __wrusage *)];
 	char info_l_[PADL_(siginfo_t *)]; siginfo_t * info; char info_r_[PADR_(siginfo_t *)];
 };
+struct utrace2_args {
+	char addr_l_[PADL_(const void *)]; const void * addr; char addr_r_[PADR_(const void *)];
+	char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)];
+};
 int	nosys(struct thread *, struct nosys_args *);
 void	sys_sys_exit(struct thread *, struct sys_exit_args *);
 int	sys_fork(struct thread *, struct fork_args *);
@@ -2144,6 +2148,7 @@ int	sys_rctl_remove_rule(struct thread *
 int	sys_posix_fallocate(struct thread *, struct posix_fallocate_args *);
 int	sys_posix_fadvise(struct thread *, struct posix_fadvise_args *);
 int	sys_wait6(struct thread *, struct wait6_args *);
+int	sys_utrace2(struct thread *, struct utrace2_args *);
 
 #ifdef COMPAT_43
 
@@ -2840,6 +2845,7 @@ int	freebsd7_shmctl(struct thread *, str
 #define	SYS_AUE_posix_fallocate	AUE_NULL
 #define	SYS_AUE_posix_fadvise	AUE_NULL
 #define	SYS_AUE_wait6	AUE_WAIT6
+#define	SYS_AUE_utrace2	AUE_NULL
 
 #undef PAD_
 #undef PADL_

Modified: projects/utrace2/usr.bin/kdump/kdump.c
==============================================================================
--- projects/utrace2/usr.bin/kdump/kdump.c	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/usr.bin/kdump/kdump.c	Thu Jan 10 18:01:46 2013	(r245260)
@@ -83,6 +83,8 @@ extern int errno;
 #include "ktrace.h"
 #include "kdump_subr.h"
 
+struct utrace_malloc_v2;
+
 u_int abidump(struct ktr_header *);
 int fetchprocinfo(struct ktr_header *, u_int *);
 int fread_tail(void *, int, int);
@@ -96,9 +98,11 @@ void ktrgenio(struct ktr_genio *, int);
 void ktrpsig(struct ktr_psig *);
 void ktrcsw(struct ktr_csw *);
 void ktrcsw_old(struct ktr_csw_old *);
-void ktruser_malloc(unsigned char *);
+void ktruser_malloc(struct utrace_malloc_v2 *, int);
 void ktruser_rtld(int, unsigned char *);
-void ktruser(int, unsigned char *);
+void ktruser(int, void *);
+void ktruser2(size_t, void *);
+void ktruser_data(size_t, unsigned char *);
 void ktrsockaddr(struct sockaddr *);
 void ktrstat(struct stat *);
 void ktrstruct(char *, size_t);
@@ -321,6 +325,9 @@ main(int argc, char *argv[])
 		case KTR_FAULTEND:
 			ktrfaultend((struct ktr_faultend *)m);
 			break;
+		case KTR_USER2:
+			ktruser2(ktrlen, m);
+			break;
 		default:
 			printf("\n");
 			break;
@@ -469,6 +476,9 @@ dumpheader(struct ktr_header *kth)
 	case KTR_FAULTEND:
 		type = "PRET";
 		break;
+	case KTR_USER2:
+		type = "USR2";
+		break;
 	default:
 		sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
 		type = unknown;
@@ -1369,29 +1379,53 @@ ktruser_rtld(int len, unsigned char *p)
 	}
 }
 
-struct utrace_malloc {
-	void *p;
-	size_t s;
-	void *r;
+struct utrace_malloc_old {
+    void    *p;	/* Input pointer (as in realloc(p, s)). */
+    size_t  s;  /* Request size. */
+    void    *r;	/* Result pointer. */
+};
+
+struct utrace_malloc_v2 {
+    int	    utrace_type;    /* utrace type UTRACE_MALLOC */
+    int	    utrace_version;	/* utrace malloc version */
+    void    *p;	/* Input pointer (as in realloc(p, s)). */
+    size_t  s;  /* Request size. */
+    void    *r;	/* Result pointer. */
+    void    *caller;    /* Caller */
 };
 
 void
-ktruser_malloc(unsigned char *p)
+ktruser_malloc(struct utrace_malloc_v2 *ut, int v2)
 {
-	struct utrace_malloc *ut = (struct utrace_malloc *)p;
 
 	if (ut->p == (void *)(intptr_t)(-1))
-		printf("malloc_init()\n");
+		printf("malloc_init()");
 	else if (ut->s == 0)
-		printf("free(%p)\n", ut->p);
+		printf("free(%p)", ut->p);
 	else if (ut->p == NULL)
-		printf("%p = malloc(%zu)\n", ut->r, ut->s);
+		printf("%p = malloc(%zu)", ut->r, ut->s);
 	else
-		printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s);
+		printf("%p = realloc(%p, %zu)", ut->r, ut->p, ut->s);
+	if (v2)
+		printf(", caller %p", ut->caller);
+	putchar('\n');
 }
 
 void
-ktruser(int len, unsigned char *p)
+ktruser_data(size_t len, unsigned char *p)
+{
+
+	printf("%zd ", len);
+	while (len--)
+		if (decimal)
+			printf(" %d", *p++);
+		else
+			printf(" %02x", *p++);
+	printf("\n");
+}
+
+void
+ktruser(int len, void *p)
 {
 
 	if (len >= 8 && bcmp(p, "RTLD", 4) == 0) {
@@ -1399,18 +1433,60 @@ ktruser(int len, unsigned char *p)
 		return;
 	}
 
-	if (len == sizeof(struct utrace_malloc)) {
-		ktruser_malloc(p);
+	if (len == sizeof(struct utrace_malloc_old)) {
+		struct utrace_malloc_old *utm_old;
+		struct utrace_malloc_v2 utm_v2;
+
+		utm_old = p;
+		utm_v2.p = utm_old->p;
+		utm_v2.s = utm_old->s;
+		utm_v2.r = utm_old->r;
+		ktruser_malloc(&utm_v2, 0);
 		return;
 	}
 
-	printf("%d ", len);
-	while (len--)
-		if (decimal)
-			printf(" %d", *p++);
-		else
-			printf(" %02x", *p++);
-	printf("\n");
+	ktruser_data(len, p);
+}
+
+void
+ktruser2(size_t len, void *p)
+{
+	struct ktruser2_header {
+		int type;
+		int version;
+	} *ktru2_hd;
+
+	if (len < sizeof(struct ktruser2_header)) {
+		warnx("utrace2 size too small: %zd (want: %zd)",
+		    len, sizeof(struct ktruser2_header));
+		ktruser_data(len, p);
+		return;
+	}
+
+	ktru2_hd = p;
+	switch (ktru2_hd->type) {
+	case UTRACE_MALLOC:
+		if (ktru2_hd->version == 2) {
+			if (len == sizeof(struct utrace_malloc_v2)) {
+				ktruser_malloc(p, 1);
+				return;
+			}
+			warnx("ktruser2: UTRACE_MALLOC, version = 2, "
+			    "size incorrect %zd (want: %zd)",
+			    len, sizeof(struct utrace_malloc_v2));
+			ktruser_data(len, p);
+			return;
+		} else {
+			warnx("ktruser2: UTRACE_MALLOC, unknown version = %d, "
+			    "(want: %d)", ktru2_hd->version, 2);
+			ktruser_data(len, p);
+			return;
+		}
+	default:
+		break;
+	}
+	ktruser_data(len, p);
+	return;
 }
 
 void

Modified: projects/utrace2/usr.bin/ktrace/ktrace.h
==============================================================================
--- projects/utrace2/usr.bin/ktrace/ktrace.h	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/usr.bin/ktrace/ktrace.h	Thu Jan 10 18:01:46 2013	(r245260)
@@ -32,7 +32,8 @@
 
 #define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \
 		    KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_USER | \
-		    KTRFAC_STRUCT | KTRFAC_SYSCTL | KTRFAC_CAPFAIL)
+		    KTRFAC_STRUCT | KTRFAC_SYSCTL | KTRFAC_CAPFAIL | \
+		    KTRFAC_USER2)
 
 #define PROC_ABI_POINTS (KTRFAC_PROCCTOR | KTRFAC_PROCDTOR)
 

Modified: projects/utrace2/usr.bin/ktrace/subr.c
==============================================================================
--- projects/utrace2/usr.bin/ktrace/subr.c	Thu Jan 10 17:58:05 2013	(r245259)
+++ projects/utrace2/usr.bin/ktrace/subr.c	Thu Jan 10 18:01:46 2013	(r245260)
@@ -82,6 +82,9 @@ getpoints(char *s)
 		case 'u':
 			facs |= KTRFAC_USER;
 			break;
+		case 'U':
+			facs |= KTRFAC_USER2;
+			break;
 		case 'w':
 			facs |= KTRFAC_CSW;
 			break;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201301101801.r0AI1lb9081229>