On Thu, 30 Jun 2016 16:56:34 +0200 Jiri Olsa <jo...@redhat.com> wrote:
> On Wed, Jun 29, 2016 at 04:05:25PM -0400, Steven Rostedt wrote: > > SNIP > > > } > > @@ -2552,11 +2561,18 @@ int bstr_printf(char *buf, size_t size, const char > > *fmt, const u32 *bin_buf) > > } > > > > case FORMAT_TYPE_PTR: { > > + unsigned long *tmp_ptr; > > + unsigned long *ptr; > > const char *_fmt = fmt; > > char tmp_fmt[2]; > > > > if (supported_bin_ptr(fmt)) { > > switch (fmt[0]) { > > + case 'b': { > > + tmp_ptr = get_arg(void *); > > + ptr = (void *)&tmp_ptr; > > this seems wrong.. &tmp_ptr is address from the stack > not from args which is what we want in here IIUC Ah, your right. This only worked because the test I did was on a mask of less than 64 cpus, where the above moved the bitmask into tmp_ptr. I do want the address of the actual args array. > > should we do something like in attached patch? untested.. I'll test it out. Thanks, -- Steve > > thanks, > jirka > > > --- > diff --git a/lib/vsprintf.c b/lib/vsprintf.c > index 474d9ddaca6f..9aeb277ae533 100644 > --- a/lib/vsprintf.c > +++ b/lib/vsprintf.c > @@ -2561,7 +2561,6 @@ int bstr_printf(char *buf, size_t size, const char > *fmt, const u32 *bin_buf) > } > > case FORMAT_TYPE_PTR: { > - unsigned long *tmp_ptr; > unsigned long *ptr; > const char *_fmt = fmt; > char tmp_fmt[2]; > @@ -2569,8 +2568,8 @@ int bstr_printf(char *buf, size_t size, const char > *fmt, const u32 *bin_buf) > if (supported_bin_ptr(fmt)) { > switch (fmt[0]) { > case 'b': { > - tmp_ptr = get_arg(void *); > - ptr = (void *)&tmp_ptr; > + ptr = (unsigned long *) PTR_ALIGN(args, > sizeof(u32)); > + args += BITS_TO_LONGS(spec.field_width); > break; > } > case 'F':