[DTrace-devel] [PATCH 1/2] Replace dt_variable_read()

Kris Van Hees kris.van.hees at oracle.com
Sat Sep 23 19:14:07 UTC 2023


The dt_variable_read() function is only used in a few placed, all of
them involving reading data from a data record.  Callers adjust the
base address using the record offset, and then pass in the data size
from the record as well.  The new dt_read_scalar() function takes a
base address and a pointer to a record descriptor which is more in
line with the nature of data record descriptors.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_consume.c | 43 +++++++++++++++++++++++++++++-------------
 libdtrace/dt_impl.h    |  2 --
 libdtrace/dt_subr.c    | 23 ----------------------
 3 files changed, 30 insertions(+), 38 deletions(-)

diff --git a/libdtrace/dt_consume.c b/libdtrace/dt_consume.c
index a67c0f7b..5054533b 100644
--- a/libdtrace/dt_consume.c
+++ b/libdtrace/dt_consume.c
@@ -506,6 +506,31 @@ dt_nullrec()
 	return DTRACE_CONSUME_NEXT;
 }
 
+int
+dt_read_scalar(caddr_t addr, const dtrace_recdesc_t *rec, uint64_t *valp)
+{
+	addr += rec->dtrd_offset;
+
+	switch (rec->dtrd_size) {
+	case sizeof(uint64_t):
+		*valp = *((uint64_t *)addr);
+		break;
+	case sizeof(uint32_t):
+		*valp = *((uint32_t *)addr);
+		break;
+	case sizeof(uint16_t):
+		*valp = *((uint16_t *)addr);
+		break;
+	case sizeof(uint8_t):
+		*valp = *((uint8_t *)addr);
+		break;
+	default:
+		return -1;
+	}
+
+	return 0;
+}
+
 int
 dt_print_quantline(dtrace_hdl_t *dtp, FILE *fp, int64_t val,
     uint64_t normal, long double total, char positives, char negatives)
@@ -1017,7 +1042,6 @@ dt_print_tracemem(dtrace_hdl_t *dtp, FILE *fp, const dtrace_recdesc_t *rec,
 	if (arg == DTRACE_TRACEMEM_DYNAMIC) {
 		const dtrace_recdesc_t *drec;
 		uint64_t darg;
-		caddr_t daddr;
 		uint64_t dsize;
 		int dpositive;
 
@@ -1026,14 +1050,13 @@ dt_print_tracemem(dtrace_hdl_t *dtp, FILE *fp, const dtrace_recdesc_t *rec,
 
 		drec = rec + 1;
 		darg = drec->dtrd_arg;
-		daddr = buf + drec->dtrd_offset;
 
 		if (drec->dtrd_action != DTRACEACT_TRACEMEM ||
 		    (darg != DTRACE_TRACEMEM_SIZE &&
 		    darg != DTRACE_TRACEMEM_SSIZE))
 			return dt_set_errno(dtp, EDT_TRACEMEM);
 
-		if (dt_variable_read(daddr, drec->dtrd_size, &dsize) < 0)
+		if (dt_read_scalar(buf, drec, &dsize) < 0)
 			return dt_set_errno(dtp, EDT_TRACEMEM);
 
 		dpositive = drec->dtrd_arg == DTRACE_TRACEMEM_SIZE ||
@@ -1407,16 +1430,14 @@ int
 dt_print_pcap(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec,
 	      const caddr_t buf)
 {
-	caddr_t	paddr, addr;
-	const dtrace_recdesc_t *prec;
+	caddr_t	addr;
 	uint64_t time, proto, pktlen, maxlen;
 	const char *filename;
 
 	addr = (caddr_t)buf + rec->dtrd_offset;
 
-	if (dt_variable_read(addr, sizeof(uint64_t), &time) < 0 ||
-	    dt_variable_read(addr + sizeof(uint64_t), sizeof(uint64_t),
-	    &pktlen) < 0)
+	if (dt_read_scalar(buf, rec, &time) < 0 ||
+	    dt_read_scalar(buf + sizeof(uint64_t), rec, &pktlen) < 0)
 		return dt_set_errno(dtp, EDT_PCAP);
 
 	if (pktlen == 0) {
@@ -1427,11 +1448,7 @@ dt_print_pcap(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec,
 	}
 	maxlen = DT_PCAPSIZE(dtp->dt_options[DTRACEOPT_PCAPSIZE]);
 
-	prec = rec + 1;
-
-	paddr = (caddr_t)buf + prec->dtrd_offset;
-
-	if (dt_variable_read(paddr, prec->dtrd_size, &proto) < 0)
+	if (dt_read_scalar(buf, rec + 1, &proto) < 0)
 		return dt_set_errno(dtp, EDT_PCAP);
 
 	/*
diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
index 674905b9..f6025817 100644
--- a/libdtrace/dt_impl.h
+++ b/libdtrace/dt_impl.h
@@ -863,8 +863,6 @@ extern int dt_handle_setopt(dtrace_hdl_t *, dtrace_setoptdata_t *);
 extern int dt_lib_depend_add(dtrace_hdl_t *, dt_list_t *, const char *);
 extern dt_lib_depend_t *dt_lib_depend_lookup(dt_list_t *, const char *);
 
-extern int dt_variable_read(caddr_t, size_t, uint64_t *);
-
 extern dt_pcb_t *yypcb;		/* pointer to current parser control block */
 extern char yyintprefix;	/* int token prefix for macros (+/-) */
 extern char yyintsuffix[4];	/* int token suffix ([uUlL]*) */
diff --git a/libdtrace/dt_subr.c b/libdtrace/dt_subr.c
index 4b6b525f..d6aad763 100644
--- a/libdtrace/dt_subr.c
+++ b/libdtrace/dt_subr.c
@@ -934,29 +934,6 @@ dtrace_uaddr2str(dtrace_hdl_t *dtp, pid_t pid, uint64_t addr, char *str,
 	return dt_string2str(c, str, nbytes);
 }
 
-int
-dt_variable_read(caddr_t addr, size_t size, uint64_t *valp)
-{
-	switch (size) {
-	case sizeof(uint8_t):
-		*valp = *((uint8_t *)(uintptr_t)addr);
-		break;
-	case sizeof(uint16_t):
-		*valp = *((uint16_t *)(uintptr_t)addr);
-		break;
-	case sizeof(uint32_t):
-		*valp = *((uint32_t *)(uintptr_t)addr);
-		break;
-	case sizeof(uint64_t):
-		*valp = *((uint64_t *)(uintptr_t)addr);
-		break;
-	default:
-		return -1;
-	}
-
-	return 0;
-}
-
 /*
  * The function converts string representation of kernel version
  * into the dt_version_t type.
-- 
2.40.1




More information about the DTrace-devel mailing list