From e8e054045fba22e9ec4aed5849962bb56a43b665 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Tue, 16 Oct 2012 13:00:57 -0400 Subject: [PATCH] callsite: add "ip" context Add caller's instruction pointer context. Signed-off-by: Mathieu Desnoyers --- include/lttng/ringbuffer-config.h | 11 +++-- include/lttng/tracepoint.h | 9 +++- include/lttng/ust-abi.h | 1 + include/lttng/ust-events.h | 1 + include/lttng/ust-tracepoint-event.h | 1 + liblttng-ust/Makefile.am | 1 + liblttng-ust/lttng-context-ip.c | 73 ++++++++++++++++++++++++++++ liblttng-ust/lttng-ust-abi.c | 2 + 8 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 liblttng-ust/lttng-context-ip.c diff --git a/include/lttng/ringbuffer-config.h b/include/lttng/ringbuffer-config.h index 174906cb..ab5e9f99 100644 --- a/include/lttng/ringbuffer-config.h +++ b/include/lttng/ringbuffer-config.h @@ -193,7 +193,8 @@ struct lttng_ust_lib_ring_buffer_config { * UST. Fields need to be only added at the end, never reordered, never * removed. */ -#define LTTNG_UST_RING_BUFFER_CTX_PADDING 24 +#define LTTNG_UST_RING_BUFFER_CTX_PADDING \ + (24 - sizeof(int) - sizeof(void *)) struct lttng_ust_lib_ring_buffer_ctx { /* input received by lib_ring_buffer_reserve(), saved here. */ struct channel *chan; /* channel */ @@ -221,7 +222,9 @@ struct lttng_ust_lib_ring_buffer_ctx { */ uint64_t tsc; /* time-stamp counter value */ unsigned int rflags; /* reservation flags */ - char padding[LTTNG_UST_RING_BUFFER_CTX_PADDING]; + unsigned int padding1; /* padding to realign on pointer */ + void *ip; /* caller ip address */ + char padding2[LTTNG_UST_RING_BUFFER_CTX_PADDING]; }; /** @@ -251,7 +254,9 @@ void lib_ring_buffer_ctx_init(struct lttng_ust_lib_ring_buffer_ctx *ctx, ctx->cpu = cpu; ctx->rflags = 0; ctx->handle = handle; - memset(ctx->padding, 0, LTTNG_UST_RING_BUFFER_CTX_PADDING); + ctx->padding1 = 0; + ctx->ip = 0; + memset(ctx->padding2, 0, LTTNG_UST_RING_BUFFER_CTX_PADDING); } /* diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index 8e4704c4..7d98e22e 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -138,11 +138,16 @@ extern "C" { #define _TP_ARGS_DATA_VAR(...) _TP_DATA_VAR_N(_TP_NARGS(0, ##__VA_ARGS__), ##__VA_ARGS__) #define _TP_PARAMS(...) __VA_ARGS__ +/* + * The tracepoint cb is marked always inline so we can distinguish + * between caller's ip addresses within the probe using the return + * address. + */ #define _DECLARE_TRACEPOINT(_provider, _name, ...) \ extern struct tracepoint __tracepoint_##_provider##___##_name; \ -static inline lttng_ust_notrace \ +static inline __attribute__((always_inline)) lttng_ust_notrace \ void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__)); \ -static inline \ +static \ void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__)) \ { \ struct tracepoint_probe *__tp_probe; \ diff --git a/include/lttng/ust-abi.h b/include/lttng/ust-abi.h index c9be4bd9..2b3d402d 100644 --- a/include/lttng/ust-abi.h +++ b/include/lttng/ust-abi.h @@ -114,6 +114,7 @@ enum lttng_ust_context_type { LTTNG_UST_CONTEXT_VPID = 1, LTTNG_UST_CONTEXT_PTHREAD_ID = 2, LTTNG_UST_CONTEXT_PROCNAME = 3, + LTTNG_UST_CONTEXT_IP = 4, }; #define LTTNG_UST_CONTEXT_PADDING1 16 diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h index b0768357..ad4ee391 100644 --- a/include/lttng/ust-events.h +++ b/include/lttng/ust-events.h @@ -484,6 +484,7 @@ int lttng_add_vtid_to_ctx(struct lttng_ctx **ctx); int lttng_add_vpid_to_ctx(struct lttng_ctx **ctx); int lttng_add_pthread_id_to_ctx(struct lttng_ctx **ctx); int lttng_add_procname_to_ctx(struct lttng_ctx **ctx); +int lttng_add_ip_to_ctx(struct lttng_ctx **ctx); void lttng_context_vtid_reset(void); void lttng_context_vpid_reset(void); diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index 8f0db41f..da077b7c 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -493,6 +493,7 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)) \ __event_align = __event_get_align__##_provider##___##_name(_TP_ARGS_VAR(_args)); \ lib_ring_buffer_ctx_init(&__ctx, __chan->chan, __event, __event_len, \ __event_align, -1, __chan->handle); \ + __ctx.ip = __builtin_return_address(0); \ __ret = __chan->ops->event_reserve(&__ctx, __event->id); \ if (__ret < 0) \ return; \ diff --git a/liblttng-ust/Makefile.am b/liblttng-ust/Makefile.am index dff8b6e9..74963318 100644 --- a/liblttng-ust/Makefile.am +++ b/liblttng-ust/Makefile.am @@ -26,6 +26,7 @@ liblttng_ust_runtime_la_SOURCES = \ lttng-context-vpid.c \ lttng-context-pthread-id.c \ lttng-context-procname.c \ + lttng-context-ip.c \ ltt-context.c \ ltt-events.c \ lttng-filter.c \ diff --git a/liblttng-ust/lttng-context-ip.c b/liblttng-ust/lttng-context-ip.c new file mode 100644 index 00000000..168e5cd8 --- /dev/null +++ b/liblttng-ust/lttng-context-ip.c @@ -0,0 +1,73 @@ +/* + * lttng-context-ip.c + * + * LTTng UST Instruction Pointer Context. + * + * Copyright (C) 2009-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 +#include +#include + +static +size_t ip_get_size(size_t offset) +{ + size_t size = 0; + + size += lib_ring_buffer_align(offset, lttng_alignof(void *)); + size += sizeof(void *); + return size; +} + +static +void ip_record(struct lttng_ctx_field *field, + struct lttng_ust_lib_ring_buffer_ctx *ctx, + struct ltt_channel *chan) +{ + void *ip; + + ip = ctx->ip; + lib_ring_buffer_align_ctx(ctx, lttng_alignof(ip)); + chan->ops->event_write(ctx, &ip, sizeof(ip)); +} + +int lttng_add_ip_to_ctx(struct lttng_ctx **ctx) +{ + struct lttng_ctx_field *field; + + field = lttng_append_context(ctx); + if (!field) + return -ENOMEM; + if (lttng_find_context(*ctx, "ip")) { + lttng_remove_context_field(ctx, field); + return -EEXIST; + } + field->event_field.name = "ip"; + field->event_field.type.atype = atype_integer; + field->event_field.type.u.basic.integer.size = sizeof(void *) * CHAR_BIT; + field->event_field.type.u.basic.integer.alignment = lttng_alignof(void *) * CHAR_BIT; + field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(void *); + field->event_field.type.u.basic.integer.reverse_byte_order = 0; + field->event_field.type.u.basic.integer.base = 16; + field->event_field.type.u.basic.integer.encoding = lttng_encode_none; + field->get_size = ip_get_size; + field->record = ip_record; + return 0; +} diff --git a/liblttng-ust/lttng-ust-abi.c b/liblttng-ust/lttng-ust-abi.c index 61d37ac8..4eb40959 100644 --- a/liblttng-ust/lttng-ust-abi.c +++ b/liblttng-ust/lttng-ust-abi.c @@ -286,6 +286,8 @@ long lttng_abi_add_context(int objd, return lttng_add_vpid_to_ctx(ctx); case LTTNG_UST_CONTEXT_PROCNAME: return lttng_add_procname_to_ctx(ctx); + case LTTNG_UST_CONTEXT_IP: + return lttng_add_ip_to_ctx(ctx); default: return -EINVAL; } -- 2.34.1