예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}
예제 #4
0
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;
}
예제 #5
0
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;
}
예제 #6
0
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;
}
예제 #7
0
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;
}
예제 #8
0
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;
}
예제 #9
0
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;
}