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