mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
Merge tag 'printk-for-5.18' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux
Pull printk updates from Petr Mladek: - Make %pK behave the same as %p for kptr_restrict == 0 also with no_hash_pointers parameter - Ignore the default console in the device tree also when console=null or console="" is used on the command line - Document console=null and console="" behavior - Prevent a deadlock and a livelock caused by console_lock in panic() - Make console_lock available for panicking CPU - Fast query for the next to-be-used sequence number - Use the expected return values in printk.devkmsg __setup handler - Use the correct atomic operations in wake_up_klogd() irq_work handler - Avoid possible unaligned access when handling %4cc printing format * tag 'printk-for-5.18' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux: printk: fix return value of printk.devkmsg __setup handler vsprintf: Fix %pK with kptr_restrict == 0 printk: make suppress_panic_printk static printk: Set console_set_on_cmdline=1 when __add_preferred_console() is called with user_specified == true Docs: printk: add 'console=null|""' to admin/kernel-parameters printk: use atomic updates for klogd work printk: Drop console_sem during panic printk: Avoid livelock with heavy printk during panic printk: disable optimistic spin during panic printk: Add panic_in_progress helper vsprintf: Move space out of string literals in fourcc_string() vsprintf: Fix potential unaligned access printk: ringbuffer: Improve prb_next_seq() performance
This commit is contained in:
@@ -49,10 +49,15 @@
|
||||
|
||||
#include <asm/page.h> /* for PAGE_SIZE */
|
||||
#include <asm/byteorder.h> /* cpu_to_le16 */
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include <linux/string_helpers.h>
|
||||
#include "kstrtox.h"
|
||||
|
||||
/* Disable pointer hashing if requested */
|
||||
bool no_hash_pointers __ro_after_init;
|
||||
EXPORT_SYMBOL_GPL(no_hash_pointers);
|
||||
|
||||
static noinline unsigned long long simple_strntoull(const char *startp, size_t max_chars, char **endp, unsigned int base)
|
||||
{
|
||||
const char *cp;
|
||||
@@ -850,6 +855,19 @@ static char *ptr_to_id(char *buf, char *end, const void *ptr,
|
||||
return pointer_string(buf, end, (const void *)hashval, spec);
|
||||
}
|
||||
|
||||
static char *default_pointer(char *buf, char *end, const void *ptr,
|
||||
struct printf_spec spec)
|
||||
{
|
||||
/*
|
||||
* default is to _not_ leak addresses, so hash before printing,
|
||||
* unless no_hash_pointers is specified on the command line.
|
||||
*/
|
||||
if (unlikely(no_hash_pointers))
|
||||
return pointer_string(buf, end, ptr, spec);
|
||||
|
||||
return ptr_to_id(buf, end, ptr, spec);
|
||||
}
|
||||
|
||||
int kptr_restrict __read_mostly;
|
||||
|
||||
static noinline_for_stack
|
||||
@@ -859,7 +877,7 @@ char *restricted_pointer(char *buf, char *end, const void *ptr,
|
||||
switch (kptr_restrict) {
|
||||
case 0:
|
||||
/* Handle as %p, hash and do _not_ leak addresses. */
|
||||
return ptr_to_id(buf, end, ptr, spec);
|
||||
return default_pointer(buf, end, ptr, spec);
|
||||
case 1: {
|
||||
const struct cred *cred;
|
||||
|
||||
@@ -1763,7 +1781,7 @@ char *fourcc_string(char *buf, char *end, const u32 *fourcc,
|
||||
char output[sizeof("0123 little-endian (0x01234567)")];
|
||||
char *p = output;
|
||||
unsigned int i;
|
||||
u32 val;
|
||||
u32 orig, val;
|
||||
|
||||
if (fmt[1] != 'c' || fmt[2] != 'c')
|
||||
return error_string(buf, end, "(%p4?)", spec);
|
||||
@@ -1771,21 +1789,23 @@ char *fourcc_string(char *buf, char *end, const u32 *fourcc,
|
||||
if (check_pointer(&buf, end, fourcc, spec))
|
||||
return buf;
|
||||
|
||||
val = *fourcc & ~BIT(31);
|
||||
orig = get_unaligned(fourcc);
|
||||
val = orig & ~BIT(31);
|
||||
|
||||
for (i = 0; i < sizeof(*fourcc); i++) {
|
||||
for (i = 0; i < sizeof(u32); i++) {
|
||||
unsigned char c = val >> (i * 8);
|
||||
|
||||
/* Print non-control ASCII characters as-is, dot otherwise */
|
||||
*p++ = isascii(c) && isprint(c) ? c : '.';
|
||||
}
|
||||
|
||||
strcpy(p, *fourcc & BIT(31) ? " big-endian" : " little-endian");
|
||||
*p++ = ' ';
|
||||
strcpy(p, orig & BIT(31) ? "big-endian" : "little-endian");
|
||||
p += strlen(p);
|
||||
|
||||
*p++ = ' ';
|
||||
*p++ = '(';
|
||||
p = special_hex_number(p, output + sizeof(output) - 2, *fourcc, sizeof(u32));
|
||||
p = special_hex_number(p, output + sizeof(output) - 2, orig, sizeof(u32));
|
||||
*p++ = ')';
|
||||
*p = '\0';
|
||||
|
||||
@@ -2225,10 +2245,6 @@ char *fwnode_string(char *buf, char *end, struct fwnode_handle *fwnode,
|
||||
return widen_string(buf, buf - buf_start, end, spec);
|
||||
}
|
||||
|
||||
/* Disable pointer hashing if requested */
|
||||
bool no_hash_pointers __ro_after_init;
|
||||
EXPORT_SYMBOL_GPL(no_hash_pointers);
|
||||
|
||||
int __init no_hash_pointers_enable(char *str)
|
||||
{
|
||||
if (no_hash_pointers)
|
||||
@@ -2457,7 +2473,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
|
||||
case 'e':
|
||||
/* %pe with a non-ERR_PTR gets treated as plain %p */
|
||||
if (!IS_ERR(ptr))
|
||||
break;
|
||||
return default_pointer(buf, end, ptr, spec);
|
||||
return err_ptr(buf, end, ptr, spec);
|
||||
case 'u':
|
||||
case 'k':
|
||||
@@ -2467,16 +2483,9 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
|
||||
default:
|
||||
return error_string(buf, end, "(einval)", spec);
|
||||
}
|
||||
default:
|
||||
return default_pointer(buf, end, ptr, spec);
|
||||
}
|
||||
|
||||
/*
|
||||
* default is to _not_ leak addresses, so hash before printing,
|
||||
* unless no_hash_pointers is specified on the command line.
|
||||
*/
|
||||
if (unlikely(no_hash_pointers))
|
||||
return pointer_string(buf, end, ptr, spec);
|
||||
else
|
||||
return ptr_to_id(buf, end, ptr, spec);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user