|
@@ -1155,6 +1155,30 @@ char *netdev_feature_string(char *buf, char *end, const u8 *addr,
|
|
|
return number(buf, end, *(const netdev_features_t *)addr, spec);
|
|
|
}
|
|
|
|
|
|
+static noinline_for_stack
|
|
|
+char *address_val(char *buf, char *end, const void *addr,
|
|
|
+ struct printf_spec spec, const char *fmt)
|
|
|
+{
|
|
|
+ unsigned long long num;
|
|
|
+
|
|
|
+ spec.flags |= SPECIAL | SMALL | ZEROPAD;
|
|
|
+ spec.base = 16;
|
|
|
+
|
|
|
+ switch (fmt[1]) {
|
|
|
+ case 'd':
|
|
|
+ num = *(const dma_addr_t *)addr;
|
|
|
+ spec.field_width = sizeof(dma_addr_t) * 2 + 2;
|
|
|
+ break;
|
|
|
+ case 'p':
|
|
|
+ default:
|
|
|
+ num = *(const phys_addr_t *)addr;
|
|
|
+ spec.field_width = sizeof(phys_addr_t) * 2 + 2;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return number(buf, end, num, spec);
|
|
|
+}
|
|
|
+
|
|
|
int kptr_restrict __read_mostly;
|
|
|
|
|
|
/*
|
|
@@ -1218,7 +1242,8 @@ int kptr_restrict __read_mostly;
|
|
|
* N no separator
|
|
|
* The maximum supported length is 64 bytes of the input. Consider
|
|
|
* to use print_hex_dump() for the larger input.
|
|
|
- * - 'a' For a phys_addr_t type and its derivative types (passed by reference)
|
|
|
+ * - 'a[pd]' For address types [p] phys_addr_t, [d] dma_addr_t and derivatives
|
|
|
+ * (default assumed to be phys_addr_t, passed by reference)
|
|
|
* - 'd[234]' For a dentry name (optionally 2-4 last components)
|
|
|
* - 'D[234]' Same as 'd' but for a struct file
|
|
|
*
|
|
@@ -1353,11 +1378,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
|
|
|
}
|
|
|
break;
|
|
|
case 'a':
|
|
|
- spec.flags |= SPECIAL | SMALL | ZEROPAD;
|
|
|
- spec.field_width = sizeof(phys_addr_t) * 2 + 2;
|
|
|
- spec.base = 16;
|
|
|
- return number(buf, end,
|
|
|
- (unsigned long long) *((phys_addr_t *)ptr), spec);
|
|
|
+ return address_val(buf, end, ptr, spec, fmt);
|
|
|
case 'd':
|
|
|
return dentry_name(buf, end, ptr, spec, fmt);
|
|
|
case 'D':
|