diff options
author | Stephen Boyd <swboyd@chromium.org> | 2019-05-14 18:45:53 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-14 22:52:51 -0400 |
commit | 90cf83dbd2f08dd0513cd9f19155878c55acb445 (patch) | |
tree | 6b2c08671878264716015e365cc1af627c760c43 /scripts/gdb/linux/config.py | |
parent | dfe4529ee4d39d89f4725fa2599aa9bfa27e5847 (diff) |
scripts/gdb: add kernel config dumping command
lx-configdump <file> dumps the contents of the gzipped .config to a text
file when the config is included in the kernel with CONFIG_IKCONFIG. By
default, the file written is called config.txt, but it can be any user
supplied filename as well. If the kernel config is in a module
(configs.ko), then it can be loaded along with symbols for the module
loaded with 'lx-symbols' and then this command will still work.
Obviously if you have the whole vmlinux then this can also be achieved
with scripts/extract-ikconfig, but this gdb script can be useful to
confirm that the memory contents of the config in memory and the vmlinux
contents on disk match what is expected.
[swboyd@chromium.org: v2]
Link: http://lkml.kernel.org/r/20190329220844.38234-3-swboyd@chromium.org
Link: http://lkml.kernel.org/r/20190325184522.260535-3-swboyd@chromium.org
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
Cc: Douglas Anderson <dianders@chromium.org>
Cc: Nikolay Borisov <n.borisov.lkml@gmail.com>
Cc: Kieran Bingham <kbingham@kernel.org>
Cc: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Jackie Liu <liuyun01@kylinos.cn>
Cc: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'scripts/gdb/linux/config.py')
-rw-r--r-- | scripts/gdb/linux/config.py | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/scripts/gdb/linux/config.py b/scripts/gdb/linux/config.py new file mode 100644 index 000000000000..90e1565b1967 --- /dev/null +++ b/scripts/gdb/linux/config.py | |||
@@ -0,0 +1,44 @@ | |||
1 | # SPDX-License-Identifier: GPL-2.0 | ||
2 | # | ||
3 | # Copyright 2019 Google LLC. | ||
4 | |||
5 | import gdb | ||
6 | import zlib | ||
7 | |||
8 | from linux import utils | ||
9 | |||
10 | |||
11 | class LxConfigDump(gdb.Command): | ||
12 | """Output kernel config to the filename specified as the command | ||
13 | argument. Equivalent to 'zcat /proc/config.gz > config.txt' on | ||
14 | a running target""" | ||
15 | |||
16 | def __init__(self): | ||
17 | super(LxConfigDump, self).__init__("lx-configdump", gdb.COMMAND_DATA, | ||
18 | gdb.COMPLETE_FILENAME) | ||
19 | |||
20 | def invoke(self, arg, from_tty): | ||
21 | if len(arg) == 0: | ||
22 | filename = "config.txt" | ||
23 | else: | ||
24 | filename = arg | ||
25 | |||
26 | try: | ||
27 | py_config_ptr = gdb.parse_and_eval("kernel_config_data + 8") | ||
28 | py_config_size = gdb.parse_and_eval( | ||
29 | "sizeof(kernel_config_data) - 1 - 8 * 2") | ||
30 | except gdb.error as e: | ||
31 | raise gdb.GdbError("Can't find config, enable CONFIG_IKCONFIG?") | ||
32 | |||
33 | inf = gdb.inferiors()[0] | ||
34 | zconfig_buf = utils.read_memoryview(inf, py_config_ptr, | ||
35 | py_config_size).tobytes() | ||
36 | |||
37 | config_buf = zlib.decompress(zconfig_buf, 16) | ||
38 | with open(filename, 'wb') as f: | ||
39 | f.write(config_buf) | ||
40 | |||
41 | gdb.write("Dumped config to " + filename + "\n") | ||
42 | |||
43 | |||
44 | LxConfigDump() | ||