| # SPDX-License-Identifier: GPL-2.0 | |
| # | |
| # Copyright 2019 Google LLC. | |
| import gdb | |
| import zlib | |
| from linux import utils | |
| class LxConfigDump(gdb.Command): | |
| """Output kernel config to the filename specified as the command | |
| argument. Equivalent to 'zcat /proc/config.gz > config.txt' on | |
| a running target""" | |
| def __init__(self): | |
| super(LxConfigDump, self).__init__("lx-configdump", gdb.COMMAND_DATA, | |
| gdb.COMPLETE_FILENAME) | |
| def invoke(self, arg, from_tty): | |
| if len(arg) == 0: | |
| filename = "config.txt" | |
| else: | |
| filename = arg | |
| try: | |
| py_config_ptr = gdb.parse_and_eval("&kernel_config_data") | |
| py_config_ptr_end = gdb.parse_and_eval("&kernel_config_data_end") | |
| py_config_size = py_config_ptr_end - py_config_ptr | |
| except gdb.error as e: | |
| raise gdb.GdbError("Can't find config, enable CONFIG_IKCONFIG?") | |
| inf = gdb.inferiors()[0] | |
| zconfig_buf = utils.read_memoryview(inf, py_config_ptr, | |
| py_config_size).tobytes() | |
| config_buf = zlib.decompress(zconfig_buf, 16) | |
| with open(filename, 'wb') as f: | |
| f.write(config_buf) | |
| gdb.write("Dumped config to " + filename + "\n") | |
| LxConfigDump() |