svn commit: r245260 - in projects/utrace2: lib/libc/sys sys/compat/freebsd32 sys/kern sys/sys usr.bin/kdump usr.bin/ktrace
Alfred Perlstein
alfred at FreeBSD.org
Thu Jan 10 18:01:50 UTC 2013
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;
More information about the svn-src-projects
mailing list