1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
From: Chris Fries <cfries@google.com>
Subject: lib: vsprintf: Add "%paP", "%padP" options
Add %paP and %padP for physical address that need to always be shown
regardless of kptr restrictions.
Cc: William Roberts <william.c.roberts@intel.com>
Cc: Dave Weinstein <olorin@google.com>
Signed-off-by: Chris Fries <cfries@google.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
Documentation/printk-formats.txt | 10 ++++++----
lib/vsprintf.c | 12 +++++++++---
2 files changed, 15 insertions(+), 7 deletions(-)
--- a/Documentation/printk-formats.txt
+++ b/Documentation/printk-formats.txt
@@ -121,21 +121,23 @@ Physical addresses types ``phys_addr_t``
::
- %pa[p] 0x01234567 or 0x0123456789abcdef
+ %pa[p][P] 0x01234567 or 0x0123456789abcdef
For printing a ``phys_addr_t`` type (and its derivatives, such as
``resource_size_t``) which can vary based on build options, regardless of
-the width of the CPU data path. Passed by reference.
+the width of the CPU data path. Passed by reference. Use the trailing
+'P' if it needs to be always shown.
DMA addresses types ``dma_addr_t``
==================================
::
- %pad 0x01234567 or 0x0123456789abcdef
+ %pad[P] 0x01234567 or 0x0123456789abcdef
For printing a ``dma_addr_t`` type which can vary based on build options,
-regardless of the width of the CPU data path. Passed by reference.
+regardless of the width of the CPU data path. Passed by reference. Use
+the trailing 'P' if it needs to be always shown.
Raw buffer as an escaped string
===============================
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -1395,23 +1395,29 @@ static noinline_for_stack
char *address_val(char *buf, char *end, const void *addr, const char *fmt)
{
unsigned long long num;
+ int cleanse = kptr_restrict_cleanse_addresses();
+ int decleanse_idx = 1;
int size;
switch (fmt[1]) {
case 'd':
num = *(const dma_addr_t *)addr;
size = sizeof(dma_addr_t);
+ decleanse_idx = 2;
break;
case 'p':
+ decleanse_idx = 2;
+ /* fall thru */
default:
num = *(const phys_addr_t *)addr;
size = sizeof(phys_addr_t);
break;
}
- return special_hex_number(buf, end,
- kptr_restrict_cleanse_addresses() ? 0UL : num,
- size);
+ /* 'P' on the tail means don't restrict the pointer. */
+ cleanse = cleanse && (fmt[decleanse_idx] != 'P');
+
+ return special_hex_number(buf, end, cleanse ? 0UL : num, size);
}
static noinline_for_stack
|