Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / scripts / gdb / linux / config.py
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()