From df26e399aa077b14fb965be866012bccf2847bae Mon Sep 17 00:00:00 2001 From: des Date: Sat, 23 Feb 2008 01:01:49 +0000 Subject: This patch adds a new ktrace(2) record type, KTR_STRUCT, whose payload consists of the null-terminated name and the contents of any structure you wish to record. A new ktrstruct() function constructs and emits a KTR_STRUCT record. It is accompanied by convenience macros for struct stat and struct sockaddr. In kdump(1), KTR_STRUCT records are handled by a dispatcher function that runs stringent sanity checks on its contents before handing it over to individual decoding funtions for each type of structure. Currently supported structures are struct stat and struct sockaddr for the AF_INET, AF_INET6 and AF_UNIX families; support for AF_APPLETALK and AF_IPX is present but disabled, as I am unable to test it properly. Since 's' was already taken, the letter 't' is used by ktrace(1) to enable KTR_STRUCT trace points, and in kdump(1) to enable their decoding. Derived from patches by Andrew Li . PR: kern/117836 MFC after: 3 weeks --- sys/kern/kern_ktrace.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'sys/kern/kern_ktrace.c') diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index f5385ea..c8e4451 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -51,6 +51,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include #include #include @@ -107,7 +109,8 @@ static int data_lengths[] = { sizeof(struct ktr_genio), /* KTR_GENIO */ sizeof(struct ktr_psig), /* KTR_PSIG */ sizeof(struct ktr_csw), /* KTR_CSW */ - 0 /* KTR_USER */ + 0, /* KTR_USER */ + 0, /* KTR_STRUCT */ }; static STAILQ_HEAD(, ktr_request) ktr_free; @@ -552,6 +555,33 @@ ktrcsw(out, user) kc->user = user; ktr_enqueuerequest(curthread, req); } + +void +ktrstruct(name, namelen, data, datalen) + const char *name; + size_t namelen; + void *data; + size_t datalen; +{ + struct ktr_request *req; + char *buf = NULL; + size_t buflen; + + if (!data) + datalen = 0; + buflen = namelen + 1 + datalen; + buf = malloc(buflen, M_KTRACE, M_WAITOK); + bcopy(name, buf, namelen); + buf[namelen] = '\0'; + bcopy(data, buf + namelen + 1, datalen); + if ((req = ktr_getrequest(KTR_STRUCT)) == NULL) { + free(buf, M_KTRACE); + return; + } + req->ktr_buffer = buf; + req->ktr_header.ktr_len = buflen; + ktr_submitrequest(curthread, req); +} #endif /* KTRACE */ /* Interface and common routines */ -- cgit v1.1