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>