Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1734614 > unrolled thread

[PATCH v2 0/8] x86/asm: Add unwind hint annotations to head code

Started byJosh Poimboeuf <jpoimboe@redhat.com>
First post2017-09-19 04:50 +0200
Last post2017-09-19 04:50 +0200
Articles 4 — 1 participant

Back to article view | Back to linux.kernel


Contents

  [PATCH v2 0/8] x86/asm: Add unwind hint annotations to head code Josh Poimboeuf <jpoimboe@redhat.com> - 2017-09-19 04:50 +0200
    [PATCH v2 8/8] x86/head: Add unwind hint annotations Josh Poimboeuf <jpoimboe@redhat.com> - 2017-09-19 04:50 +0200
    [PATCH v2 2/8] x86/head: Remove confusing comment Josh Poimboeuf <jpoimboe@redhat.com> - 2017-09-19 04:50 +0200
    [PATCH v2 3/8] x86/head: Remove unused 'bad_address' code Josh Poimboeuf <jpoimboe@redhat.com> - 2017-09-19 04:50 +0200

#1734614 — [PATCH v2 0/8] x86/asm: Add unwind hint annotations to head code

FromJosh Poimboeuf <jpoimboe@redhat.com>
Date2017-09-19 04:50 +0200
Subject[PATCH v2 0/8] x86/asm: Add unwind hint annotations to head code
Message-ID<urgLL-6I2-3@gated-at.bofh.it>
v2:
- Add missing include in xen patch 7/8

Add some annotations to allow objtool to understand the head code.
Among other things, this allows the ORC unwinder to completely unwind an
idle task.

Also do a few cleanups while I'm there.

Josh Poimboeuf (8):
  objtool: Don't report end of section error after an empty unwind hint
  x86/head: Remove confusing comment
  x86/head: Remove unused 'bad_address' code
  x86/head: Fix head ELF function annotations
  x86/boot: Annotate verify_cpu() as a callable function
  x86/xen: Fix xen head ELF annotations
  x86/xen: Add unwind hint annotations
  x86/head: Add unwind hint annotations

 arch/x86/kernel/Makefile     |  1 -
 arch/x86/kernel/head_64.S    | 27 +++++++++++++++------------
 arch/x86/kernel/verify_cpu.S |  3 ++-
 arch/x86/xen/xen-head.S      | 11 ++++++++---
 tools/objtool/check.c        |  7 +++++--
 5 files changed, 30 insertions(+), 19 deletions(-)

-- 
2.13.5

[toc] | [next] | [standalone]


#1734615 — [PATCH v2 8/8] x86/head: Add unwind hint annotations

FromJosh Poimboeuf <jpoimboe@redhat.com>
Date2017-09-19 04:50 +0200
Subject[PATCH v2 8/8] x86/head: Add unwind hint annotations
Message-ID<urgLL-6I2-15@gated-at.bofh.it>
In reply to#1734614
Jiri Slaby reported an ORC issue when unwinding from an idle task.  The
stack was:

    ffffffff811083c2 do_idle+0x142/0x1e0
    ffffffff8110861d cpu_startup_entry+0x5d/0x60
    ffffffff82715f58 start_kernel+0x3ff/0x407
    ffffffff827153e8 x86_64_start_kernel+0x14e/0x15d
    ffffffff810001bf secondary_startup_64+0x9f/0xa0

The ORC unwinder errored out at secondary_startup_64 because the head
code isn't annotated yet so there wasn't a corresponding ORC entry.

Fix that and any other head-related unwinding issues by adding unwind
hints to the head code.

Reported-by: Jiri Slaby <jslaby@suse.cz>
Tested-by: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
---
 arch/x86/kernel/Makefile  |  1 -
 arch/x86/kernel/head_64.S | 14 ++++++++++++--
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index fd0a7895b63f..d8e2b700d1db 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -26,7 +26,6 @@ KASAN_SANITIZE_dumpstack.o				:= n
 KASAN_SANITIZE_dumpstack_$(BITS).o			:= n
 KASAN_SANITIZE_stacktrace.o := n
 
-OBJECT_FILES_NON_STANDARD_head_$(BITS).o		:= y
 OBJECT_FILES_NON_STANDARD_relocate_kernel_$(BITS).o	:= y
 OBJECT_FILES_NON_STANDARD_ftrace_$(BITS).o		:= y
 OBJECT_FILES_NON_STANDARD_test_nx.o			:= y
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index edacd579d504..42e32c2e51bb 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -49,6 +49,7 @@ L3_START_KERNEL = pud_index(__START_KERNEL_map)
 	.code64
 	.globl startup_64
 startup_64:
+	UNWIND_HINT_EMPTY
 	/*
 	 * At this point the CPU runs in 64bit mode CS.L = 1 CS.D = 0,
 	 * and someone has loaded an identity mapped page table
@@ -88,6 +89,7 @@ startup_64:
 	addq	$(early_top_pgt - __START_KERNEL_map), %rax
 	jmp 1f
 ENTRY(secondary_startup_64)
+	UNWIND_HINT_EMPTY
 	/*
 	 * At this point the CPU runs in 64bit mode CS.L = 1 CS.D = 0,
 	 * and someone has loaded a mapped page table.
@@ -132,6 +134,7 @@ ENTRY(secondary_startup_64)
 	movq	$1f, %rax
 	jmp	*%rax
 1:
+	UNWIND_HINT_EMPTY
 
 	/* Check if nx is implemented */
 	movl	$0x80000001, %eax
@@ -246,6 +249,7 @@ END(secondary_startup_64)
  */
 ENTRY(start_cpu0)
 	movq	initial_stack(%rip), %rsp
+	UNWIND_HINT_EMPTY
 	jmp	.Ljump_to_C_code
 ENDPROC(start_cpu0)
 #endif
@@ -270,13 +274,18 @@ ENTRY(early_idt_handler_array)
 	i = 0
 	.rept NUM_EXCEPTION_VECTORS
 	.ifeq (EXCEPTION_ERRCODE_MASK >> i) & 1
-	pushq $0		# Dummy error code, to make stack frame uniform
+		UNWIND_HINT_IRET_REGS
+		pushq $0	# Dummy error code, to make stack frame uniform
+	.else
+		UNWIND_HINT_IRET_REGS offset=8
 	.endif
 	pushq $i		# 72(%rsp) Vector number
 	jmp early_idt_handler_common
+	UNWIND_HINT_IRET_REGS
 	i = i + 1
 	.fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc
 	.endr
+	UNWIND_HINT_IRET_REGS offset=16
 END(early_idt_handler_array)
 
 early_idt_handler_common:
@@ -305,6 +314,7 @@ early_idt_handler_common:
 	pushq %r13				/* pt_regs->r13 */
 	pushq %r14				/* pt_regs->r14 */
 	pushq %r15				/* pt_regs->r15 */
+	UNWIND_HINT_REGS
 
 	cmpq $14,%rsi		/* Page fault? */
 	jnz 10f
@@ -427,7 +437,7 @@ ENTRY(phys_base)
 EXPORT_SYMBOL(phys_base)
 
 #include "../../x86/xen/xen-head.S"
-	
+
 	__PAGE_ALIGNED_BSS
 NEXT_PAGE(empty_zero_page)
 	.skip PAGE_SIZE
-- 
2.13.5

[toc] | [prev] | [next] | [standalone]


#1734616 — [PATCH v2 2/8] x86/head: Remove confusing comment

FromJosh Poimboeuf <jpoimboe@redhat.com>
Date2017-09-19 04:50 +0200
Subject[PATCH v2 2/8] x86/head: Remove confusing comment
Message-ID<urgLL-6I2-17@gated-at.bofh.it>
In reply to#1734614
This comment is actively wrong and confusing.  It refers to the
registers' stack offsets after the pt_regs has been constructed on the
stack, but this code is *before* that.

At this point the stack just has the standard iret frame, for which no
comment should be needed.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
---
 arch/x86/kernel/head_64.S | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index 513cbb012ecc..3b04e4c99389 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -270,10 +270,6 @@ bad_address:
 
 	__INIT
 ENTRY(early_idt_handler_array)
-	# 104(%rsp) %rflags
-	#  96(%rsp) %cs
-	#  88(%rsp) %rip
-	#  80(%rsp) error code
 	i = 0
 	.rept NUM_EXCEPTION_VECTORS
 	.ifeq (EXCEPTION_ERRCODE_MASK >> i) & 1
-- 
2.13.5

[toc] | [prev] | [next] | [standalone]


#1734617 — [PATCH v2 3/8] x86/head: Remove unused 'bad_address' code

FromJosh Poimboeuf <jpoimboe@redhat.com>
Date2017-09-19 04:50 +0200
Subject[PATCH v2 3/8] x86/head: Remove unused 'bad_address' code
Message-ID<urgLM-6I2-19@gated-at.bofh.it>
In reply to#1734614
It's no longer possible for this code to be executed, so remove it.

Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
---
 arch/x86/kernel/head_64.S | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
index 3b04e4c99389..afb0a1e22d41 100644
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -265,9 +265,6 @@ ENDPROC(start_cpu0)
 	.quad  init_thread_union + THREAD_SIZE - SIZEOF_PTREGS
 	__FINITDATA
 
-bad_address:
-	jmp bad_address
-
 	__INIT
 ENTRY(early_idt_handler_array)
 	i = 0
-- 
2.13.5

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web