|
@@ -1646,6 +1646,20 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
|
|
|
return widen_string(buf, buf - buf_start, end, spec);
|
|
|
}
|
|
|
|
|
|
+static noinline_for_stack
|
|
|
+char *pointer_string(char *buf, char *end, const void *ptr,
|
|
|
+ struct printf_spec spec)
|
|
|
+{
|
|
|
+ spec.base = 16;
|
|
|
+ spec.flags |= SMALL;
|
|
|
+ if (spec.field_width == -1) {
|
|
|
+ spec.field_width = 2 * sizeof(ptr);
|
|
|
+ spec.flags |= ZEROPAD;
|
|
|
+ }
|
|
|
+
|
|
|
+ return number(buf, end, (unsigned long int)ptr, spec);
|
|
|
+}
|
|
|
+
|
|
|
static bool have_filled_random_ptr_key __read_mostly;
|
|
|
static siphash_key_t ptr_key __read_mostly;
|
|
|
|
|
@@ -1818,6 +1832,8 @@ static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec)
|
|
|
* c major compatible string
|
|
|
* C full compatible string
|
|
|
*
|
|
|
+ * - 'x' For printing the address. Equivalent to "%lx".
|
|
|
+ *
|
|
|
* ** Please update also Documentation/printk-formats.txt when making changes **
|
|
|
*
|
|
|
* Note: The difference between 'S' and 'F' is that on ia64 and ppc64
|
|
@@ -1940,6 +1956,8 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
|
|
|
case 'F':
|
|
|
return device_node_string(buf, end, ptr, spec, fmt + 1);
|
|
|
}
|
|
|
+ case 'x':
|
|
|
+ return pointer_string(buf, end, ptr, spec);
|
|
|
}
|
|
|
|
|
|
/* default is to _not_ leak addresses, hash before printing */
|