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