Commit a2da4052f1df6bc77749f84496fe731ab8b458f7

Authored by Rusty Russell
1 parent 8561b089af

module: Don't report discarded init pages as kernel text.

Current code could cause a bug in symbol_put_addr() if an arch used
kmalloc module text: we might think the symbol belongs to the core
kernel.

The downside is that this might make backtraces through (discarded)
init functions harder to read on some archs, but we already have that
issue for modules and noone has complained.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

Showing 1 changed file with 2 additions and 1 deletions Inline Diff

1 /* Rewritten by Rusty Russell, on the backs of many others... 1 /* Rewritten by Rusty Russell, on the backs of many others...
2 Copyright (C) 2001 Rusty Russell, 2002 Rusty Russell IBM. 2 Copyright (C) 2001 Rusty Russell, 2002 Rusty Russell IBM.
3 3
4 This program is free software; you can redistribute it and/or modify 4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by 5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or 6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version. 7 (at your option) any later version.
8 8
9 This program is distributed in the hope that it will be useful, 9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details. 12 GNU General Public License for more details.
13 13
14 You should have received a copy of the GNU General Public License 14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software 15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */ 17 */
18 #include <linux/module.h> 18 #include <linux/module.h>
19 #include <linux/init.h> 19 #include <linux/init.h>
20 #include <asm/uaccess.h> 20 #include <asm/uaccess.h>
21 #include <asm/sections.h> 21 #include <asm/sections.h>
22 22
23 extern struct exception_table_entry __start___ex_table[]; 23 extern struct exception_table_entry __start___ex_table[];
24 extern struct exception_table_entry __stop___ex_table[]; 24 extern struct exception_table_entry __stop___ex_table[];
25 25
26 /* Sort the kernel's built-in exception table */ 26 /* Sort the kernel's built-in exception table */
27 void __init sort_main_extable(void) 27 void __init sort_main_extable(void)
28 { 28 {
29 sort_extable(__start___ex_table, __stop___ex_table); 29 sort_extable(__start___ex_table, __stop___ex_table);
30 } 30 }
31 31
32 /* Given an address, look for it in the exception tables. */ 32 /* Given an address, look for it in the exception tables. */
33 const struct exception_table_entry *search_exception_tables(unsigned long addr) 33 const struct exception_table_entry *search_exception_tables(unsigned long addr)
34 { 34 {
35 const struct exception_table_entry *e; 35 const struct exception_table_entry *e;
36 36
37 e = search_extable(__start___ex_table, __stop___ex_table-1, addr); 37 e = search_extable(__start___ex_table, __stop___ex_table-1, addr);
38 if (!e) 38 if (!e)
39 e = search_module_extables(addr); 39 e = search_module_extables(addr);
40 return e; 40 return e;
41 } 41 }
42 42
43 int core_kernel_text(unsigned long addr) 43 int core_kernel_text(unsigned long addr)
44 { 44 {
45 if (addr >= (unsigned long)_stext && 45 if (addr >= (unsigned long)_stext &&
46 addr <= (unsigned long)_etext) 46 addr <= (unsigned long)_etext)
47 return 1; 47 return 1;
48 48
49 if (addr >= (unsigned long)_sinittext && 49 if (system_state == SYSTEM_BOOTING &&
50 addr >= (unsigned long)_sinittext &&
50 addr <= (unsigned long)_einittext) 51 addr <= (unsigned long)_einittext)
51 return 1; 52 return 1;
52 return 0; 53 return 0;
53 } 54 }
54 55
55 int __kernel_text_address(unsigned long addr) 56 int __kernel_text_address(unsigned long addr)
56 { 57 {
57 if (core_kernel_text(addr)) 58 if (core_kernel_text(addr))
58 return 1; 59 return 1;
59 return __module_text_address(addr) != NULL; 60 return __module_text_address(addr) != NULL;
60 } 61 }
61 62
62 int kernel_text_address(unsigned long addr) 63 int kernel_text_address(unsigned long addr)
63 { 64 {
64 if (core_kernel_text(addr)) 65 if (core_kernel_text(addr))
65 return 1; 66 return 1;
66 return module_text_address(addr) != NULL; 67 return module_text_address(addr) != NULL;
67 } 68 }
68 69