From mboxrd@z Thu Jan 1 00:00:00 1970 From: simon.marchi@ericsson.com (Simon Marchi) Date: Tue, 4 Oct 2016 17:07:05 -0400 Subject: [lttng-dev] [PATCH lttng-modules v2] Add support for i2c tracepoints Message-ID: <20161004210705.20488-1-simon.marchi@ericsson.com> New in v2: * Add module parameter (extract_sensitive_payload) to control the extraction of possibly sensitive data from events. This patch teaches lttng-modules about the i2c tracepoints in the Linux kernel. It contains the following tracepoints: * i2c_write * i2c_read * i2c_reply * i2c_result I translated the fields and assignments from the kernel's include/trace/events/i2c.h as well as I could. I also tried building this module against a kernel without CONFIG_I2C, and it built fine (the required types are unconditionally defined). So I don't think any "#if CONFIG_I2C" or similar are required. Signed-off-by: Simon Marchi --- instrumentation/events/lttng-module/i2c.h | 124 ++++++++++++++++++++++++++++++ probes/Kbuild | 1 + probes/lttng-probe-i2c.c | 54 +++++++++++++ 3 files changed, 179 insertions(+) create mode 100644 instrumentation/events/lttng-module/i2c.h create mode 100644 probes/lttng-probe-i2c.c diff --git a/instrumentation/events/lttng-module/i2c.h b/instrumentation/events/lttng-module/i2c.h new file mode 100644 index 0000000..8ca12f9 --- /dev/null +++ b/instrumentation/events/lttng-module/i2c.h @@ -0,0 +1,124 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM i2c + +#if !defined(LTTNG_TRACE_I2C_H) || defined(TRACE_HEADER_MULTI_READ) +#define LTTNG_TRACE_I2C_H + +#include + +#ifndef _TRACE_I2C_DEF_ +#define _TRACE_I2C_DEF_ + +#endif /* _TRACE_I2C_DEF_ */ + +/* + * __i2c_transfer() write request + */ +LTTNG_TRACEPOINT_EVENT_CODE(i2c_write, + + TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg, + int num), + + TP_ARGS(adap, msg, num), + + TP_locvar( + int extract_sensitive_payload; + ), + + TP_code_pre( + tp_locvar->extract_sensitive_payload + = ACCESS_ONCE(extract_sensitive_payload); + ), + + TP_FIELDS( + ctf_integer(int, adapter_nr, adap->nr) + ctf_integer(__u16, msg_nr, num) + ctf_integer(__u16, addr, msg->addr) + ctf_integer(__u16, flags, msg->flags) + ctf_integer(__u16, len, msg->len) + ctf_sequence_hex(__u8, buf, + tp_locvar->extract_sensitive_payload ? + msg->buf : NULL, + __u16, + tp_locvar->extract_sensitive_payload ? + msg->len : 0) + ), + + TP_code_post() +) + +/* + * __i2c_transfer() read request + */ +LTTNG_TRACEPOINT_EVENT(i2c_read, + + TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg, + int num), + + TP_ARGS(adap, msg, num), + + TP_FIELDS( + ctf_integer(int, adapter_nr, adap->nr) + ctf_integer(__u16, msg_nr, num) + ctf_integer(__u16, addr, msg->addr) + ctf_integer(__u16, flags, msg->flags) + ctf_integer(__u16, len, msg->len) + ) +) + +/* + * __i2c_transfer() read reply + */ +LTTNG_TRACEPOINT_EVENT_CODE(i2c_reply, + + TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg, + int num), + + TP_ARGS(adap, msg, num), + + TP_locvar( + int extract_sensitive_payload; + ), + + TP_code_pre( + tp_locvar->extract_sensitive_payload + = ACCESS_ONCE(extract_sensitive_payload); + ), + + TP_FIELDS( + ctf_integer(int, adapter_nr, adap->nr) + ctf_integer(__u16, msg_nr, num) + ctf_integer(__u16, addr, msg->addr) + ctf_integer(__u16, flags, msg->flags) + ctf_integer(__u16, len, msg->len) + ctf_sequence_hex(__u8, buf, + tp_locvar->extract_sensitive_payload ? + msg->buf : NULL, + __u16, + tp_locvar->extract_sensitive_payload ? + msg->len : 0) + ), + + TP_code_post() +) + +/* + * __i2c_transfer() result + */ +LTTNG_TRACEPOINT_EVENT(i2c_result, + + TP_PROTO(const struct i2c_adapter *adap, int num, int ret), + + TP_ARGS(adap, num, ret), + + TP_FIELDS( + ctf_integer(int, adapter_nr, adap->nr) + ctf_integer(__u16, nr_msgs, num) + ctf_integer(__s16, ret, ret) + ) +) + +#endif /* LTTNG_TRACE_I2C_H */ + +/* This part must be outside protection */ +#include diff --git a/probes/Kbuild b/probes/Kbuild index 8ae9a6b..ca7c0b1 100644 --- a/probes/Kbuild +++ b/probes/Kbuild @@ -5,6 +5,7 @@ include $(TOP_LTTNG_MODULES_DIR)/Makefile.ABI.workarounds ccflags-y += -I$(TOP_LTTNG_MODULES_DIR) obj-$(CONFIG_LTTNG) += lttng-probe-sched.o +obj-$(CONFIG_LTTNG) += lttng-probe-i2c.o obj-$(CONFIG_LTTNG) += lttng-probe-irq.o obj-$(CONFIG_LTTNG) += lttng-probe-timer.o obj-$(CONFIG_LTTNG) += lttng-probe-kmem.o diff --git a/probes/lttng-probe-i2c.c b/probes/lttng-probe-i2c.c new file mode 100644 index 0000000..a14d91c --- /dev/null +++ b/probes/lttng-probe-i2c.c @@ -0,0 +1,54 @@ +/* + * probes/lttng-probe-i2c.c + * + * LTTng i2c probes. + * + * Copyright (C) 2012 Mathieu Desnoyers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include + +/* + * Create the tracepoint static inlines from the kernel to validate that our + * trace event macros match the kernel we run on. + */ +#include + +/* + * Create LTTng tracepoint probes. + */ +#define LTTNG_PACKAGE_BUILD +#define CREATE_TRACE_POINTS +#define TRACE_INCLUDE_PATH instrumentation/events/lttng-module + +static int extract_sensitive_payload = 0; +module_param(extract_sensitive_payload, int, 0644); +MODULE_PARM_DESC(extract_sensitive_payload, + "Whether to extract possibly sensitive data from events (i2c " + "buffer contents) or not (1 or 0, default: 0)."); + +#include + +MODULE_LICENSE("GPL and additional rights"); +MODULE_AUTHOR("Mathieu Desnoyers "); +MODULE_DESCRIPTION("LTTng i2c probes"); +MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "." + __stringify(LTTNG_MODULES_MINOR_VERSION) "." + __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION) + LTTNG_MODULES_EXTRAVERSION); -- 2.10.1