diff options
Diffstat (limited to 'lib-vsprintf-add-pap-padp-options.patch')
| -rw-r--r-- | lib-vsprintf-add-pap-padp-options.patch | 77 |
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 |
