Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

kprobes/x86: Remove jprobe implementation

Remove arch dependent setjump/longjump functions
and unused fields in kprobe_ctlblk for jprobes
from arch/x86.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: linux-arch@vger.kernel.org
Link: https://lore.kernel.org/lkml/152942433578.15209.14034551799624757792.stgit@devbox
Signed-off-by: Ingo Molnar <mingo@kernel.org>

authored by

Masami Hiramatsu and committed by
Ingo Molnar
80006dbe 5a6cf77f

+3 -96
-3
arch/x86/include/asm/kprobes.h
··· 111 111 unsigned long kprobe_status; 112 112 unsigned long kprobe_old_flags; 113 113 unsigned long kprobe_saved_flags; 114 - unsigned long *jprobe_saved_sp; 115 - struct pt_regs jprobe_saved_regs; 116 - kprobe_opcode_t jprobes_stack[MAX_STACK_SIZE]; 117 114 struct prev_kprobe prev_kprobe; 118 115 }; 119 116
+3 -93
arch/x86/kernel/kprobes/core.c
··· 66 66 67 67 #include "common.h" 68 68 69 - void jprobe_return_end(void); 70 - 71 69 DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL; 72 70 DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); 73 71 ··· 688 690 /* 689 691 * If we have no pre-handler or it returned 0, we 690 692 * continue with normal processing. If we have a 691 - * pre-handler and it returned non-zero, it prepped 692 - * for calling the break_handler below on re-entry 693 - * for jprobe processing, so get out doing nothing 694 - * more here. 693 + * pre-handler and it returned non-zero, that means 694 + * user handler setup registers to exit to another 695 + * instruction, we must skip the single stepping. 695 696 */ 696 697 if (!p->pre_handler || !p->pre_handler(p, regs)) 697 698 setup_singlestep(p, regs, kcb, 0); ··· 1079 1082 return ret; 1080 1083 } 1081 1084 NOKPROBE_SYMBOL(kprobe_exceptions_notify); 1082 - 1083 - int setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) 1084 - { 1085 - struct jprobe *jp = container_of(p, struct jprobe, kp); 1086 - unsigned long addr; 1087 - struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); 1088 - 1089 - kcb->jprobe_saved_regs = *regs; 1090 - kcb->jprobe_saved_sp = stack_addr(regs); 1091 - addr = (unsigned long)(kcb->jprobe_saved_sp); 1092 - 1093 - /* 1094 - * As Linus pointed out, gcc assumes that the callee 1095 - * owns the argument space and could overwrite it, e.g. 1096 - * tailcall optimization. So, to be absolutely safe 1097 - * we also save and restore enough stack bytes to cover 1098 - * the argument area. 1099 - * Use __memcpy() to avoid KASAN stack out-of-bounds reports as we copy 1100 - * raw stack chunk with redzones: 1101 - */ 1102 - __memcpy(kcb->jprobes_stack, (kprobe_opcode_t *)addr, MIN_STACK_SIZE(addr)); 1103 - regs->ip = (unsigned long)(jp->entry); 1104 - 1105 - /* 1106 - * jprobes use jprobe_return() which skips the normal return 1107 - * path of the function, and this messes up the accounting of the 1108 - * function graph tracer to get messed up. 1109 - * 1110 - * Pause function graph tracing while performing the jprobe function. 1111 - */ 1112 - pause_graph_tracing(); 1113 - return 1; 1114 - } 1115 - NOKPROBE_SYMBOL(setjmp_pre_handler); 1116 - 1117 - void jprobe_return(void) 1118 - { 1119 - struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); 1120 - 1121 - /* Unpoison stack redzones in the frames we are going to jump over. */ 1122 - kasan_unpoison_stack_above_sp_to(kcb->jprobe_saved_sp); 1123 - 1124 - asm volatile ( 1125 - #ifdef CONFIG_X86_64 1126 - " xchg %%rbx,%%rsp \n" 1127 - #else 1128 - " xchgl %%ebx,%%esp \n" 1129 - #endif 1130 - " int3 \n" 1131 - " .globl jprobe_return_end\n" 1132 - " jprobe_return_end: \n" 1133 - " nop \n"::"b" 1134 - (kcb->jprobe_saved_sp):"memory"); 1135 - } 1136 - NOKPROBE_SYMBOL(jprobe_return); 1137 - NOKPROBE_SYMBOL(jprobe_return_end); 1138 - 1139 - int longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) 1140 - { 1141 - struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); 1142 - u8 *addr = (u8 *) (regs->ip - 1); 1143 - struct jprobe *jp = container_of(p, struct jprobe, kp); 1144 - void *saved_sp = kcb->jprobe_saved_sp; 1145 - 1146 - if ((addr > (u8 *) jprobe_return) && 1147 - (addr < (u8 *) jprobe_return_end)) { 1148 - if (stack_addr(regs) != saved_sp) { 1149 - struct pt_regs *saved_regs = &kcb->jprobe_saved_regs; 1150 - printk(KERN_ERR 1151 - "current sp %p does not match saved sp %p\n", 1152 - stack_addr(regs), saved_sp); 1153 - printk(KERN_ERR "Saved registers for jprobe %p\n", jp); 1154 - show_regs(saved_regs); 1155 - printk(KERN_ERR "Current registers\n"); 1156 - show_regs(regs); 1157 - BUG(); 1158 - } 1159 - /* It's OK to start function graph tracing again */ 1160 - unpause_graph_tracing(); 1161 - *regs = kcb->jprobe_saved_regs; 1162 - __memcpy(saved_sp, kcb->jprobes_stack, MIN_STACK_SIZE(saved_sp)); 1163 - preempt_enable_no_resched(); 1164 - return 1; 1165 - } 1166 - return 0; 1167 - } 1168 - NOKPROBE_SYMBOL(longjmp_break_handler); 1169 1085 1170 1086 bool arch_within_kprobe_blacklist(unsigned long addr) 1171 1087 {