From: jbeulich@suse.com
Subject: fix unwind annotations
Patch-mainline: tbd
References: bnc#472783, bnc#588458

--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -115,21 +115,21 @@ ENDPROC(native_usergs_sysret64)
 /*
  * empty frame
  */
-	.macro EMPTY_FRAME start=1 offset=0
-	.if \start
+	.macro EMPTY_FRAME offset=0
 	CFI_STARTPROC simple
 	CFI_SIGNAL_FRAME
-	CFI_DEF_CFA rsp,8+\offset
-	.else
-	CFI_DEF_CFA_OFFSET 8+\offset
-	.endif
+	CFI_DEF_CFA rsp,\offset
 	.endm
 
 /*
  * initial frame state for interrupts (and exceptions without error code)
  */
 	.macro INTR_FRAME start=1 offset=0
-	EMPTY_FRAME \start, 5*8+\offset
+	.if \start
+	EMPTY_FRAME 5*8+\offset
+	.else
+	CFI_DEF_CFA_OFFSET 5*8+\offset
+	.endif
 	/*CFI_REL_OFFSET ss, 4*8+\offset*/
 	CFI_REL_OFFSET rsp, 3*8+\offset
 	/*CFI_REL_OFFSET rflags, 2*8+\offset*/
@@ -148,7 +148,7 @@ ENDPROC(native_usergs_sysret64)
 /*
  * frame that enables passing a complete pt_regs to a C function.
  */
-	.macro DEFAULT_FRAME start=1 offset=0
+	.macro DEFAULT_FRAME start=1 offset=0 extra=1
 	XCPT_FRAME \start, ORIG_RAX+\offset
 	CFI_REL_OFFSET rdi, RDI+\offset
 	CFI_REL_OFFSET rsi, RSI+\offset
@@ -159,12 +159,14 @@ ENDPROC(native_usergs_sysret64)
 	CFI_REL_OFFSET r9, R9+\offset
 	CFI_REL_OFFSET r10, R10+\offset
 	CFI_REL_OFFSET r11, R11+\offset
+	.if \extra
 	CFI_REL_OFFSET rbx, RBX+\offset
 	CFI_REL_OFFSET rbp, RBP+\offset
 	CFI_REL_OFFSET r12, R12+\offset
 	CFI_REL_OFFSET r13, R13+\offset
 	CFI_REL_OFFSET r14, R14+\offset
 	CFI_REL_OFFSET r15, R15+\offset
+	.endif
 	.endm
 
 /*
@@ -491,7 +493,7 @@ END(system_call)
 	.macro FORK_LIKE func
 ENTRY(stub_\func)
 	CFI_STARTPROC
-	DEFAULT_FRAME 0, 8		/* offset 8: return address */
+	DEFAULT_FRAME 0, 8, 0		/* offset 8: return address */
 	SAVE_EXTRA_REGS 8
 	jmp sys_\func
 	CFI_ENDPROC
@@ -504,7 +506,7 @@ END(stub_\func)
 
 ENTRY(stub_execve)
 	CFI_STARTPROC
-	DEFAULT_FRAME 0, 8
+	DEFAULT_FRAME 0, 8, 0
 	call	sys_execve
 return_from_execve:
 	testl	%eax, %eax
@@ -527,7 +529,7 @@ END(stub_execve)
 	.align	8
 GLOBAL(stub_execveat)
 	CFI_STARTPROC
-	DEFAULT_FRAME 0, 8
+	DEFAULT_FRAME 0, 8, 0
 	call	sys_execveat
 	jmp	return_from_execve
 	CFI_ENDPROC
@@ -537,7 +539,7 @@ END(stub_execveat)
 	.align	8
 GLOBAL(stub_x32_execve)
 	CFI_STARTPROC
-	DEFAULT_FRAME 0, 8
+	DEFAULT_FRAME 0, 8, 0
 	call	compat_sys_execve
 	jmp	return_from_execve
 	CFI_ENDPROC
@@ -545,7 +547,7 @@ END(stub_x32_execve)
 	.align	8
 GLOBAL(stub_x32_execveat)
 	CFI_STARTPROC
-	DEFAULT_FRAME 0, 8
+	DEFAULT_FRAME 0, 8, 0
 	call	compat_sys_execveat
 	jmp	return_from_execve
 	CFI_ENDPROC
@@ -575,7 +577,7 @@ END(stub32_execveat)
  */
 ENTRY(stub_rt_sigreturn)
 	CFI_STARTPROC
-	DEFAULT_FRAME 0, 8
+	DEFAULT_FRAME 0, 8, 0
 	/*
 	 * SAVE_EXTRA_REGS result is not normally needed:
 	 * sigreturn overwrites all pt_regs->GPREGS.
@@ -597,7 +599,7 @@ END(stub_rt_sigreturn)
 #ifdef CONFIG_X86_X32_ABI
 ENTRY(stub_x32_rt_sigreturn)
 	CFI_STARTPROC
-	DEFAULT_FRAME 0, 8
+	DEFAULT_FRAME 0, 8, 0
 	SAVE_EXTRA_REGS 8
 	call sys32_x32_rt_sigreturn
 	jmp  return_from_stub
--- a/arch/x86/kernel/head_64.S
+++ b/arch/x86/kernel/head_64.S
@@ -378,6 +378,25 @@ ENTRY(early_idt_handler)
 
 11:
 #ifdef CONFIG_EARLY_PRINTK
+#include <asm/dwarf2.h>
+	CFI_STARTPROC	simple
+	CFI_SIGNAL_FRAME
+	CFI_DEF_CFA	rsp, 16*8
+#	CFI_REL_OFFSET	ss, 15*8
+	CFI_REL_OFFSET	rsp, 14*8
+#	CFI_REL_OFFSET	rflags, 13*8
+#	CFI_REL_OFFSET	cs, 12*8
+	CFI_REL_OFFSET	rip, 11*8
+	CFI_REL_OFFSET	rax, 8*8
+	CFI_REL_OFFSET	rcx, 7*8
+	CFI_REL_OFFSET	rdx, 6*8
+	CFI_REL_OFFSET	rsi, 5*8
+	CFI_REL_OFFSET	rdi, 4*8
+	CFI_REL_OFFSET	r8, 3*8
+	CFI_REL_OFFSET	r9, 2*8
+	CFI_REL_OFFSET	r10, 1*8
+	CFI_REL_OFFSET	r11, 0*8
+
 	GET_CR2_INTO(%r9)	# can clobber any volatile register if pv
 	movl 80(%rsp),%r8d	# error code
 	movl 72(%rsp),%esi	# vector number
@@ -394,6 +413,7 @@ ENTRY(early_idt_handler)
 	movq 40(%rsp),%rsi	# %rip again
 	call __print_symbol
 #endif
+	CFI_ENDPROC
 #endif /* EARLY_PRINTK */
 1:	hlt
 	jmp 1b
