Commit fd95541e authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Jesse Barnes

vsprintf: add %pRt, %pRf to print struct resource details

This adds support for printing struct resource type and flag information.
For example, "%pRt" looks like "[mem 0x80080000000-0x8008001ffff 64bit pref]",
and "%pRf" looks like "[mem 0xff5e2000-0xff5e2007 pref flags 0x1]".
Signed-off-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent c91d3376
...@@ -595,7 +595,7 @@ static char *symbol_string(char *buf, char *end, void *ptr, ...@@ -595,7 +595,7 @@ static char *symbol_string(char *buf, char *end, void *ptr,
} }
static char *resource_string(char *buf, char *end, struct resource *res, static char *resource_string(char *buf, char *end, struct resource *res,
struct printf_spec spec) struct printf_spec spec, const char *fmt)
{ {
#ifndef IO_RSRC_PRINTK_SIZE #ifndef IO_RSRC_PRINTK_SIZE
#define IO_RSRC_PRINTK_SIZE 6 #define IO_RSRC_PRINTK_SIZE 6
...@@ -614,9 +614,21 @@ static char *resource_string(char *buf, char *end, struct resource *res, ...@@ -614,9 +614,21 @@ static char *resource_string(char *buf, char *end, struct resource *res,
.precision = -1, .precision = -1,
.flags = 0, .flags = 0,
}; };
/* room for two actual numbers (decimal or hex), the two "0x", -, [, ] struct printf_spec str_spec = {
* and the final zero */ .field_width = -1,
char sym[2*3*sizeof(resource_size_t) + 8]; .precision = 10,
.flags = LEFT,
};
struct printf_spec flag_spec = {
.base = 16,
.precision = -1,
.flags = SPECIAL | SMALL,
};
/*
* room for three actual numbers (decimal or hex), plus
* "[mem 0x-0x 64bit pref disabled flags 0x]\0"
*/
char sym[3*3*sizeof(resource_size_t) + 41];
char *p = sym, *pend = sym + sizeof(sym); char *p = sym, *pend = sym + sizeof(sym);
int size = -1, addr = 0; int size = -1, addr = 0;
...@@ -629,12 +641,35 @@ static char *resource_string(char *buf, char *end, struct resource *res, ...@@ -629,12 +641,35 @@ static char *resource_string(char *buf, char *end, struct resource *res,
} }
*p++ = '['; *p++ = '[';
if (fmt[1] == 't' || fmt[1] == 'f') {
if (res->flags & IORESOURCE_IO)
p = string(p, pend, "io ", str_spec);
else if (res->flags & IORESOURCE_MEM)
p = string(p, pend, "mem ", str_spec);
else if (res->flags & IORESOURCE_IRQ)
p = string(p, pend, "irq ", str_spec);
else if (res->flags & IORESOURCE_DMA)
p = string(p, pend, "dma ", str_spec);
}
hex_spec.field_width = size; hex_spec.field_width = size;
p = number(p, pend, res->start, addr ? hex_spec : dec_spec); p = number(p, pend, res->start, addr ? hex_spec : dec_spec);
if (res->start != res->end) { if (res->start != res->end) {
*p++ = '-'; *p++ = '-';
p = number(p, pend, res->end, addr ? hex_spec : dec_spec); p = number(p, pend, res->end, addr ? hex_spec : dec_spec);
} }
if (fmt[1] == 't' || fmt[1] == 'f') {
if (res->flags & IORESOURCE_MEM_64)
p = string(p, pend, " 64bit", str_spec);
if (res->flags & IORESOURCE_PREFETCH)
p = string(p, pend, " pref", str_spec);
if (res->flags & IORESOURCE_DISABLED)
p = string(p, pend, " disabled", str_spec);
if (fmt[1] == 'f') {
p = string(p, pend, " flags ", str_spec);
p = number(p, pend, res->flags & ~IORESOURCE_TYPE_BITS,
flag_spec);
}
}
*p++ = ']'; *p++ = ']';
*p = 0; *p = 0;
...@@ -812,8 +847,10 @@ static char *ip4_addr_string(char *buf, char *end, const u8 *addr, ...@@ -812,8 +847,10 @@ static char *ip4_addr_string(char *buf, char *end, const u8 *addr,
* - 'f' For simple symbolic function names without offset * - 'f' For simple symbolic function names without offset
* - 'S' For symbolic direct pointers with offset * - 'S' For symbolic direct pointers with offset
* - 's' For symbolic direct pointers without offset * - 's' For symbolic direct pointers without offset
* - 'R' For a struct resource pointer, it prints the range of * - 'R' For a struct resource pointer, print:
* addresses (not the name nor the flags) * R address range only ([0x0-0x1f])
* Rt type and range ([mem 0x0-0x1f 64bit pref])
* Rf type, range, and flags ([mem 0x0-0x1f 64bit pref flags 0x1])
* - 'M' For a 6-byte MAC address, it prints the address in the * - 'M' For a 6-byte MAC address, it prints the address in the
* usual colon-separated hex notation * usual colon-separated hex notation
* - 'm' For a 6-byte MAC address, it prints the hex address without colons * - 'm' For a 6-byte MAC address, it prints the hex address without colons
...@@ -844,7 +881,7 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, ...@@ -844,7 +881,7 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
case 'S': case 'S':
return symbol_string(buf, end, ptr, spec, *fmt); return symbol_string(buf, end, ptr, spec, *fmt);
case 'R': case 'R':
return resource_string(buf, end, ptr, spec); return resource_string(buf, end, ptr, spec, fmt);
case 'M': /* Colon separated: 00:01:02:03:04:05 */ case 'M': /* Colon separated: 00:01:02:03:04:05 */
case 'm': /* Contiguous: 000102030405 */ case 'm': /* Contiguous: 000102030405 */
return mac_address_string(buf, end, ptr, spec, fmt); return mac_address_string(buf, end, ptr, spec, fmt);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment