From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Sakari Ailus <sakari.ailus@linux.intel.com>
Cc: Petr Mladek <pmladek@suse.com>,
Dave Stevenson <dave.stevenson@raspberrypi.com>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
hverkuil@xs4all.nl,
Sergey Senozhatsky <sergey.senozhatsky@gmail.com>,
Steven Rostedt <rostedt@goodmis.org>,
laurent.pinchart@ideasonboard.com, Joe Perches <joe@perches.com>,
mchehab@kernel.org, linux-media@vger.kernel.org
Subject: Re: [PATCH v4 1/1] lib/vsprintf: Add support for printing V4L2 and DRM fourccs
Date: Tue, 3 Nov 2020 16:47:47 +0200 [thread overview]
Message-ID: <20201103144747.GD4077@smile.fi.intel.com> (raw)
In-Reply-To: <20201103133400.24805-1-sakari.ailus@linux.intel.com>
On Tue, Nov 03, 2020 at 03:34:00PM +0200, Sakari Ailus wrote:
> Add a printk modifier %p4cc (for pixel format) for printing V4L2 and DRM
> pixel formats denoted by fourccs. The fourcc encoding is the same for both
> so the same implementation can be used.
...
> +static noinline_for_stack
> +char *fourcc_string(char *buf, char *end, const u32 *fourcc,
> + struct printf_spec spec, const char *fmt)
> +{
> + char output[sizeof("(xx)(xx)(xx)(xx) little-endian (0x01234567)")];
I would add a comment that there is another possibility, i.e. big-endian, but
it occupies less space.
> + char *p = output;
> + unsigned int i;
> + u32 val;
> +
> + if (fmt[1] != 'c' || fmt[2] != 'c')
> + return error_string(output, end, "(%p4?)", spec);
> +
> + if (check_pointer(&buf, end, fourcc, spec))
> + return buf;
> +
> + val = *fourcc & ~BIT(31);
> +
> + for (i = 0; i < sizeof(*fourcc); i++) {
> + unsigned char c = val >> (i * 8);
> +
> + /* Weed out spaces */
> + if (c == ' ')
> + continue;
> +
> + /* Print non-control ASCII characters as-is */
> + if (isascii(c) && isprint(c)) {
> + *p++ = c;
> + continue;
> + }
> +
> + *p++ = '(';
> + p = hex_byte_pack(p, c);
> + *p++ = ')';
> + }
I guess above loop can be still optimized, but I have to think about it.
> + strcpy(p, *fourcc & BIT(31) ? " big-endian" : " little-endian");
> + p += strlen(p);
> +
> + *p++ = ' ';
> + *p++ = '(';
> + /* subtract parenthesis and the space from the size */
This comment misleading. What you are subtracting is a room for closing
parenthesis and NUL.
> + p = special_hex_number(p, output + sizeof(output) - 2, *fourcc,
> + sizeof(u32));
I would go with one line here.
The (theoretical) problem is here that the case when buffer size is not enough
to print a value will be like '(0xabc)' but should be rather '(0xabcd' like
snprintf() does in general.
> + *p++ = ')';
> + *p = '\0';
> +
> + return string(buf, end, output, spec);
> +}
--
With Best Regards,
Andy Shevchenko
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
WARNING: multiple messages have this Message-ID (diff)
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Sakari Ailus <sakari.ailus@linux.intel.com>
Cc: linux-kernel@vger.kernel.org, linux-media@vger.kernel.org,
Petr Mladek <pmladek@suse.com>,
Dave Stevenson <dave.stevenson@raspberrypi.com>,
dri-devel@lists.freedesktop.org, hverkuil@xs4all.nl,
laurent.pinchart@ideasonboard.com, mchehab@kernel.org,
Sergey Senozhatsky <sergey.senozhatsky@gmail.com>,
Steven Rostedt <rostedt@goodmis.org>,
Joe Perches <joe@perches.com>,
Jani Nikula <jani.nikula@linux.intel.com>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>
Subject: Re: [PATCH v4 1/1] lib/vsprintf: Add support for printing V4L2 and DRM fourccs
Date: Tue, 3 Nov 2020 16:47:47 +0200 [thread overview]
Message-ID: <20201103144747.GD4077@smile.fi.intel.com> (raw)
In-Reply-To: <20201103133400.24805-1-sakari.ailus@linux.intel.com>
On Tue, Nov 03, 2020 at 03:34:00PM +0200, Sakari Ailus wrote:
> Add a printk modifier %p4cc (for pixel format) for printing V4L2 and DRM
> pixel formats denoted by fourccs. The fourcc encoding is the same for both
> so the same implementation can be used.
...
> +static noinline_for_stack
> +char *fourcc_string(char *buf, char *end, const u32 *fourcc,
> + struct printf_spec spec, const char *fmt)
> +{
> + char output[sizeof("(xx)(xx)(xx)(xx) little-endian (0x01234567)")];
I would add a comment that there is another possibility, i.e. big-endian, but
it occupies less space.
> + char *p = output;
> + unsigned int i;
> + u32 val;
> +
> + if (fmt[1] != 'c' || fmt[2] != 'c')
> + return error_string(output, end, "(%p4?)", spec);
> +
> + if (check_pointer(&buf, end, fourcc, spec))
> + return buf;
> +
> + val = *fourcc & ~BIT(31);
> +
> + for (i = 0; i < sizeof(*fourcc); i++) {
> + unsigned char c = val >> (i * 8);
> +
> + /* Weed out spaces */
> + if (c == ' ')
> + continue;
> +
> + /* Print non-control ASCII characters as-is */
> + if (isascii(c) && isprint(c)) {
> + *p++ = c;
> + continue;
> + }
> +
> + *p++ = '(';
> + p = hex_byte_pack(p, c);
> + *p++ = ')';
> + }
I guess above loop can be still optimized, but I have to think about it.
> + strcpy(p, *fourcc & BIT(31) ? " big-endian" : " little-endian");
> + p += strlen(p);
> +
> + *p++ = ' ';
> + *p++ = '(';
> + /* subtract parenthesis and the space from the size */
This comment misleading. What you are subtracting is a room for closing
parenthesis and NUL.
> + p = special_hex_number(p, output + sizeof(output) - 2, *fourcc,
> + sizeof(u32));
I would go with one line here.
The (theoretical) problem is here that the case when buffer size is not enough
to print a value will be like '(0xabc)' but should be rather '(0xabcd' like
snprintf() does in general.
> + *p++ = ')';
> + *p = '\0';
> +
> + return string(buf, end, output, spec);
> +}
--
With Best Regards,
Andy Shevchenko
next prev parent reply other threads:[~2020-11-04 8:22 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-03 13:34 [PATCH v4 1/1] lib/vsprintf: Add support for printing V4L2 and DRM fourccs Sakari Ailus
2020-11-03 13:34 ` Sakari Ailus
2020-11-03 14:47 ` Andy Shevchenko [this message]
2020-11-03 14:47 ` Andy Shevchenko
2020-11-03 14:56 ` Sakari Ailus
2020-11-03 14:56 ` Sakari Ailus
2020-11-03 15:46 ` Andy Shevchenko
2020-11-03 15:46 ` Andy Shevchenko
2020-11-03 16:49 ` Joe Perches
2020-11-03 16:49 ` Joe Perches
2020-11-13 10:54 ` Sakari Ailus
2020-11-13 10:54 ` Sakari Ailus
2020-11-13 16:46 ` Joe Perches
2020-11-13 16:46 ` Joe Perches
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201103144747.GD4077@smile.fi.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=dave.stevenson@raspberrypi.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=hverkuil@xs4all.nl \
--cc=joe@perches.com \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=mchehab@kernel.org \
--cc=pmladek@suse.com \
--cc=rostedt@goodmis.org \
--cc=sakari.ailus@linux.intel.com \
--cc=sergey.senozhatsky@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.