1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* |
3 | * Module kdb support |
4 | * |
5 | * Copyright (C) 2010 Jason Wessel |
6 | */ |
7 | |
8 | #include <linux/module.h> |
9 | #include <linux/kdb.h> |
10 | #include "internal.h" |
11 | |
12 | /* |
13 | * kdb_lsmod - This function implements the 'lsmod' command. Lists |
14 | * currently loaded kernel modules. |
15 | * Mostly taken from userland lsmod. |
16 | */ |
17 | int kdb_lsmod(int argc, const char **argv) |
18 | { |
19 | struct module *mod; |
20 | |
21 | if (argc != 0) |
22 | return KDB_ARGCOUNT; |
23 | |
24 | kdb_printf("Module Size modstruct Used by\n" ); |
25 | list_for_each_entry(mod, &modules, list) { |
26 | if (mod->state == MODULE_STATE_UNFORMED) |
27 | continue; |
28 | |
29 | kdb_printf("%-20s%8u" , mod->name, mod->mem[MOD_TEXT].size); |
30 | kdb_printf("/%8u" , mod->mem[MOD_RODATA].size); |
31 | kdb_printf("/%8u" , mod->mem[MOD_RO_AFTER_INIT].size); |
32 | kdb_printf("/%8u" , mod->mem[MOD_DATA].size); |
33 | |
34 | kdb_printf(" 0x%px " , (void *)mod); |
35 | #ifdef CONFIG_MODULE_UNLOAD |
36 | kdb_printf("%4d " , module_refcount(mod)); |
37 | #endif |
38 | if (mod->state == MODULE_STATE_GOING) |
39 | kdb_printf(" (Unloading)" ); |
40 | else if (mod->state == MODULE_STATE_COMING) |
41 | kdb_printf(" (Loading)" ); |
42 | else |
43 | kdb_printf(" (Live)" ); |
44 | kdb_printf(" 0x%px" , mod->mem[MOD_TEXT].base); |
45 | kdb_printf("/0x%px" , mod->mem[MOD_RODATA].base); |
46 | kdb_printf("/0x%px" , mod->mem[MOD_RO_AFTER_INIT].base); |
47 | kdb_printf("/0x%px" , mod->mem[MOD_DATA].base); |
48 | |
49 | #ifdef CONFIG_MODULE_UNLOAD |
50 | { |
51 | struct module_use *use; |
52 | |
53 | kdb_printf(" [ " ); |
54 | list_for_each_entry(use, &mod->source_list, |
55 | source_list) |
56 | kdb_printf("%s " , use->target->name); |
57 | kdb_printf("]\n" ); |
58 | } |
59 | #endif |
60 | } |
61 | |
62 | return 0; |
63 | } |
64 | |