From owner-svn-src-projects@FreeBSD.ORG Thu Jan 10 18:01:50 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 09AA0C9; Thu, 10 Jan 2013 18:01:50 +0000 (UTC) (envelope-from alfred@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id E2198D7D; Thu, 10 Jan 2013 18:01:49 +0000 (UTC) Received: from svn.freebsd.org (svn.FreeBSD.org [8.8.178.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r0AI1nm8081251; Thu, 10 Jan 2013 18:01:49 GMT (envelope-from alfred@svn.freebsd.org) Received: (from alfred@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id r0AI1lb9081229; Thu, 10 Jan 2013 18:01:47 GMT (envelope-from alfred@svn.freebsd.org) Message-Id: <201301101801.r0AI1lb9081229@svn.freebsd.org> From: Alfred Perlstein Date: Thu, 10 Jan 2013 18:01:47 +0000 (UTC) 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 X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 10 Jan 2013 18:01:50 -0000 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_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;