All of lore.kernel.org
 help / color / mirror / Atom feed
* [tip: objtool/core] objtool: Support stack-swizzle
@ 2021-02-10 20:01 tip-bot2 for Peter Zijlstra
  2021-02-18 16:21 ` [PATCH] objtool: Fix stack-swizzle for FRAME_POINTER=y Peter Zijlstra
  0 siblings, 1 reply; 5+ messages in thread
From: tip-bot2 for Peter Zijlstra @ 2021-02-10 20:01 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Peter Zijlstra (Intel),
	Miroslav Benes, Josh Poimboeuf, x86, linux-kernel

The following commit has been merged into the objtool/core branch of tip:

Commit-ID:     aafeb14e9da29e323b0605f8f1bae0d45d5f3acf
Gitweb:        https://git.kernel.org/tip/aafeb14e9da29e323b0605f8f1bae0d45d5f3acf
Author:        Peter Zijlstra <peterz@infradead.org>
AuthorDate:    Wed, 03 Feb 2021 12:02:17 +01:00
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Wed, 10 Feb 2021 20:53:52 +01:00

objtool: Support stack-swizzle

Natively support the stack swizzle pattern:

	mov %rsp, (%[tos])
	mov %[tos], %rsp
	...
	pop %rsp

It uses the vals[] array to link the first two stack-ops, and detect
the SP to SP_INDIRECT swizzle.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Miroslav Benes <mbenes@suse.cz>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
---
 tools/objtool/check.c | 45 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 45 insertions(+)

diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 5f056dd..62cd211 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -1945,6 +1945,38 @@ static int update_cfi_state(struct instruction *insn, struct cfi_state *cfi,
 					cfa->offset = -cfi->vals[op->src.reg].offset;
 					cfi->stack_size = cfa->offset;
 
+				} else if (cfa->base == CFI_SP &&
+					   cfi->vals[op->src.reg].base == CFI_SP_INDIRECT &&
+					   cfi->vals[op->src.reg].offset == cfa->offset) {
+
+					/*
+					 * Stack swizzle:
+					 *
+					 * 1: mov %rsp, (%[tos])
+					 * 2: mov %[tos], %rsp
+					 *    ...
+					 * 3: pop %rsp
+					 *
+					 * Where:
+					 *
+					 * 1 - places a pointer to the previous
+					 *     stack at the Top-of-Stack of the
+					 *     new stack.
+					 *
+					 * 2 - switches to the new stack.
+					 *
+					 * 3 - pops the Top-of-Stack to restore
+					 *     the original stack.
+					 *
+					 * Note: we set base to SP_INDIRECT
+					 * here and preserve offset. Therefore
+					 * when the unwinder reaches ToS it
+					 * will dereference SP and then add the
+					 * offset to find the next frame, IOW:
+					 * (%rsp) + offset.
+					 */
+					cfa->base = CFI_SP_INDIRECT;
+
 				} else {
 					cfa->base = CFI_UNDEFINED;
 					cfa->offset = 0;
@@ -2047,6 +2079,13 @@ static int update_cfi_state(struct instruction *insn, struct cfi_state *cfi,
 
 		case OP_SRC_POP:
 		case OP_SRC_POPF:
+			if (op->dest.reg == CFI_SP && cfa->base == CFI_SP_INDIRECT) {
+
+				/* pop %rsp; # restore from a stack swizzle */
+				cfa->base = CFI_SP;
+				break;
+			}
+
 			if (!cfi->drap && op->dest.reg == cfa->base) {
 
 				/* pop %rbp */
@@ -2193,6 +2232,12 @@ static int update_cfi_state(struct instruction *insn, struct cfi_state *cfi,
 			/* mov reg, disp(%rsp) */
 			save_reg(cfi, op->src.reg, CFI_CFA,
 				 op->dest.offset - cfi->stack_size);
+
+		} else if (op->src.reg == CFI_SP && op->dest.offset == 0) {
+
+			/* mov %rsp, (%reg); # setup a stack swizzle. */
+			cfi->vals[op->dest.reg].base = CFI_SP_INDIRECT;
+			cfi->vals[op->dest.reg].offset = cfa->offset;
 		}
 
 		break;

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH] objtool: Fix stack-swizzle for FRAME_POINTER=y
  2021-02-10 20:01 [tip: objtool/core] objtool: Support stack-swizzle tip-bot2 for Peter Zijlstra
@ 2021-02-18 16:21 ` Peter Zijlstra
  2021-02-18 17:53   ` Josh Poimboeuf
                     ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Peter Zijlstra @ 2021-02-18 16:21 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-tip-commits, Miroslav Benes, Josh Poimboeuf, x86

On Wed, Feb 10, 2021 at 08:01:23PM -0000, tip-bot2 for Peter Zijlstra wrote:
> objtool: Support stack-swizzle

---
Subject: objtool: Fix stack-swizzle for FRAME_POINTER=y
From: Peter Zijlstra <peterz@infradead.org>
Date: Thu Feb 18 17:14:10 CET 2021

When objtool encounters the stack-swizzle:

	mov %rsp, (%[tos])
	mov %[tos], %rsp
	...
	pop %rsp

Inside a FRAME_POINTER=y build, things go a little screwy because
clearly we're not adjusting the cfa->base. This then results in the
pop %rsp not being detected as a restore of cfa->base so it will turn
into a regular POP and offset the stack, resulting in:

  kernel/softirq.o: warning: objtool: do_softirq()+0xdb: return with modified stack frame

Therefore, have "mov %[tos], %rsp" act like a PUSH (it sorta is
anyway) to balance the things out. We're not too concerned with the
actual stack_size for frame-pointer builds, since we don't generate
ORC data for them anyway.

Fixes: aafeb14e9da2 ("objtool: Support stack-swizzle")
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 tools/objtool/check.c |   14 ++++++++++++++
 1 file changed, 14 insertions(+)

--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -1996,6 +1996,20 @@ static int update_cfi_state(struct instr
 				}
 			}
 
+			else if (op->dest.reg == CFI_SP &&
+				 cfi->vals[op->src.reg].base == CFI_SP_INDIRECT &&
+				 cfi->vals[op->src.reg].offset == cfa->offset) {
+
+				/*
+				 * The same stack swizzle case 2) as above. But
+				 * because we can't change cfa->base, case 3)
+				 * will become a regular POP. Pretend we're a
+				 * PUSH so things don't go unbalanced.
+				 */
+				cfi->stack_size += 8;
+			}
+
+
 			break;
 
 		case OP_SRC_ADD:

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] objtool: Fix stack-swizzle for FRAME_POINTER=y
  2021-02-18 16:21 ` [PATCH] objtool: Fix stack-swizzle for FRAME_POINTER=y Peter Zijlstra
@ 2021-02-18 17:53   ` Josh Poimboeuf
  2021-02-22 11:08   ` [tip: objtool/core] " tip-bot2 for Peter Zijlstra
  2021-02-22 19:00   ` [tip: x86/entry] " tip-bot2 for Peter Zijlstra
  2 siblings, 0 replies; 5+ messages in thread
From: Josh Poimboeuf @ 2021-02-18 17:53 UTC (permalink / raw)
  To: Peter Zijlstra; +Cc: linux-kernel, linux-tip-commits, Miroslav Benes, x86

On Thu, Feb 18, 2021 at 05:21:31PM +0100, Peter Zijlstra wrote:
> On Wed, Feb 10, 2021 at 08:01:23PM -0000, tip-bot2 for Peter Zijlstra wrote:
> > objtool: Support stack-swizzle
> 
> ---
> Subject: objtool: Fix stack-swizzle for FRAME_POINTER=y
> From: Peter Zijlstra <peterz@infradead.org>
> Date: Thu Feb 18 17:14:10 CET 2021
> 
> When objtool encounters the stack-swizzle:
> 
> 	mov %rsp, (%[tos])
> 	mov %[tos], %rsp
> 	...
> 	pop %rsp
> 
> Inside a FRAME_POINTER=y build, things go a little screwy because
> clearly we're not adjusting the cfa->base. This then results in the
> pop %rsp not being detected as a restore of cfa->base so it will turn
> into a regular POP and offset the stack, resulting in:
> 
>   kernel/softirq.o: warning: objtool: do_softirq()+0xdb: return with modified stack frame
> 
> Therefore, have "mov %[tos], %rsp" act like a PUSH (it sorta is
> anyway) to balance the things out. We're not too concerned with the
> actual stack_size for frame-pointer builds, since we don't generate
> ORC data for them anyway.
> 
> Fixes: aafeb14e9da2 ("objtool: Support stack-swizzle")
> Reported-by: kernel test robot <lkp@intel.com>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>

-- 
Josh


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [tip: objtool/core] objtool: Fix stack-swizzle for FRAME_POINTER=y
  2021-02-18 16:21 ` [PATCH] objtool: Fix stack-swizzle for FRAME_POINTER=y Peter Zijlstra
  2021-02-18 17:53   ` Josh Poimboeuf
@ 2021-02-22 11:08   ` tip-bot2 for Peter Zijlstra
  2021-02-22 19:00   ` [tip: x86/entry] " tip-bot2 for Peter Zijlstra
  2 siblings, 0 replies; 5+ messages in thread
From: tip-bot2 for Peter Zijlstra @ 2021-02-22 11:08 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: kernel test robot, Peter Zijlstra (Intel),
	Josh Poimboeuf, x86, linux-kernel

The following commit has been merged into the objtool/core branch of tip:

Commit-ID:     23e34c5988088b8bb4c55905973ca76114cb33ee
Gitweb:        https://git.kernel.org/tip/23e34c5988088b8bb4c55905973ca76114cb33ee
Author:        Peter Zijlstra <peterz@infradead.org>
AuthorDate:    Thu, 18 Feb 2021 17:14:10 +01:00
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Mon, 22 Feb 2021 12:05:18 +01:00

objtool: Fix stack-swizzle for FRAME_POINTER=y

When objtool encounters the stack-swizzle:

	mov %rsp, (%[tos])
	mov %[tos], %rsp
	...
	pop %rsp

Inside a FRAME_POINTER=y build, things go a little screwy because
clearly we're not adjusting the cfa->base. This then results in the
pop %rsp not being detected as a restore of cfa->base so it will turn
into a regular POP and offset the stack, resulting in:

  kernel/softirq.o: warning: objtool: do_softirq()+0xdb: return with modified stack frame

Therefore, have "mov %[tos], %rsp" act like a PUSH (it sorta is
anyway) to balance the things out. We're not too concerned with the
actual stack_size for frame-pointer builds, since we don't generate
ORC data for them anyway.

Fixes: aafeb14e9da2 ("objtool: Support stack-swizzle")
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Link: https://lkml.kernel.org/r/YC6UC+rc9KKmQrkd@hirez.programming.kicks-ass.net
---
 tools/objtool/check.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 62cd211..d7f1496 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -1983,6 +1983,20 @@ static int update_cfi_state(struct instruction *insn, struct cfi_state *cfi,
 				}
 			}
 
+			else if (op->dest.reg == CFI_SP &&
+				 cfi->vals[op->src.reg].base == CFI_SP_INDIRECT &&
+				 cfi->vals[op->src.reg].offset == cfa->offset) {
+
+				/*
+				 * The same stack swizzle case 2) as above. But
+				 * because we can't change cfa->base, case 3)
+				 * will become a regular POP. Pretend we're a
+				 * PUSH so things don't go unbalanced.
+				 */
+				cfi->stack_size += 8;
+			}
+
+
 			break;
 
 		case OP_SRC_ADD:

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [tip: x86/entry] objtool: Fix stack-swizzle for FRAME_POINTER=y
  2021-02-18 16:21 ` [PATCH] objtool: Fix stack-swizzle for FRAME_POINTER=y Peter Zijlstra
  2021-02-18 17:53   ` Josh Poimboeuf
  2021-02-22 11:08   ` [tip: objtool/core] " tip-bot2 for Peter Zijlstra
@ 2021-02-22 19:00   ` tip-bot2 for Peter Zijlstra
  2 siblings, 0 replies; 5+ messages in thread
From: tip-bot2 for Peter Zijlstra @ 2021-02-22 19:00 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: kernel test robot, Peter Zijlstra (Intel),
	Thomas Gleixner, Josh Poimboeuf, x86, linux-kernel

The following commit has been merged into the x86/entry branch of tip:

Commit-ID:     724c8a23d589d8a002d2e39633c2f9a5a429616f
Gitweb:        https://git.kernel.org/tip/724c8a23d589d8a002d2e39633c2f9a5a429616f
Author:        Peter Zijlstra <peterz@infradead.org>
AuthorDate:    Thu, 18 Feb 2021 17:14:10 +01:00
Committer:     Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Mon, 22 Feb 2021 19:54:09 +01:00

objtool: Fix stack-swizzle for FRAME_POINTER=y

When objtool encounters the stack-swizzle:

	mov %rsp, (%[tos])
	mov %[tos], %rsp
	...
	pop %rsp

Inside a FRAME_POINTER=y build, things go a little screwy because
clearly we're not adjusting the cfa->base. This then results in the
pop %rsp not being detected as a restore of cfa->base so it will turn
into a regular POP and offset the stack, resulting in:

  kernel/softirq.o: warning: objtool: do_softirq()+0xdb: return with modified stack frame

Therefore, have "mov %[tos], %rsp" act like a PUSH (it sorta is
anyway) to balance the things out. We're not too concerned with the
actual stack_size for frame-pointer builds, since we don't generate
ORC data for them anyway.

Fixes: aafeb14e9da2 ("objtool: Support stack-swizzle")
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Link: https://lkml.kernel.org/r/YC6UC+rc9KKmQrkd@hirez.programming.kicks-ass.net
---
 tools/objtool/check.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index 8e74210..2087974 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -1983,6 +1983,20 @@ static int update_cfi_state(struct instruction *insn, struct cfi_state *cfi,
 				}
 			}
 
+			else if (op->dest.reg == CFI_SP &&
+				 cfi->vals[op->src.reg].base == CFI_SP_INDIRECT &&
+				 cfi->vals[op->src.reg].offset == cfa->offset) {
+
+				/*
+				 * The same stack swizzle case 2) as above. But
+				 * because we can't change cfa->base, case 3)
+				 * will become a regular POP. Pretend we're a
+				 * PUSH so things don't go unbalanced.
+				 */
+				cfi->stack_size += 8;
+			}
+
+
 			break;
 
 		case OP_SRC_ADD:

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-02-22 19:02 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-10 20:01 [tip: objtool/core] objtool: Support stack-swizzle tip-bot2 for Peter Zijlstra
2021-02-18 16:21 ` [PATCH] objtool: Fix stack-swizzle for FRAME_POINTER=y Peter Zijlstra
2021-02-18 17:53   ` Josh Poimboeuf
2021-02-22 11:08   ` [tip: objtool/core] " tip-bot2 for Peter Zijlstra
2021-02-22 19:00   ` [tip: x86/entry] " tip-bot2 for Peter Zijlstra

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.