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   */
kdb_lsmod(int argc,const char ** argv)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