|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 2/8] lib/ukdebug: Register a tracepoint
Hi Yuri,
Please see my comments inline.
On 5/10/19 9:29 PM, Yuri Volchkov wrote:
> Create a 'special' section .uk_tracepoints_list, where we will be
> storing static definitions of tracepoints. This section is need only
> offline, so it will exist only in *.dbg image.
>
> Signed-off-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx>
> ---
> lib/ukdebug/Config.uk | 9 ++++
> lib/ukdebug/Makefile.uk | 3 ++
> lib/ukdebug/extra.ld | 23 +++++++++
> lib/ukdebug/include/uk/trace.h | 88 ++++++++++++++++++++++++++++++++++
> 4 files changed, 123 insertions(+)
> create mode 100644 lib/ukdebug/extra.ld
>
> diff --git a/lib/ukdebug/Config.uk b/lib/ukdebug/Config.uk
> index 746ac3de..ab238aa0 100644
> --- a/lib/ukdebug/Config.uk
> +++ b/lib/ukdebug/Config.uk
> @@ -75,4 +75,13 @@ config LIBUKDEBUG_ENABLE_ASSERT
> help
> Build code with assertions.
>
> +menuconfig LIBUKDEBUG_TRACEPOINTS
> + bool "enable tracepoints"
If there will be a v2, please properly edit this string, inline with the
other config options of Unikraft.
> + default n
> +if LIBUKDEBUG_TRACEPOINTS
> +config LIBUKDEBUG_ALL_TRACEPOINTS
> + bool "enable all tracepoints at once"
> + default n
> +endif
> +
> endif
> diff --git a/lib/ukdebug/Makefile.uk b/lib/ukdebug/Makefile.uk
> index 4aaa5189..abc340dd 100644
> --- a/lib/ukdebug/Makefile.uk
> +++ b/lib/ukdebug/Makefile.uk
> @@ -8,3 +8,6 @@ LIBUKDEBUG_CXXFLAGS-y += -D__IN_LIBUKDEBUG__
>
> LIBUKDEBUG_SRCS-y += $(LIBUKDEBUG_BASE)/print.c
> LIBUKDEBUG_SRCS-y += $(LIBUKDEBUG_BASE)/hexdump.c
> +
> +EXTRA_LD_SCRIPT-$(CONFIG_LIBVFSCORE) += $(LIBUKDEBUG_BASE)/extra.ld
> +STRIP_SECTIONS_FLAGS-$(CONFIG_LIBUKDEBUG_TRACEPOINTS) += -R
> .uk_tracepoints_list
> diff --git a/lib/ukdebug/extra.ld b/lib/ukdebug/extra.ld
> new file mode 100644
> index 00000000..43154f9d
> --- /dev/null
> +++ b/lib/ukdebug/extra.ld
> @@ -0,0 +1,23 @@
> +SECTIONS
> +{
> + .uk_tracepoints_list : {
> + uk_tracepoints_start = .;
> + KEEP (*(.uk_tracepoints_list));
> + uk_tracepoints_end = .;
> + }
> +}
> +
> +/* We do not want these section to be in the final image, they are
> + * needed only offline. Solution is obvious - ask the build system to
> + * strip them together with debug symbols.
> + *
> + * However, we need to put them at them somewhere close to the end of
> + * the elf, otherwise strip operation will make a hole in the address
> + * space. More then that, they have to reside _after_ the '_end'
> + * symbol.
> + *
> + * The trick is to allocate the sections after the '.comment'
> + * section. The other way would have been allocating a dummy section
> + * '.cut_here', but linker drops it if there is nothing in it.
> + */
> +INSERT AFTER .comment;
> diff --git a/lib/ukdebug/include/uk/trace.h b/lib/ukdebug/include/uk/trace.h
> index 3e17b30e..34f0ed61 100644
> --- a/lib/ukdebug/include/uk/trace.h
> +++ b/lib/ukdebug/include/uk/trace.h
> @@ -34,6 +34,16 @@
>
> #ifndef _UK_TRACE_H_
> #define _UK_TRACE_H_
> +#include <uk/essentials.h>
> +#include <stdint.h>
> +
> +#define UK_TP_DEF_MAGIC 0x65645054 /* TPde */
> +
> +enum __uk_trace_arg_type {
> + __UK_TRACE_ARG_INT = 0,
> + __UK_TRACE_ARG_STRING = 1,
> +};
> +
> /* TODO: consider to move UK_CONCAT into public headers */
> #define __UK_CONCAT_X(a, b) a##b
> #define UK_CONCAT(a, b) __UK_CONCAT_X(a, b)
> @@ -41,6 +51,13 @@
> #define __UK_NARGS_X(a, b, c, d, e, f, g, h, n, ...) n
> #define UK_NARGS(...) __UK_NARGS_X(, ##__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0)
>
> +#define __UK_TRACE_GET_TYPE(arg) ( \
> + __builtin_types_compatible_p(typeof(arg), const char *) * \
> + __UK_TRACE_ARG_STRING + \
> + __builtin_types_compatible_p(typeof(arg), char *) * \
> + __UK_TRACE_ARG_STRING + \
> + 0)
Do we really need this +0 ?
> +
> #define __UK_GET_ARG1(a1, ...) a1
> #define __UK_GET_ARG2(a1, a2, ...) a2
> #define __UK_GET_ARG3(a1, a2, a3, ...) a3
> @@ -73,4 +90,75 @@
> #define UK_FOREACH(n, f, ...) \
> UK_CONCAT(UK_FOREACH, n)(f, __VA_ARGS__)
>
> +
> +#define UK_FOREACH_SIZEOF(a, b) sizeof(b)
> +#define __UK_TRACE_ARG_SIZES(n, ...) \
> + { UK_FOREACH(n, UK_FOREACH_SIZEOF, __VA_ARGS__) }
> +
> +#define __UK_TRACE_GET_TYPE_FOREACH(n, arg) \
> + __UK_TRACE_GET_TYPE(arg)
> +#define __UK_TRACE_ARG_TYPES(n, ...) \
> + { UK_FOREACH(n, __UK_TRACE_GET_TYPE_FOREACH, __VA_ARGS__) }
> +
> +#define __UK_TRACE_REG(NR, regname, trace_name, fmt, ...) \
> + UK_CTASSERT(sizeof(#trace_name) < 255); \
> + UK_CTASSERT(sizeof(fmt) < 255); \
> + __attribute((__section__(".uk_tracepoints_list"))) \
> + static struct { \
> + uint32_t magic; \
> + uint32_t size; \
> + uint64_t cookie; \
> + uint8_t args_nr; \
> + uint8_t name_len; \
> + uint8_t format_len; \
> + uint8_t sizes[NR]; \
> + uint8_t types[NR]; \
If we get rid of the n parameter in FOREACH, then we can also get rid
of the NR parameter. I don't feel strong about this one, it's your call.
> + char name[sizeof(#trace_name)]; \
> + char format[sizeof(fmt)]; \
> + } regname __used = { \
> + UK_TP_DEF_MAGIC, \
> + sizeof(regname), \
> + (uint64_t) ®name, \
> + NR, \
> + sizeof(#trace_name), sizeof(fmt), \
> + __UK_TRACE_ARG_SIZES(NR, __VA_ARGS__), \
> + __UK_TRACE_ARG_TYPES(NR, __VA_ARGS__), \
> + #trace_name, fmt }
> +
> +/* Makes from "const char*" "const char* arg1".
> + */
> +#define __UK_ARGS_MAP_FN(n, t) t UK_CONCAT(arg, n)
> +#define __UK_TRACE_ARGS_MAP(n, ...) \
> + UK_FOREACH(n, __UK_ARGS_MAP_FN, __VA_ARGS__)
> +
> +#define __UK_ARGS_MAP_FN_UNUSED(n, t) t UK_CONCAT(arg, n) __unused
> +#define __UK_TRACE_ARGS_MAP_UNUSED(n, ...) \
> + UK_FOREACH(n, __UK_ARGS_MAP_FN_UNUSED, __VA_ARGS__)
> +
> +
> +#if (defined(CONFIG_LIBUKDEBUG_TRACEPOINTS) &&
> \
> + (defined(UK_DEBUG_TRACE) || defined(CONFIG_LIBUKDEBUG_ALL_TRACEPOINTS)))
> +#define ____UK_TRACEPOINT(n, regdata_name, trace_name, fmt, ...) \
> + __UK_TRACE_REG(n, regdata_name, trace_name, fmt, \
> + __VA_ARGS__); \
> + static inline void trace_name(__UK_TRACE_ARGS_MAP_UNUSED(n,
> __VA_ARGS__)) \
> + { \
> + }
> +#else
> +#define ____UK_TRACEPOINT(n, regdata_name, trace_name, fmt, ...) \
> + static inline void trace_name( \
> + __UK_TRACE_ARGS_MAP_UNUSED(n, __VA_ARGS__)) \
> + { \
> + }
> +#endif
> +
> +#define __UK_TRACEPOINT(n, regdata_name, trace_name, fmt, ...) \
> + ____UK_TRACEPOINT(n, regdata_name, trace_name, fmt, \
> + __VA_ARGS__)
> +#define UK_TRACEPOINT(trace_name, fmt, ...) \
> + __UK_TRACEPOINT(UK_NARGS(__VA_ARGS__), \
> + __ ## trace_name ## _regdata, \
> + trace_name, fmt, __VA_ARGS__)
> +
> +
> #endif /* _UK_TRACE_H_ */
>
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |