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