On Fri,  5 Dec 2014 19:04:12 +0000
"Javi Merino" <javi.mer...@arm.com> wrote:

 
> +static const char *
> +ftrace_print_array_seq(struct trace_seq *p, const void *buf, int buf_len,
> +                    bool (*iterator)(struct trace_seq *p, const char *prefix,
> +                                     const void **buf, int *buf_len))
> +{
> +     const char *ret = trace_seq_buffer_ptr(p);
> +     const char *prefix = "";
> +
> +     trace_seq_putc(p, '{');
> +
> +     while (iterator(p, prefix, &buf, &buf_len))
> +             prefix = ",";
> +
> +     trace_seq_putc(p, '}');
> +     trace_seq_putc(p, 0);
> +
> +     return ret;
> +}
> +
> +#define DEFINE_PRINT_ARRAY(type, printk_type, format)                        
> \
> +static bool                                                          \
> +ftrace_print_array_iterator_##type(struct trace_seq *p, const char *prefix, \
> +                                const void **buf, int *buf_len)      \
> +{                                                                    \
> +     const type *__src = *buf;                                       \
> +                                                                     \
> +     if (*buf_len < sizeof(*__src))                                  \
> +             return false;                                           \
> +                                                                     \
> +     trace_seq_printf(p, "%s" format, prefix, (printk_type)*__src++); \
> +                                                                     \
> +     *buf = __src;                                                   \
> +     *buf_len -= sizeof(*__src);                                     \
> +                                                                     \
> +     return true;                                                    \
> +}                                                                    \
> +                                                                     \
> +const char *ftrace_print_##type##_array_seq(                         \
> +     struct trace_seq *p, const type *buf, int count)                \
> +{                                                                    \
> +     return ftrace_print_array_seq(p, buf, (count) * sizeof(type),   \
> +                                   ftrace_print_array_iterator_##type); \
> +}                                                                    \
> +                                                                     \
> +EXPORT_SYMBOL(ftrace_print_##type##_array_seq)
> +
> +DEFINE_PRINT_ARRAY(u8, unsigned int, "0x%x");
> +DEFINE_PRINT_ARRAY(u16, unsigned int, "0x%x");
> +DEFINE_PRINT_ARRAY(u32, unsigned int, "0x%x");
> +DEFINE_PRINT_ARRAY(u64, unsigned long long, "0x%llx");
> +

I would really like to avoid adding a bunch of macros for each type.
Can't we have something like this:

ftrace_print_array(struct trace_seq *p, void *buf, int buf_len, 
                int size)
{
        char *prefix = "";
        void *ptr = buf;

        while (ptr < buf + buf_len) {
                switch(size) {
                case 8:
                        trace_seq_printf("%s0x%x", prefix,
                                *(unsigned char *)ptr);
                        break;
                case 16:
                        trace_seq_printf("%s0x%x", prefix,
                                *(unsigned short *)ptr);
                        break;
                case 32:
                        trace_seq_printf("%s0x%x", prefix,
                                *(unsigned int *)ptr);
                        break;
                case 64:
                        trace_seq_printf("%s0x%llx", prefix,
                                *(unsigned long long *)ptr);
                        break;
                default:
                        BUG();
                }
                prefix = ",";
                ptr += size;
        }

}

We probably could even make the "BUG()" into a build bug, with a little
work.

-- Steve

>  int ftrace_raw_output_prep(struct trace_iterator *iter,
>                          struct trace_event *trace_event)
>  {

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to