diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/extable.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/kernel/extable.c b/kernel/extable.c index e136ed8d82ba..c46da6a47036 100644 --- a/kernel/extable.c +++ b/kernel/extable.c | |||
@@ -41,6 +41,14 @@ const struct exception_table_entry *search_exception_tables(unsigned long addr) | |||
41 | return e; | 41 | return e; |
42 | } | 42 | } |
43 | 43 | ||
44 | static inline int init_kernel_text(unsigned long addr) | ||
45 | { | ||
46 | if (addr >= (unsigned long)_sinittext && | ||
47 | addr <= (unsigned long)_einittext) | ||
48 | return 1; | ||
49 | return 0; | ||
50 | } | ||
51 | |||
44 | __notrace_funcgraph int core_kernel_text(unsigned long addr) | 52 | __notrace_funcgraph int core_kernel_text(unsigned long addr) |
45 | { | 53 | { |
46 | if (addr >= (unsigned long)_stext && | 54 | if (addr >= (unsigned long)_stext && |
@@ -48,8 +56,7 @@ __notrace_funcgraph int core_kernel_text(unsigned long addr) | |||
48 | return 1; | 56 | return 1; |
49 | 57 | ||
50 | if (system_state == SYSTEM_BOOTING && | 58 | if (system_state == SYSTEM_BOOTING && |
51 | addr >= (unsigned long)_sinittext && | 59 | init_kernel_text(addr)) |
52 | addr <= (unsigned long)_einittext) | ||
53 | return 1; | 60 | return 1; |
54 | return 0; | 61 | return 0; |
55 | } | 62 | } |
@@ -58,7 +65,19 @@ __notrace_funcgraph int __kernel_text_address(unsigned long addr) | |||
58 | { | 65 | { |
59 | if (core_kernel_text(addr)) | 66 | if (core_kernel_text(addr)) |
60 | return 1; | 67 | return 1; |
61 | return __module_text_address(addr) != NULL; | 68 | if (__module_text_address(addr)) |
69 | return 1; | ||
70 | /* | ||
71 | * There might be init symbols in saved stacktraces. | ||
72 | * Give those symbols a chance to be printed in | ||
73 | * backtraces (such as lockdep traces). | ||
74 | * | ||
75 | * Since we are after the module-symbols check, there's | ||
76 | * no danger of address overlap: | ||
77 | */ | ||
78 | if (init_kernel_text(addr)) | ||
79 | return 1; | ||
80 | return 0; | ||
62 | } | 81 | } |
63 | 82 | ||
64 | int kernel_text_address(unsigned long addr) | 83 | int kernel_text_address(unsigned long addr) |