linux-kselftest.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: peterz@infradead.org (Peter Zijlstra)
Subject: [RFC][PATCH 1/2] x86: Allow breakpoints to emulate call functions
Date: Thu, 2 May 2019 22:21:46 +0200	[thread overview]
Message-ID: <20190502202146.GZ2623@hirez.programming.kicks-ass.net> (raw)
Message-ID: <20190502202146._9u4Vp7s_I4ogF885mpFXar44RvntMn7IPwPRhuxOvM@z> (raw)
In-Reply-To: <CAHk-=wi6A9tgw=kkPh5Ywqt687VvsVEjYXVkAnq0jpt0u0tk6g@mail.gmail.com>

On Thu, May 02, 2019@11:43:37AM -0700, Linus Torvalds wrote:
> What would it look like with the "int3-from-kernel is special" modification?

Something like so; it boots; but I could've made some horrible mistake
(again).

---
diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
index 7b23431be5cb..4de51cff5b8a 100644
--- a/arch/x86/entry/entry_32.S
+++ b/arch/x86/entry/entry_32.S
@@ -67,9 +67,20 @@
 # define preempt_stop(clobbers)	DISABLE_INTERRUPTS(clobbers); TRACE_IRQS_OFF
 #else
 # define preempt_stop(clobbers)
-# define resume_kernel		restore_all_kernel
 #endif
 
+.macro RETINT_PREEMPT
+#ifdef CONFIG_PREEMPT
+	DISABLE_INTERRUPTS(CLBR_ANY)
+	cmpl	$0, PER_CPU_VAR(__preempt_count)
+	jnz	.Lend_\@
+	testl	$X86_EFLAGS_IF, PT_EFLAGS(%esp)	# interrupts off (exception path) ?
+	jz	.Lend_\@
+	call	preempt_schedule_irq
+.Lend_\@:
+#endif
+.endm
+
 .macro TRACE_IRQS_IRET
 #ifdef CONFIG_TRACE_IRQFLAGS
 	testl	$X86_EFLAGS_IF, PT_EFLAGS(%esp)     # interrupts off?
@@ -755,7 +766,7 @@ END(ret_from_fork)
 	andl	$SEGMENT_RPL_MASK, %eax
 #endif
 	cmpl	$USER_RPL, %eax
-	jb	resume_kernel			# not returning to v8086 or userspace
+	jb	restore_all_kernel		# not returning to v8086 or userspace
 
 ENTRY(resume_userspace)
 	DISABLE_INTERRUPTS(CLBR_ANY)
@@ -765,18 +776,6 @@ ENTRY(resume_userspace)
 	jmp	restore_all
 END(ret_from_exception)
 
-#ifdef CONFIG_PREEMPT
-ENTRY(resume_kernel)
-	DISABLE_INTERRUPTS(CLBR_ANY)
-	cmpl	$0, PER_CPU_VAR(__preempt_count)
-	jnz	restore_all_kernel
-	testl	$X86_EFLAGS_IF, PT_EFLAGS(%esp)	# interrupts off (exception path) ?
-	jz	restore_all_kernel
-	call	preempt_schedule_irq
-	jmp	restore_all_kernel
-END(resume_kernel)
-#endif
-
 GLOBAL(__begin_SYSENTER_singlestep_region)
 /*
  * All code from here through __end_SYSENTER_singlestep_region is subject
@@ -1027,6 +1026,7 @@ ENTRY(entry_INT80_32)
 	INTERRUPT_RETURN
 
 restore_all_kernel:
+	RETINT_PREEMPT
 	TRACE_IRQS_IRET
 	PARANOID_EXIT_TO_KERNEL_MODE
 	BUG_IF_WRONG_CR3
@@ -1477,6 +1477,94 @@ END(nmi)
 
 ENTRY(int3)
 	ASM_CLAC
+
+#ifdef CONFIG_VM86
+	testl	$X86_EFLAGS_VM, 8(%esp)
+	jnz	.Lfrom_usermode_no_gap
+#endif
+	testl	$SEGMENT_RPL_MASK, 4(%esp)
+	jnz	.Lfrom_usermode_no_gap
+
+	/*
+	 * Here from kernel mode; so the (exception) stack looks like:
+	 *
+	 * 12(esp) - <previous context>
+	 *  8(esp) - flags
+	 *  4(esp) - cs
+	 *  0(esp) - ip
+	 *
+	 * Lets build a 5 entry IRET frame after that, such that struct pt_regs
+	 * is complete and in particular regs->sp is correct. This gives us
+	 * the original 3 enties as gap:
+	 *
+	 * 32(esp) - <previous context>
+	 * 28(esp) - orig_flags / gap
+	 * 24(esp) - orig_cs	/ gap
+	 * 20(esp) - orig_ip	/ gap
+	 * 16(esp) - ss
+	 * 12(esp) - sp
+	 *  8(esp) - flags
+	 *  4(esp) - cs
+	 *  0(esp) - ip
+	 */
+	pushl	%ss	  # ss
+	pushl	%esp      # sp (points at ss)
+	pushl	4*4(%esp) # flags
+	pushl	4*4(%esp) # cs
+	pushl	4*4(%esp) # ip
+
+	add	$16, 12(%esp) # point sp back at the previous context
+
+	pushl	$-1				# orig_eax; mark as interrupt
+
+	SAVE_ALL
+	ENCODE_FRAME_POINTER
+	TRACE_IRQS_OFF
+	xorl	%edx, %edx			# zero error code
+	movl	%esp, %eax			# pt_regs pointer
+	call	do_int3
+
+	RETINT_PREEMPT
+	TRACE_IRQS_IRET
+	/*
+	 * If we really never INT3 from entry code, it looks like
+	 * we can skip this one.
+	PARANOID_EXIT_TO_KERNEL_MODE
+	 */
+	BUG_IF_WRONG_CR3
+	RESTORE_REGS 4				# consume orig_eax
+
+	/*
+	 * Reconstruct the 3 entry IRET frame right after the (modified)
+	 * regs->sp without lowering %esp in between, such that an NMI in the
+	 * middle doesn't scribble our stack.
+	 */
+
+	pushl	%eax
+	pushl	%ecx
+	movl	5*4(%esp), %eax		# (modified) regs->sp
+
+	movl	4*4(%esp), %ecx		# flags
+	movl	%ecx, -4(%eax)
+
+	movl	3*4(%esp), %ecx		# cs
+	andl	$0x0000ffff, %ecx
+	movl	%ecx, -8(%eax)
+
+	movl	2*4(%esp), %ecx		# ip
+	movl	%ecx, -12(%eax)
+
+	movl	1*4(%esp), %ecx		# eax
+	movl	%ecx, -16(%eax)
+
+	popl	%ecx
+	lea	-16(%eax), %esp
+	popl	%eax
+
+	jmp	.Lirq_return
+
+.Lfrom_usermode_no_gap:
+
 	pushl	$-1				# mark this as an int
 
 	SAVE_ALL switch_stacks=1

  parent reply	other threads:[~2019-05-02 20:21 UTC|newest]

Thread overview: 204+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20190501202830.347656894@goodmis.org>
2019-05-01 20:28 ` [RFC][PATCH 1/2] x86: Allow breakpoints to emulate call functions rostedt
2019-05-01 20:28   ` Steven Rostedt
2019-05-02  3:24   ` rostedt
2019-05-02  3:24     ` Steven Rostedt
2019-05-02 16:21     ` peterz
2019-05-02 16:21       ` Peter Zijlstra
2019-05-02 16:29       ` peterz
2019-05-02 16:29         ` Peter Zijlstra
2019-05-02 18:02       ` torvalds
2019-05-02 18:02         ` Linus Torvalds
2019-05-02 18:18         ` peterz
2019-05-02 18:18           ` Peter Zijlstra
2019-05-02 18:30           ` peterz
2019-05-02 18:30             ` Peter Zijlstra
2019-05-02 18:43           ` torvalds
2019-05-02 18:43             ` Linus Torvalds
2019-05-02 19:28             ` jikos
2019-05-02 19:28               ` Jiri Kosina
2019-05-02 20:25               ` luto
2019-05-02 20:25                 ` Andy Lutomirski
2019-05-02 20:21             ` peterz [this message]
2019-05-02 20:21               ` Peter Zijlstra
2019-05-02 20:49               ` torvalds
2019-05-02 20:49                 ` Linus Torvalds
2019-05-02 21:32                 ` peterz
2019-05-02 21:32                   ` Peter Zijlstra
2019-05-03 19:24                 ` rostedt
2019-05-03 19:24                   ` Steven Rostedt
2019-05-03 21:46                   ` torvalds
2019-05-03 21:46                     ` Linus Torvalds
2019-05-03 22:49                     ` rostedt
2019-05-03 22:49                       ` Steven Rostedt
2019-05-03 23:07                       ` torvalds
2019-05-03 23:07                         ` Linus Torvalds
2019-05-04  4:17                         ` rostedt
2019-05-04  4:17                           ` Steven Rostedt
     [not found]                           ` <CAHk-=wiuSFbv_rELND-BLWcP0GSZ0yF=xOAEcf61GE3bU9d=yg@mail.gmail.com>
2019-05-04 18:59                             ` torvalds
2019-05-04 18:59                               ` Linus Torvalds
2019-05-04 20:12                               ` luto
2019-05-04 20:12                                 ` Andy Lutomirski
2019-05-04 20:28                                 ` torvalds
2019-05-04 20:28                                   ` Linus Torvalds
2019-05-04 20:36                                 ` torvalds
2019-05-04 20:36                                   ` Linus Torvalds
2019-05-03 22:55                     ` luto
2019-05-03 22:55                       ` Andy Lutomirski
2019-05-03 23:16                       ` torvalds
2019-05-03 23:16                         ` Linus Torvalds
2019-05-03 23:32                         ` luto
2019-05-03 23:32                           ` Andy Lutomirski
2019-05-02 22:52               ` rostedt
2019-05-02 22:52                 ` Steven Rostedt
2019-05-02 23:31                 ` rostedt
2019-05-02 23:31                   ` Steven Rostedt
2019-05-02 23:50                   ` rostedt
2019-05-02 23:50                     ` Steven Rostedt
2019-05-03  1:51                     ` [RFC][PATCH 1/2 v2] " rostedt
2019-05-03  1:51                       ` Steven Rostedt
2019-05-03  9:29                     ` [RFC][PATCH 1/2] " peterz
2019-05-03  9:29                       ` Peter Zijlstra
2019-05-03 13:22                       ` rostedt
2019-05-03 13:22                         ` Steven Rostedt
2019-05-03 16:20                         ` luto
2019-05-03 16:20                           ` Andy Lutomirski
2019-05-03 16:31                           ` rostedt
2019-05-03 16:31                             ` Steven Rostedt
2019-05-03 16:35                             ` peterz
2019-05-03 16:35                               ` Peter Zijlstra
2019-05-03 16:44                               ` luto
2019-05-03 16:44                                 ` Andy Lutomirski
2019-05-03 16:49                                 ` rostedt
2019-05-03 16:49                                   ` Steven Rostedt
2019-05-03 16:32                           ` peterz
2019-05-03 16:32                             ` Peter Zijlstra
2019-05-03 18:57                           ` torvalds
2019-05-03 18:57                             ` Linus Torvalds
2019-05-06  8:19                             ` peterz
2019-05-06  8:19                               ` Peter Zijlstra
2019-05-06 13:56                               ` rostedt
2019-05-06 13:56                                 ` Steven Rostedt
2019-05-06 16:17                                 ` torvalds
2019-05-06 16:17                                   ` Linus Torvalds
2019-05-06 16:19                                   ` torvalds
2019-05-06 16:19                                     ` Linus Torvalds
2019-05-06 17:06                                   ` rostedt
2019-05-06 17:06                                     ` Steven Rostedt
2019-05-06 18:06                                     ` torvalds
2019-05-06 18:06                                       ` Linus Torvalds
2019-05-06 18:57                                       ` rostedt
2019-05-06 18:57                                         ` Steven Rostedt
2019-05-06 19:46                                         ` torvalds
2019-05-06 19:46                                           ` Linus Torvalds
2019-05-06 20:29                                           ` rostedt
2019-05-06 20:29                                             ` Steven Rostedt
2019-05-06 20:42                                             ` torvalds
2019-05-06 20:42                                               ` Linus Torvalds
2019-05-06 20:44                                               ` torvalds
2019-05-06 20:44                                                 ` Linus Torvalds
2019-05-06 21:45                                               ` rostedt
2019-05-06 21:45                                                 ` Steven Rostedt
2019-05-06 22:06                                                 ` torvalds
2019-05-06 22:06                                                   ` Linus Torvalds
2019-05-06 22:31                                                   ` torvalds
2019-05-06 22:31                                                     ` Linus Torvalds
2019-05-07  0:10                                                     ` rostedt
2019-05-07  0:10                                                       ` Steven Rostedt
2019-05-07  1:06                                                       ` torvalds
2019-05-07  1:06                                                         ` Linus Torvalds
2019-05-07  1:04                                                   ` rostedt
2019-05-07  1:04                                                     ` Steven Rostedt
2019-05-07  1:34                                                     ` rostedt
2019-05-07  1:34                                                       ` Steven Rostedt
2019-05-07  1:34                                                     ` torvalds
2019-05-07  1:34                                                       ` Linus Torvalds
2019-05-07  1:53                                                       ` rostedt
2019-05-07  1:53                                                         ` Steven Rostedt
2019-05-07  2:22                                                         ` torvalds
2019-05-07  2:22                                                           ` Linus Torvalds
2019-05-07  2:58                                                           ` rostedt
2019-05-07  2:58                                                             ` Steven Rostedt
2019-05-07  3:05                                                             ` torvalds
2019-05-07  3:05                                                               ` Linus Torvalds
2019-05-07  3:21                                                               ` rostedt
2019-05-07  3:21                                                                 ` Steven Rostedt
2019-05-07  3:28                                                                 ` torvalds
2019-05-07  3:28                                                                   ` Linus Torvalds
2019-05-07 14:54                                                                   ` torvalds
2019-05-07 14:54                                                                     ` Linus Torvalds
2019-05-07 15:12                                                                     ` rostedt
2019-05-07 15:12                                                                       ` Steven Rostedt
2019-05-07 15:25                                                                       ` rostedt
2019-05-07 15:25                                                                         ` Steven Rostedt
2019-05-07 16:25                                                                         ` rostedt
2019-05-07 16:25                                                                           ` Steven Rostedt
2019-05-07 15:31                                                                       ` torvalds
2019-05-07 15:31                                                                         ` Linus Torvalds
2019-05-07 15:45                                                                         ` rostedt
2019-05-07 15:45                                                                           ` Steven Rostedt
2019-05-07 16:34                                                                         ` peterz
2019-05-07 16:34                                                                           ` Peter Zijlstra
2019-05-07 17:08                                                                           ` torvalds
2019-05-07 17:08                                                                             ` Linus Torvalds
2019-05-07 17:21                                                                             ` jpoimboe
2019-05-07 17:21                                                                               ` Josh Poimboeuf
2019-05-07 21:24                                                                               ` rostedt
2019-05-07 21:24                                                                                 ` Steven Rostedt
2019-05-08  4:50                                                                                 ` torvalds
2019-05-08  4:50                                                                                   ` Linus Torvalds
2019-05-08 16:37                                                                                   ` rostedt
2019-05-08 16:37                                                                                     ` Steven Rostedt
2019-05-07 17:38                                                                             ` peterz
2019-05-07 17:38                                                                               ` Peter Zijlstra
2019-05-07  9:51                                                           ` peterz
2019-05-07  9:51                                                             ` Peter Zijlstra
2019-05-07 14:48                                                           ` luto
2019-05-07 14:48                                                             ` Andy Lutomirski
2019-05-07 14:57                                                             ` torvalds
2019-05-07 14:57                                                               ` Linus Torvalds
2019-05-07 14:13                                                 ` mhiramat
2019-05-07 14:13                                                   ` Masami Hiramatsu
2019-05-07 17:15                                                   ` mhiramat
2019-05-07 17:15                                                     ` Masami Hiramatsu
2019-05-06 14:22                               ` peterz
2019-05-06 14:22                                 ` Peter Zijlstra
2019-05-07  8:57                               ` peterz
2019-05-07  8:57                                 ` Peter Zijlstra
2019-05-07  9:18                                 ` David.Laight
2019-05-07  9:18                                   ` David Laight
2019-05-07 11:30                                   ` peterz
2019-05-07 11:30                                     ` Peter Zijlstra
2019-05-07 12:57                                     ` David.Laight
2019-05-07 12:57                                       ` David Laight
2019-05-07 13:14                                       ` rostedt
2019-05-07 13:14                                         ` Steven Rostedt
2019-05-07 14:50                                         ` David.Laight
2019-05-07 14:50                                           ` David Laight
2019-05-07 14:57                                           ` rostedt
2019-05-07 14:57                                             ` Steven Rostedt
2019-05-07 15:46                                             ` David.Laight
2019-05-07 15:46                                               ` David Laight
2019-05-07 13:32                                       ` peterz
2019-05-07 13:32                                         ` Peter Zijlstra
2019-05-07  9:27                                 ` peterz
2019-05-07  9:27                                   ` Peter Zijlstra
2019-05-07 12:27                                   ` rostedt
2019-05-07 12:27                                     ` Steven Rostedt
2019-05-07 12:41                                     ` peterz
2019-05-07 12:41                                       ` Peter Zijlstra
2019-05-07 12:54                                       ` rostedt
2019-05-07 12:54                                         ` Steven Rostedt
2019-05-07 17:22                                         ` masami.hiramatsu
2019-05-07 17:22                                           ` Masami Hiramatsu
2019-05-07 14:28                                 ` peterz
2019-05-07 14:28                                   ` Peter Zijlstra
2019-05-02 20:48         ` rostedt
2019-05-02 20:48           ` Steven Rostedt
2019-05-06 15:14         ` jpoimboe
2019-05-06 15:14           ` Josh Poimboeuf
2019-05-01 20:28 ` [RFC][PATCH 2/2] ftrace/x86: Emulate call function while updating in breakpoint handler rostedt
2019-05-01 20:28   ` Steven Rostedt
2019-05-03 10:22 ` [RFC][PATCH 1.5/2] x86: Add int3_emulate_call() selftest peterz
2019-05-03 10:22   ` Peter Zijlstra
2019-05-03 18:46   ` rostedt
2019-05-03 18:46     ` Steven Rostedt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190502202146.GZ2623@hirez.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).