void ktrsyscall(struct lwp *lp, int code, int narg, register_t args[]) { struct ktr_header kth; struct ktr_syscall ktp_cache; struct ktr_syscall *ktp; register_t *argp; int i; /* * Setting the active bit prevents a ktrace recursion from the * ktracing op itself. */ lp->lwp_traceflag |= KTRFAC_ACTIVE; ktrgetheader(&kth, KTR_SYSCALL); ktp = ktrgetsyscall(&kth, &ktp_cache, narg); ktp->ktr_code = code; ktp->ktr_narg = narg; argp = &ktp->ktr_args[0]; for (i = 0; i < narg; i++) *argp++ = args[i]; ktrwrite(lp, &kth, NULL); ktrputsyscall(&ktp_cache, ktp); lp->lwp_traceflag &= ~KTRFAC_ACTIVE; }
void ktrsyscall(struct lwp *lp, int code, int narg, register_t args[]) { struct ktr_header *kth; struct ktr_syscall *ktp; int len; register_t *argp; int i; len = offsetof(struct ktr_syscall, ktr_args) + (narg * sizeof(register_t)); /* * Setting the active bit prevents a ktrace recursion from the * ktracing op itself. */ lp->lwp_traceflag |= KTRFAC_ACTIVE; kth = ktrgetheader(KTR_SYSCALL); ktp = kmalloc(len, M_KTRACE, M_WAITOK); ktp->ktr_code = code; ktp->ktr_narg = narg; argp = &ktp->ktr_args[0]; for (i = 0; i < narg; i++) *argp++ = args[i]; kth->ktr_buf = (caddr_t)ktp; kth->ktr_len = len; ktrwrite(lp, kth, NULL); kfree(ktp, M_KTRACE); kfree(kth, M_KTRACE); lp->lwp_traceflag &= ~KTRFAC_ACTIVE; }
void ktrnamei(struct lwp *lp, char *path) { struct ktr_header kth; lp->lwp_traceflag |= KTRFAC_ACTIVE; ktrgetheader(&kth, KTR_NAMEI); kth.ktr_len = (int)strlen(path); kth.ktr_buf = path; ktrwrite(lp, &kth, NULL); lp->lwp_traceflag &= ~KTRFAC_ACTIVE; }
void ktrnamei(struct lwp *lp, char *path) { struct ktr_header *kth; lp->lwp_traceflag |= KTRFAC_ACTIVE; kth = ktrgetheader(KTR_NAMEI); kth->ktr_len = strlen(path); kth->ktr_buf = path; ktrwrite(lp, kth, NULL); kfree(kth, M_KTRACE); lp->lwp_traceflag &= ~KTRFAC_ACTIVE; }
void ktrcsw(struct lwp *lp, int out, int user) { struct ktr_header kth; struct ktr_csw kc; lp->lwp_traceflag |= KTRFAC_ACTIVE; ktrgetheader(&kth, KTR_CSW); kc.out = out; kc.user = user; kth.ktr_buf = (caddr_t)&kc; kth.ktr_len = (int)sizeof(struct ktr_csw); ktrwrite(lp, &kth, NULL); lp->lwp_traceflag &= ~KTRFAC_ACTIVE; }
void ktrcsw(struct lwp *lp, int out, int user) { struct ktr_header *kth; struct ktr_csw kc; lp->lwp_traceflag |= KTRFAC_ACTIVE; kth = ktrgetheader(KTR_CSW); kc.out = out; kc.user = user; kth->ktr_buf = (caddr_t)&kc; kth->ktr_len = sizeof (struct ktr_csw); ktrwrite(lp, kth, NULL); kfree(kth, M_KTRACE); lp->lwp_traceflag &= ~KTRFAC_ACTIVE; }
void ktrpsig(struct lwp *lp, int sig, sig_t action, sigset_t *mask, int code) { struct ktr_header kth; struct ktr_psig kp; lp->lwp_traceflag |= KTRFAC_ACTIVE; ktrgetheader(&kth, KTR_PSIG); kp.signo = (char)sig; kp.action = action; kp.mask = *mask; kp.code = code; kth.ktr_buf = (caddr_t)&kp; kth.ktr_len = (int)sizeof(struct ktr_psig); ktrwrite(lp, &kth, NULL); lp->lwp_traceflag &= ~KTRFAC_ACTIVE; }
void ktrgenio(struct lwp *lp, int fd, enum uio_rw rw, struct uio *uio, int error) { struct ktr_header kth; struct ktr_genio ktg; if (error) return; lp->lwp_traceflag |= KTRFAC_ACTIVE; ktrgetheader(&kth, KTR_GENIO); ktg.ktr_fd = fd; ktg.ktr_rw = rw; kth.ktr_buf = (caddr_t)&ktg; kth.ktr_len = (int)sizeof(struct ktr_genio); uio->uio_offset = 0; uio->uio_rw = UIO_WRITE; ktrwrite(lp, &kth, uio); lp->lwp_traceflag &= ~KTRFAC_ACTIVE; }
void ktrsysret(struct lwp *lp, int code, int error, register_t retval) { struct ktr_header kth; struct ktr_sysret ktp; lp->lwp_traceflag |= KTRFAC_ACTIVE; ktrgetheader(&kth, KTR_SYSRET); ktp.ktr_code = code; ktp.ktr_error = error; if (error == 0) ktp.ktr_retval = retval; /* what about val2 ? */ else ktp.ktr_retval = 0; kth.ktr_buf = (caddr_t)&ktp; kth.ktr_len = (int)sizeof(struct ktr_sysret); ktrwrite(lp, &kth, NULL); lp->lwp_traceflag &= ~KTRFAC_ACTIVE; }