diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -354,7 +354,11 @@ exec_args_get_begin_envv(args) - args->begin_argv); AUDIT_ARG_ENVV(exec_args_get_begin_envv(args), args->envc, args->endp - exec_args_get_begin_envv(args)); - +#ifdef KTRACE + if (KTRPOINT(td, KTR_ARGS)) { + ktrargs(args); + } +#endif /* Must have at least one argument. */ if (args->argc == 0) { exec_free_args(args); diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -124,6 +124,7 @@ [KTR_FAULT] = sizeof(struct ktr_fault), [KTR_FAULTEND] = sizeof(struct ktr_faultend), [KTR_STRUCT_ARRAY] = sizeof(struct ktr_struct_array), + [KTR_ARGS] = 0, }; static STAILQ_HEAD(, ktr_request) ktr_free; @@ -559,6 +560,33 @@ ktr_submitrequest(curthread, req); } +void +ktrargs(struct image_args *args) +{ + struct ktr_request *req; + int argc = exec_args_get_begin_envv(args) - args->begin_argv; + char* argv = malloc(argc + 1, M_KTRACE, M_WAITOK); + bcopy(args->begin_argv, argv, argc); + bcopy("\0", argv + argc, 1); + int envc = args->endp - exec_args_get_begin_envv(args); + char* envv = malloc(envc + 1, M_KTRACE, M_WAITOK); + bcopy(exec_args_get_begin_envv(args), envv, envc); + bcopy("\0", envv + envc, 1); + char* buf = malloc(argc + envc + 2, M_KTRACE, M_WAITOK); + bcopy(argv, buf, argc + 1); + bcopy(envv, buf + argc + 2, envc + 1); + req = ktr_getrequest(KTR_ARGS); + if (req == NULL) { + if (buf != NULL) + free(buf, M_KTRACE); + return; + } + req->ktr_header.ktr_len = argc + envc + 2; + req->ktr_buffer = buf; + ktr_submitrequest(curthread, req); +} + + void ktrsysret(int code, int error, register_t retval) { diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h --- a/sys/sys/ktrace.h +++ b/sys/sys/ktrace.h @@ -37,6 +37,10 @@ #include #include #include +#ifndef _KERNEL +#include +#endif +#include /* * operations to ktrace system call (KTROP(op)) @@ -263,6 +267,8 @@ */ }; +#define KTR_ARGS 16 + /* * KTR_DROP - If this bit is set in ktr_type, then at least one event * between the previous record and this record was dropped. @@ -295,6 +301,7 @@ #define KTRFAC_FAULT (1<%u", rem); } +void +ktrargs(struct image_args* args, int num) +{ + printf("Entered ktrargs in userspace, beginning of argv is %s and len is %d\n", args->begin_argv, num); +} + static void decode_fileflags(fflags_t value) { @@ -515,6 +522,9 @@ case KTR_STRUCT_ARRAY: ktrstructarray((struct ktr_struct_array *)m, ktrlen); break; + case KTR_ARGS: + ktrargs((struct image_args*)m, ktrlen); + break; default: printf("\n"); break; diff --git a/usr.bin/ktrace/ktrace.h b/usr.bin/ktrace/ktrace.h --- a/usr.bin/ktrace/ktrace.h +++ b/usr.bin/ktrace/ktrace.h @@ -31,7 +31,8 @@ #define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \ KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_USER | \ - KTRFAC_STRUCT | KTRFAC_SYSCTL | KTRFAC_STRUCT_ARRAY) + KTRFAC_STRUCT | KTRFAC_SYSCTL | KTRFAC_STRUCT_ARRAY | \ + KTRFAC_ARGS) #define PROC_ABI_POINTS (KTRFAC_PROCCTOR | KTRFAC_PROCDTOR)