aboutsummaryrefslogtreecommitdiffstats
path: root/lib-vsprintf-add-pap-padp-options.patch
diff options
Diffstat (limited to 'lib-vsprintf-add-pap-padp-options.patch')
-rw-r--r--lib-vsprintf-add-pap-padp-options.patch77
1 files changed, 77 insertions, 0 deletions
diff --git a/lib-vsprintf-add-pap-padp-options.patch b/lib-vsprintf-add-pap-padp-options.patch
new file mode 100644
index 00000000000000..1e20d375c4a032
--- /dev/null
+++ b/lib-vsprintf-add-pap-padp-options.patch
@@ -0,0 +1,77 @@
+From: Chris Fries <cfries@google.com>
+Date: Thu, 27 Apr 2017 23:29:40 -0500
+Subject: lib: vsprintf: Add "%paP", "%padP" options
+
+Add %paP and %padP for physical address that need to always be shown
+regardless of kptr restrictions.
+
+Signed-off-by: Chris Fries <cfries@google.com>
+---
+
+---
+ 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
+@@ -82,18 +82,20 @@ Struct Resources:
+
+ 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
+@@ -1394,23 +1394,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