mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-03-16 03:54:10 +00:00
Sane printk changes for 5.20
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEESH4wyp42V4tXvYsjUqAMR0iAlPIFAmLrn3IACgkQUqAMR0iA lPK7pBAAkcfykKgtRxvE65q06GsClGJMVM6wDe0iG0m71gRItz46Yly5HbuwaAwx 6DEQOlMnndjr8syznl/SoiIiAQcDGjzG8ZVcYw6JH4um03mk6uQw6YuKwxO8kieC 2/ZdFOVsHfui6lVXGxizi8UzT+oemXax5JsukOD5MsEOPAv+rw6vg5hrSiIFoQaO /nU8BeulfuZrnhz47xiNNxQWi7J3F0JVF4NlwK+avOhVw7kUgZcmsojQHopvQOxU e2HuByZ/9TkbNoQX/0ZX8aZ75XbebCfX9o39J4bLAUe4eqzOHDTEKg29BoXogSk4 NVjNVuVljmwcExox70Esst8Ckir2/DE7I5nKZ0/G+9JNoHKoHaG3rkZ3hqf5Q/Vh eahwRxab/NguUAZawk3NWpZ6B6dql8H6G+UhG0nsSTbUCLy5o02ynfai52TIhzb1 EPFVRSBWefiPHFtC86yyXE/3iZvgpJk72jXoVLEvBXHAGxkAD3UbaV+5PgYgFwNh TZO9u7tEe6Z67Cs3GZ7YfYPraULh5JmRkFgZMs04ycBRO9oQWdlaaR/UzZJ/P1TF IY8sYXDBFLeXGtDB65UMPlHymDm3Bcu0C7YSPa1rxuqlmsmDvYY/nxnDC/TOPYnp /jeRuoZ2IpuUL2XIHmIZQ6v8mYTetFkQMqC9qxZSCw3wqjW6Mwk= =PJYM -----END PGP SIGNATURE----- Merge tag 'printk-for-5.20-sane' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux Pull printk updates from Petr Mladek: - Allow reading kernel log in gdb even on 32 bits systems - More granular check of the buffer usage in printf selftest - Clang warning fix * tag 'printk-for-5.20-sane' of git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux: lib/test_printf.c: fix clang -Wformat warnings scripts/gdb: fix 'lx-dmesg' on 32 bits arch lib/test_printf.c: split write-beyond-buffer check in two
This commit is contained in:
commit
a1b02751d6
3 changed files with 32 additions and 12 deletions
|
@ -30,6 +30,12 @@
|
|||
#define PAD_SIZE 16
|
||||
#define FILL_CHAR '$'
|
||||
|
||||
#define NOWARN(option, comment, block) \
|
||||
__diag_push(); \
|
||||
__diag_ignore_all(#option, comment); \
|
||||
block \
|
||||
__diag_pop();
|
||||
|
||||
KSTM_MODULE_GLOBALS();
|
||||
|
||||
static char *test_buffer __initdata;
|
||||
|
@ -78,12 +84,17 @@ do_test(int bufsize, const char *expect, int elen,
|
|||
return 1;
|
||||
}
|
||||
|
||||
if (memchr_inv(test_buffer + written + 1, FILL_CHAR, BUF_SIZE + PAD_SIZE - (written + 1))) {
|
||||
if (memchr_inv(test_buffer + written + 1, FILL_CHAR, bufsize - (written + 1))) {
|
||||
pr_warn("vsnprintf(buf, %d, \"%s\", ...) wrote beyond the nul-terminator\n",
|
||||
bufsize, fmt);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (memchr_inv(test_buffer + bufsize, FILL_CHAR, BUF_SIZE + PAD_SIZE - bufsize)) {
|
||||
pr_warn("vsnprintf(buf, %d, \"%s\", ...) wrote beyond buffer\n", bufsize, fmt);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (memcmp(test_buffer, expect, written)) {
|
||||
pr_warn("vsnprintf(buf, %d, \"%s\", ...) wrote '%s', expected '%.*s'\n",
|
||||
bufsize, fmt, test_buffer, written, expect);
|
||||
|
@ -154,9 +165,11 @@ test_number(void)
|
|||
test("0x1234abcd ", "%#-12x", 0x1234abcd);
|
||||
test(" 0x1234abcd", "%#12x", 0x1234abcd);
|
||||
test("0|001| 12|+123| 1234|-123|-1234", "%d|%03d|%3d|%+d|% d|%+d|% d", 0, 1, 12, 123, 1234, -123, -1234);
|
||||
test("0|1|1|128|255", "%hhu|%hhu|%hhu|%hhu|%hhu", 0, 1, 257, 128, -1);
|
||||
test("0|1|1|-128|-1", "%hhd|%hhd|%hhd|%hhd|%hhd", 0, 1, 257, 128, -1);
|
||||
test("2015122420151225", "%ho%ho%#ho", 1037, 5282, -11627);
|
||||
NOWARN(-Wformat, "Intentionally test narrowing conversion specifiers.", {
|
||||
test("0|1|1|128|255", "%hhu|%hhu|%hhu|%hhu|%hhu", 0, 1, 257, 128, -1);
|
||||
test("0|1|1|-128|-1", "%hhd|%hhd|%hhd|%hhd|%hhd", 0, 1, 257, 128, -1);
|
||||
test("2015122420151225", "%ho%ho%#ho", 1037, 5282, -11627);
|
||||
})
|
||||
/*
|
||||
* POSIX/C99: »The result of converting zero with an explicit
|
||||
* precision of zero shall be no characters.« Hence the output
|
||||
|
|
|
@ -22,7 +22,6 @@ prb_desc_type = utils.CachedType("struct prb_desc")
|
|||
prb_desc_ring_type = utils.CachedType("struct prb_desc_ring")
|
||||
prb_data_ring_type = utils.CachedType("struct prb_data_ring")
|
||||
printk_ringbuffer_type = utils.CachedType("struct printk_ringbuffer")
|
||||
atomic_long_type = utils.CachedType("atomic_long_t")
|
||||
|
||||
class LxDmesg(gdb.Command):
|
||||
"""Print Linux kernel log buffer."""
|
||||
|
@ -68,8 +67,6 @@ class LxDmesg(gdb.Command):
|
|||
off = prb_data_ring_type.get_type()['data'].bitpos // 8
|
||||
text_data_addr = utils.read_ulong(text_data_ring, off)
|
||||
|
||||
counter_off = atomic_long_type.get_type()['counter'].bitpos // 8
|
||||
|
||||
sv_off = prb_desc_type.get_type()['state_var'].bitpos // 8
|
||||
|
||||
off = prb_desc_type.get_type()['text_blk_lpos'].bitpos // 8
|
||||
|
@ -89,9 +86,9 @@ class LxDmesg(gdb.Command):
|
|||
|
||||
# read in tail and head descriptor ids
|
||||
off = prb_desc_ring_type.get_type()['tail_id'].bitpos // 8
|
||||
tail_id = utils.read_u64(desc_ring, off + counter_off)
|
||||
tail_id = utils.read_atomic_long(desc_ring, off)
|
||||
off = prb_desc_ring_type.get_type()['head_id'].bitpos // 8
|
||||
head_id = utils.read_u64(desc_ring, off + counter_off)
|
||||
head_id = utils.read_atomic_long(desc_ring, off)
|
||||
|
||||
did = tail_id
|
||||
while True:
|
||||
|
@ -102,7 +99,7 @@ class LxDmesg(gdb.Command):
|
|||
desc = utils.read_memoryview(inf, desc_addr + desc_off, desc_sz).tobytes()
|
||||
|
||||
# skip non-committed record
|
||||
state = 3 & (utils.read_u64(desc, sv_off + counter_off) >> desc_flags_shift)
|
||||
state = 3 & (utils.read_atomic_long(desc, sv_off) >> desc_flags_shift)
|
||||
if state != desc_committed and state != desc_finalized:
|
||||
if did == head_id:
|
||||
break
|
||||
|
|
|
@ -35,13 +35,12 @@ class CachedType:
|
|||
|
||||
|
||||
long_type = CachedType("long")
|
||||
|
||||
atomic_long_type = CachedType("atomic_long_t")
|
||||
|
||||
def get_long_type():
|
||||
global long_type
|
||||
return long_type.get_type()
|
||||
|
||||
|
||||
def offset_of(typeobj, field):
|
||||
element = gdb.Value(0).cast(typeobj)
|
||||
return int(str(element[field].address).split()[0], 16)
|
||||
|
@ -129,6 +128,17 @@ def read_ulong(buffer, offset):
|
|||
else:
|
||||
return read_u32(buffer, offset)
|
||||
|
||||
atomic_long_counter_offset = atomic_long_type.get_type()['counter'].bitpos
|
||||
atomic_long_counter_sizeof = atomic_long_type.get_type()['counter'].type.sizeof
|
||||
|
||||
def read_atomic_long(buffer, offset):
|
||||
global atomic_long_counter_offset
|
||||
global atomic_long_counter_sizeof
|
||||
|
||||
if atomic_long_counter_sizeof == 8:
|
||||
return read_u64(buffer, offset + atomic_long_counter_offset)
|
||||
else:
|
||||
return read_u32(buffer, offset + atomic_long_counter_offset)
|
||||
|
||||
target_arch = None
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue