xref: /openbmc/linux/kernel/module/debug_kmemleak.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1*473c84d1SAaron Tomlin // SPDX-License-Identifier: GPL-2.0-or-later
2*473c84d1SAaron Tomlin /*
3*473c84d1SAaron Tomlin  * Module kmemleak support
4*473c84d1SAaron Tomlin  *
5*473c84d1SAaron Tomlin  * Copyright (C) 2009 Catalin Marinas
6*473c84d1SAaron Tomlin  */
7*473c84d1SAaron Tomlin 
8*473c84d1SAaron Tomlin #include <linux/module.h>
9*473c84d1SAaron Tomlin #include <linux/kmemleak.h>
10*473c84d1SAaron Tomlin #include "internal.h"
11*473c84d1SAaron Tomlin 
kmemleak_load_module(const struct module * mod,const struct load_info * info)12*473c84d1SAaron Tomlin void kmemleak_load_module(const struct module *mod,
13*473c84d1SAaron Tomlin 			  const struct load_info *info)
14*473c84d1SAaron Tomlin {
15*473c84d1SAaron Tomlin 	unsigned int i;
16*473c84d1SAaron Tomlin 
17*473c84d1SAaron Tomlin 	/* only scan the sections containing data */
18*473c84d1SAaron Tomlin 	kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL);
19*473c84d1SAaron Tomlin 
20*473c84d1SAaron Tomlin 	for (i = 1; i < info->hdr->e_shnum; i++) {
21*473c84d1SAaron Tomlin 		/* Scan all writable sections that's not executable */
22*473c84d1SAaron Tomlin 		if (!(info->sechdrs[i].sh_flags & SHF_ALLOC) ||
23*473c84d1SAaron Tomlin 		    !(info->sechdrs[i].sh_flags & SHF_WRITE) ||
24*473c84d1SAaron Tomlin 		    (info->sechdrs[i].sh_flags & SHF_EXECINSTR))
25*473c84d1SAaron Tomlin 			continue;
26*473c84d1SAaron Tomlin 
27*473c84d1SAaron Tomlin 		kmemleak_scan_area((void *)info->sechdrs[i].sh_addr,
28*473c84d1SAaron Tomlin 				   info->sechdrs[i].sh_size, GFP_KERNEL);
29*473c84d1SAaron Tomlin 	}
30*473c84d1SAaron Tomlin }
31