The printk formats %*ph{C,D,N} are chosen to be compatible with their Linux
counterparts.
Sample:
(XEN) buf: 00 01 03 07 78 65 6e 00
(XEN) buf: 00:01:03:07:78:65:6e:00
(XEN) buf: 00-01-03-07-78-65-6e-00
(XEN) buf:
0001030778656e00
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Raw buffer as hex string:
- %*ph Up to 64 characters, printed as "00 01 02 ... ff". Buffer length
- expected via the field_width paramter. i.e. printk("%*ph", 8, buffer);
+ %*ph 00 01 02 ... 3f
+ %*phC 00:01:02: ... :3f
+ %*phD 00-01-02- ... -3f
+ %*phN 000102 ... 3f
+
+ Up to 64 characters. Buffer length expected via the field_width
+ paramter. i.e. printk("%*ph", 8, buffer);
Symbol/Function pointers:
case 'h': /* Raw buffer as hex string. */
{
const uint8_t *hex_buffer = arg;
+ char sep = ' '; /* Separator character. */
unsigned int i;
/* Consumed 'h' from the format string. */
if ( field_width > 64 )
field_width = 64;
+ /*
+ * Peek ahead in the format string to see if a recognised separator
+ * modifier is present.
+ */
+ switch ( fmt[2] )
+ {
+ case 'C': /* Colons. */
+ ++*fmt_ptr;
+ sep = ':';
+ break;
+
+ case 'D': /* Dashes. */
+ ++*fmt_ptr;
+ sep = '-';
+ break;
+
+ case 'N': /* No separator. */
+ ++*fmt_ptr;
+ sep = 0;
+ break;
+ }
+
for ( i = 0; ; )
{
/* Each byte: 2 chars, 0-padded, base 16, no hex prefix. */
if ( ++i == field_width )
return str;
- if ( str < end )
- *str = ' ';
- ++str;
+ if ( sep )
+ {
+ if ( str < end )
+ *str = sep;
+ ++str;
+ }
}
}