aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/kernel/entry.S
diff options
context:
space:
mode:
authorPrasanna S.P <prasanna@in.ibm.com>2006-09-26 04:52:34 -0400
committerAndi Kleen <andi@basil.nowhere.org>2006-09-26 04:52:34 -0400
commitd28c4393a7bf558538e9def269c1caeab6ec056f (patch)
treee5319c9b9c8a75d2290f7429ec84884d7e1a91fe /arch/x86_64/kernel/entry.S
parent3ca113ea74836a80645c79adba24caaa7a74120c (diff)
[PATCH] x86: error_code is not safe for kprobes
This patch moves the entry.S:error_entry to .kprobes.text section, since code marked unsafe for kprobes jumps directly to entry.S::error_entry, that must be marked unsafe as well. This patch also moves all the ".previous.text" asm directives to ".previous" for kprobes section. AK: Following a similar i386 patch from Chuck Ebbert AK: Also merged Jeremy's fix in. +From: Jeremy Fitzhardinge <jeremy@goop.org> KPROBE_ENTRY does a .section .kprobes.text, and expects its users to do a .previous at the end of the function. Unfortunately, if any code within the function switches sections, for example .fixup, then the .previous ends up putting all subsequent code into .fixup. Worse, any subsequent .fixup code gets intermingled with the code its supposed to be fixing (which is also in .fixup). It's surprising this didn't cause more havok. The fix is to use .pushsection/.popsection, so this stuff nests properly. A further cleanup would be to get rid of all .section/.previous pairs, since they're inherently fragile. +From: Chuck Ebbert <76306.1226@compuserve.com> Because code marked unsafe for kprobes jumps directly to entry.S::error_code, that must be marked unsafe as well. The easiest way to do that is to move the page fault entry point to just before error_code and let it inherit the same section. Also moved all the ".previous" asm directives for kprobes sections to column 1 and removed ".text" from them. Signed-off-by: Chuck Ebbert <76306.1226@compuserve.com> Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'arch/x86_64/kernel/entry.S')
-rw-r--r--arch/x86_64/kernel/entry.S19
1 files changed, 7 insertions, 12 deletions
diff --git a/arch/x86_64/kernel/entry.S b/arch/x86_64/kernel/entry.S
index 2092f565aa87..780f9b26169f 100644
--- a/arch/x86_64/kernel/entry.S
+++ b/arch/x86_64/kernel/entry.S
@@ -819,7 +819,7 @@ paranoid_schedule\trace:
819 * Exception entry point. This expects an error code/orig_rax on the stack 819 * Exception entry point. This expects an error code/orig_rax on the stack
820 * and the exception handler in %rax. 820 * and the exception handler in %rax.
821 */ 821 */
822ENTRY(error_entry) 822KPROBE_ENTRY(error_entry)
823 _frame RDI 823 _frame RDI
824 /* rdi slot contains rax, oldrax contains error code */ 824 /* rdi slot contains rax, oldrax contains error code */
825 cld 825 cld
@@ -903,7 +903,7 @@ error_kernelspace:
903 cmpq $gs_change,RIP(%rsp) 903 cmpq $gs_change,RIP(%rsp)
904 je error_swapgs 904 je error_swapgs
905 jmp error_sti 905 jmp error_sti
906END(error_entry) 906KPROBE_END(error_entry)
907 907
908 /* Reload gs selector with exception handling */ 908 /* Reload gs selector with exception handling */
909 /* edi: new selector */ 909 /* edi: new selector */
@@ -1025,8 +1025,7 @@ ENDPROC(execve)
1025 1025
1026KPROBE_ENTRY(page_fault) 1026KPROBE_ENTRY(page_fault)
1027 errorentry do_page_fault 1027 errorentry do_page_fault
1028END(page_fault) 1028KPROBE_END(page_fault)
1029 .previous .text
1030 1029
1031ENTRY(coprocessor_error) 1030ENTRY(coprocessor_error)
1032 zeroentry do_coprocessor_error 1031 zeroentry do_coprocessor_error
@@ -1047,8 +1046,7 @@ KPROBE_ENTRY(debug)
1047 CFI_ADJUST_CFA_OFFSET 8 1046 CFI_ADJUST_CFA_OFFSET 8
1048 paranoidentry do_debug, DEBUG_STACK 1047 paranoidentry do_debug, DEBUG_STACK
1049 paranoidexit 1048 paranoidexit
1050END(debug) 1049KPROBE_END(debug)
1051 .previous .text
1052 1050
1053 /* runs on exception stack */ 1051 /* runs on exception stack */
1054KPROBE_ENTRY(nmi) 1052KPROBE_ENTRY(nmi)
@@ -1062,8 +1060,7 @@ KPROBE_ENTRY(nmi)
1062 jmp paranoid_exit1 1060 jmp paranoid_exit1
1063 CFI_ENDPROC 1061 CFI_ENDPROC
1064#endif 1062#endif
1065END(nmi) 1063KPROBE_END(nmi)
1066 .previous .text
1067 1064
1068KPROBE_ENTRY(int3) 1065KPROBE_ENTRY(int3)
1069 INTR_FRAME 1066 INTR_FRAME
@@ -1072,8 +1069,7 @@ KPROBE_ENTRY(int3)
1072 paranoidentry do_int3, DEBUG_STACK 1069 paranoidentry do_int3, DEBUG_STACK
1073 jmp paranoid_exit1 1070 jmp paranoid_exit1
1074 CFI_ENDPROC 1071 CFI_ENDPROC
1075END(int3) 1072KPROBE_END(int3)
1076 .previous .text
1077 1073
1078ENTRY(overflow) 1074ENTRY(overflow)
1079 zeroentry do_overflow 1075 zeroentry do_overflow
@@ -1121,8 +1117,7 @@ END(stack_segment)
1121 1117
1122KPROBE_ENTRY(general_protection) 1118KPROBE_ENTRY(general_protection)
1123 errorentry do_general_protection 1119 errorentry do_general_protection
1124END(general_protection) 1120KPROBE_END(general_protection)
1125 .previous .text
1126 1121
1127ENTRY(alignment_check) 1122ENTRY(alignment_check)
1128 errorentry do_alignment_check 1123 errorentry do_alignment_check