diff options
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() | ||