1*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# Copyright 2019 Google LLC. 4*4882a593Smuzhiyun 5*4882a593Smuzhiyunimport gdb 6*4882a593Smuzhiyunimport zlib 7*4882a593Smuzhiyun 8*4882a593Smuzhiyunfrom linux import utils 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun 11*4882a593Smuzhiyunclass LxConfigDump(gdb.Command): 12*4882a593Smuzhiyun """Output kernel config to the filename specified as the command 13*4882a593Smuzhiyun argument. Equivalent to 'zcat /proc/config.gz > config.txt' on 14*4882a593Smuzhiyun a running target""" 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun def __init__(self): 17*4882a593Smuzhiyun super(LxConfigDump, self).__init__("lx-configdump", gdb.COMMAND_DATA, 18*4882a593Smuzhiyun gdb.COMPLETE_FILENAME) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun def invoke(self, arg, from_tty): 21*4882a593Smuzhiyun if len(arg) == 0: 22*4882a593Smuzhiyun filename = "config.txt" 23*4882a593Smuzhiyun else: 24*4882a593Smuzhiyun filename = arg 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun try: 27*4882a593Smuzhiyun py_config_ptr = gdb.parse_and_eval("&kernel_config_data") 28*4882a593Smuzhiyun py_config_ptr_end = gdb.parse_and_eval("&kernel_config_data_end") 29*4882a593Smuzhiyun py_config_size = py_config_ptr_end - py_config_ptr 30*4882a593Smuzhiyun except gdb.error as e: 31*4882a593Smuzhiyun raise gdb.GdbError("Can't find config, enable CONFIG_IKCONFIG?") 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun inf = gdb.inferiors()[0] 34*4882a593Smuzhiyun zconfig_buf = utils.read_memoryview(inf, py_config_ptr, 35*4882a593Smuzhiyun py_config_size).tobytes() 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun config_buf = zlib.decompress(zconfig_buf, 16) 38*4882a593Smuzhiyun with open(filename, 'wb') as f: 39*4882a593Smuzhiyun f.write(config_buf) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun gdb.write("Dumped config to " + filename + "\n") 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun 44*4882a593SmuzhiyunLxConfigDump() 45