Stephen Boyd | 90cf83db | 2019-05-14 15:45:53 -0700 | [diff] [blame] | 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: |
Kuan-Ying Lee | 8fe1ee5 | 2022-06-10 15:14:57 +0800 | [diff] [blame] | 27 | py_config_ptr = gdb.parse_and_eval("&kernel_config_data") |
| 28 | py_config_ptr_end = gdb.parse_and_eval("&kernel_config_data_end") |
| 29 | py_config_size = py_config_ptr_end - py_config_ptr |
Stephen Boyd | 90cf83db | 2019-05-14 15:45:53 -0700 | [diff] [blame] | 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() |