@@ -811,18 +811,6 @@ set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
811811 = (regs -> flags & X86_EFLAGS_IF );
812812}
813813
814- void arch_prepare_kretprobe (struct kretprobe_instance * ri , struct pt_regs * regs )
815- {
816- unsigned long * sara = stack_addr (regs );
817-
818- ri -> ret_addr = (kprobe_opcode_t * ) * sara ;
819- ri -> fp = sara ;
820-
821- /* Replace the return addr with trampoline addr */
822- * sara = (unsigned long ) & __kretprobe_trampoline ;
823- }
824- NOKPROBE_SYMBOL (arch_prepare_kretprobe );
825-
826814static void kprobe_post_process (struct kprobe * cur , struct pt_regs * regs ,
827815 struct kprobe_ctlblk * kcb )
828816{
@@ -1023,101 +1011,6 @@ int kprobe_int3_handler(struct pt_regs *regs)
10231011}
10241012NOKPROBE_SYMBOL (kprobe_int3_handler );
10251013
1026- /*
1027- * When a retprobed function returns, this code saves registers and
1028- * calls trampoline_handler() runs, which calls the kretprobe's handler.
1029- */
1030- asm(
1031- ".text\n"
1032- ".global __kretprobe_trampoline\n"
1033- ".type __kretprobe_trampoline, @function\n"
1034- "__kretprobe_trampoline:\n"
1035- #ifdef CONFIG_X86_64
1036- ANNOTATE_NOENDBR
1037- /* Push a fake return address to tell the unwinder it's a kretprobe. */
1038- " pushq $__kretprobe_trampoline\n"
1039- UNWIND_HINT_FUNC
1040- /* Save the 'sp - 8', this will be fixed later. */
1041- " pushq %rsp\n"
1042- " pushfq\n"
1043- SAVE_REGS_STRING
1044- " movq %rsp, %rdi\n"
1045- " call trampoline_handler\n"
1046- RESTORE_REGS_STRING
1047- /* In trampoline_handler(), 'regs->flags' is copied to 'regs->sp'. */
1048- " addq $8, %rsp\n"
1049- " popfq\n"
1050- #else
1051- /* Push a fake return address to tell the unwinder it's a kretprobe. */
1052- " pushl $__kretprobe_trampoline\n"
1053- UNWIND_HINT_FUNC
1054- /* Save the 'sp - 4', this will be fixed later. */
1055- " pushl %esp\n"
1056- " pushfl\n"
1057- SAVE_REGS_STRING
1058- " movl %esp, %eax\n"
1059- " call trampoline_handler\n"
1060- RESTORE_REGS_STRING
1061- /* In trampoline_handler(), 'regs->flags' is copied to 'regs->sp'. */
1062- " addl $4, %esp\n"
1063- " popfl\n"
1064- #endif
1065- ASM_RET
1066- ".size __kretprobe_trampoline, .-__kretprobe_trampoline\n"
1067- );
1068- NOKPROBE_SYMBOL (__kretprobe_trampoline );
1069- /*
1070- * __kretprobe_trampoline() skips updating frame pointer. The frame pointer
1071- * saved in trampoline_handler() points to the real caller function's
1072- * frame pointer. Thus the __kretprobe_trampoline() doesn't have a
1073- * standard stack frame with CONFIG_FRAME_POINTER=y.
1074- * Let's mark it non-standard function. Anyway, FP unwinder can correctly
1075- * unwind without the hint.
1076- */
1077- STACK_FRAME_NON_STANDARD_FP (__kretprobe_trampoline );
1078-
1079- /* This is called from kretprobe_trampoline_handler(). */
1080- void arch_kretprobe_fixup_return (struct pt_regs * regs ,
1081- kprobe_opcode_t * correct_ret_addr )
1082- {
1083- unsigned long * frame_pointer = & regs -> sp + 1 ;
1084-
1085- /* Replace fake return address with real one. */
1086- * frame_pointer = (unsigned long )correct_ret_addr ;
1087- }
1088-
1089- /*
1090- * Called from __kretprobe_trampoline
1091- */
1092- __used __visible void trampoline_handler (struct pt_regs * regs )
1093- {
1094- unsigned long * frame_pointer ;
1095-
1096- /* fixup registers */
1097- regs -> cs = __KERNEL_CS ;
1098- #ifdef CONFIG_X86_32
1099- regs -> gs = 0 ;
1100- #endif
1101- regs -> ip = (unsigned long )& __kretprobe_trampoline ;
1102- regs -> orig_ax = ~0UL ;
1103- regs -> sp += sizeof (long );
1104- frame_pointer = & regs -> sp + 1 ;
1105-
1106- /*
1107- * The return address at 'frame_pointer' is recovered by the
1108- * arch_kretprobe_fixup_return() which called from the
1109- * kretprobe_trampoline_handler().
1110- */
1111- kretprobe_trampoline_handler (regs , frame_pointer );
1112-
1113- /*
1114- * Copy FLAGS to 'pt_regs::sp' so that __kretprobe_trapmoline()
1115- * can do RET right after POPF.
1116- */
1117- regs -> sp = regs -> flags ;
1118- }
1119- NOKPROBE_SYMBOL (trampoline_handler );
1120-
11211014int kprobe_fault_handler (struct pt_regs * regs , int trapnr )
11221015{
11231016 struct kprobe * cur = kprobe_running ();
0 commit comments