diff options
| -rw-r--r-- | arch/x86/include/asm/sections.h | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/kprobes/core.c | 10 | ||||
| -rw-r--r-- | arch/x86/kernel/vmlinux.lds.S | 2 |
3 files changed, 12 insertions, 1 deletions
diff --git a/arch/x86/include/asm/sections.h b/arch/x86/include/asm/sections.h index d6baf23782bc..5c019d23d06b 100644 --- a/arch/x86/include/asm/sections.h +++ b/arch/x86/include/asm/sections.h | |||
| @@ -10,6 +10,7 @@ extern struct exception_table_entry __stop___ex_table[]; | |||
| 10 | 10 | ||
| 11 | #if defined(CONFIG_X86_64) | 11 | #if defined(CONFIG_X86_64) |
| 12 | extern char __end_rodata_hpage_align[]; | 12 | extern char __end_rodata_hpage_align[]; |
| 13 | extern char __entry_trampoline_start[], __entry_trampoline_end[]; | ||
| 13 | #endif | 14 | #endif |
| 14 | 15 | ||
| 15 | #endif /* _ASM_X86_SECTIONS_H */ | 16 | #endif /* _ASM_X86_SECTIONS_H */ |
diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c index bd36f3c33cd0..0715f827607c 100644 --- a/arch/x86/kernel/kprobes/core.c +++ b/arch/x86/kernel/kprobes/core.c | |||
| @@ -1168,10 +1168,18 @@ NOKPROBE_SYMBOL(longjmp_break_handler); | |||
| 1168 | 1168 | ||
| 1169 | bool arch_within_kprobe_blacklist(unsigned long addr) | 1169 | bool arch_within_kprobe_blacklist(unsigned long addr) |
| 1170 | { | 1170 | { |
| 1171 | bool is_in_entry_trampoline_section = false; | ||
| 1172 | |||
| 1173 | #ifdef CONFIG_X86_64 | ||
| 1174 | is_in_entry_trampoline_section = | ||
| 1175 | (addr >= (unsigned long)__entry_trampoline_start && | ||
| 1176 | addr < (unsigned long)__entry_trampoline_end); | ||
| 1177 | #endif | ||
| 1171 | return (addr >= (unsigned long)__kprobes_text_start && | 1178 | return (addr >= (unsigned long)__kprobes_text_start && |
| 1172 | addr < (unsigned long)__kprobes_text_end) || | 1179 | addr < (unsigned long)__kprobes_text_end) || |
| 1173 | (addr >= (unsigned long)__entry_text_start && | 1180 | (addr >= (unsigned long)__entry_text_start && |
| 1174 | addr < (unsigned long)__entry_text_end); | 1181 | addr < (unsigned long)__entry_text_end) || |
| 1182 | is_in_entry_trampoline_section; | ||
| 1175 | } | 1183 | } |
| 1176 | 1184 | ||
| 1177 | int __init arch_init_kprobes(void) | 1185 | int __init arch_init_kprobes(void) |
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 9b138a06c1a4..b854ebf5851b 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S | |||
| @@ -118,9 +118,11 @@ SECTIONS | |||
| 118 | 118 | ||
| 119 | #ifdef CONFIG_X86_64 | 119 | #ifdef CONFIG_X86_64 |
| 120 | . = ALIGN(PAGE_SIZE); | 120 | . = ALIGN(PAGE_SIZE); |
| 121 | VMLINUX_SYMBOL(__entry_trampoline_start) = .; | ||
| 121 | _entry_trampoline = .; | 122 | _entry_trampoline = .; |
| 122 | *(.entry_trampoline) | 123 | *(.entry_trampoline) |
| 123 | . = ALIGN(PAGE_SIZE); | 124 | . = ALIGN(PAGE_SIZE); |
| 125 | VMLINUX_SYMBOL(__entry_trampoline_end) = .; | ||
| 124 | ASSERT(. - _entry_trampoline == PAGE_SIZE, "entry trampoline is too big"); | 126 | ASSERT(. - _entry_trampoline == PAGE_SIZE, "entry trampoline is too big"); |
| 125 | #endif | 127 | #endif |
| 126 | 128 | ||
