Commit dcd072e2 authored by Alexander van Heukelum's avatar Alexander van Heukelum Committed by Ingo Molnar
Browse files

x86: clean up after: move entry_64.S register saving out of the macros



This add-on patch to x86: move entry_64.S register saving out
of the macros visually cleans up the appearance of the code by
introducing some basic helper macro's. It also adds some cfi
annotations which were missing.

Signed-off-by: default avatarAlexander van Heukelum <heukelum@fastmail.fm>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent d99015b1
Loading
Loading
Loading
Loading
+112 −108
Original line number Diff line number Diff line
@@ -60,6 +60,23 @@
#define __AUDIT_ARCH_LE	   0x40000000

	.code64
/*
 * Some macro's to hide the most frequently occuring CFI annotations.
 */
	.macro CFI_PUSHQ reg
	pushq \reg
	CFI_ADJUST_CFA_OFFSET 8
	.endm

	.macro CFI_POPQ reg
	popq \reg
	CFI_ADJUST_CFA_OFFSET -8
	.endm

	.macro CFI_MOVQ reg offset=0
	movq %\reg, \offset(%rsp)
	CFI_REL_OFFSET \reg, \offset
	.endm

#ifdef CONFIG_FUNCTION_TRACER
#ifdef CONFIG_DYNAMIC_FTRACE
@@ -213,84 +230,84 @@ ENTRY(native_usergs_sysret64)
	CFI_ADJUST_CFA_OFFSET	-(6*8)
	.endm

	.macro	CFI_DEFAULT_STACK start=1
/*
 * initial frame state for interrupts (and exceptions without error code)
 */
	.macro EMPTY_FRAME start=1 offset=0
	.if \start
	CFI_STARTPROC simple
	CFI_SIGNAL_FRAME
	CFI_DEF_CFA	rsp,SS+8
	CFI_DEF_CFA rsp,8+\offset
	.else
	CFI_DEF_CFA_OFFSET SS+8
	CFI_DEF_CFA_OFFSET 8+\offset
	.endif
	CFI_REL_OFFSET	r15,R15
	CFI_REL_OFFSET	r14,R14
	CFI_REL_OFFSET	r13,R13
	CFI_REL_OFFSET	r12,R12
	CFI_REL_OFFSET	rbp,RBP
	CFI_REL_OFFSET	rbx,RBX
	CFI_REL_OFFSET	r11,R11
	CFI_REL_OFFSET	r10,R10
	CFI_REL_OFFSET	r9,R9
	CFI_REL_OFFSET	r8,R8
	CFI_REL_OFFSET	rax,RAX
	CFI_REL_OFFSET	rcx,RCX
	CFI_REL_OFFSET	rdx,RDX
	CFI_REL_OFFSET	rsi,RSI
	CFI_REL_OFFSET	rdi,RDI
	CFI_REL_OFFSET	rip,RIP
	/*CFI_REL_OFFSET	cs,CS*/
	/*CFI_REL_OFFSET	rflags,EFLAGS*/
	CFI_REL_OFFSET	rsp,RSP
	/*CFI_REL_OFFSET	ss,SS*/
	.endm

/*
 * initial frame state for interrupts and exceptions
 * initial frame state for interrupts (and exceptions without error code)
 */
	.macro _frame ref
	CFI_STARTPROC simple
	CFI_SIGNAL_FRAME
	CFI_DEF_CFA rsp,SS+8-\ref
	/*CFI_REL_OFFSET ss,SS-\ref*/
	CFI_REL_OFFSET rsp,RSP-\ref
	/*CFI_REL_OFFSET rflags,EFLAGS-\ref*/
	/*CFI_REL_OFFSET cs,CS-\ref*/
	CFI_REL_OFFSET rip,RIP-\ref
	.macro INTR_FRAME start=1 offset=0
	EMPTY_FRAME \start, (SS+8-RIP)+\offset
	/*CFI_REL_OFFSET ss, SS-RIP+\offset*/
	CFI_REL_OFFSET rsp, RSP-RIP+\offset
	/*CFI_REL_OFFSET rflags, EFLAGS-RIP+\offset*/
	/*CFI_REL_OFFSET cs, CS-RIP+\offset*/
	CFI_REL_OFFSET rip, RIP-RIP+\offset
	.endm

/*
 * initial frame state for interrupts (and exceptions without error code)
 */
#define INTR_FRAME _frame RIP
/*
 * initial frame state for exceptions with error code (and interrupts
 * with vector already pushed)
 */
#define XCPT_FRAME _frame ORIG_RAX
	.macro XCPT_FRAME start=1 offset=0
	INTR_FRAME \start, (RIP-ORIG_RAX)+\offset
	/*CFI_REL_OFFSET orig_rax, ORIG_RAX-ORIG_RAX*/
	.endm

/*
 * frame that enables calling into C.
 */
	.macro PARTIAL_FRAME start=1 offset=0
	XCPT_FRAME \start, (ORIG_RAX-ARGOFFSET)+\offset
	CFI_REL_OFFSET rdi, (RDI-ARGOFFSET)+\offset
	CFI_REL_OFFSET rsi, (RSI-ARGOFFSET)+\offset
	CFI_REL_OFFSET rdx, (RDX-ARGOFFSET)+\offset
	CFI_REL_OFFSET rcx, (RCX-ARGOFFSET)+\offset
	CFI_REL_OFFSET rax, (RAX-ARGOFFSET)+\offset
	CFI_REL_OFFSET r8, (R8-ARGOFFSET)+\offset
	CFI_REL_OFFSET r9, (R9-ARGOFFSET)+\offset
	CFI_REL_OFFSET r10, (R10-ARGOFFSET)+\offset
	CFI_REL_OFFSET r11, (R11-ARGOFFSET)+\offset
	.endm

/*
 * frame that enables passing a complete pt_regs to a C function.
 */
	.macro DEFAULT_FRAME start=1 offset=0
	PARTIAL_FRAME \start, (R11-R15)+\offset
	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
	.endm

/* save partial stack frame */
ENTRY(save_args)
	XCPT_FRAME
	cld
	movq  %rdi, 8*8+16(%rsp)
	CFI_REL_OFFSET rdi, 8*8+16
	movq  %rsi, 7*8+16(%rsp)
	CFI_REL_OFFSET rsi, 7*8+16
	movq  %rdx, 6*8+16(%rsp)
	CFI_REL_OFFSET rdx, 6*8+16
	movq  %rcx, 5*8+16(%rsp)
	CFI_REL_OFFSET rcx, 5*8+16
	movq  %rax, 4*8+16(%rsp)
	CFI_REL_OFFSET rax, 4*8+16
	movq  %r8, 3*8+16(%rsp)
	CFI_REL_OFFSET r8, 3*8+16
	movq  %r9, 2*8+16(%rsp)
	CFI_REL_OFFSET r9, 2*8+16
	movq  %r10, 1*8+16(%rsp)
	CFI_REL_OFFSET r10, 1*8+16
	movq  %r11, 0*8+16(%rsp)
	CFI_REL_OFFSET r11, 0*8+16
	CFI_MOVQ rdi, (RDI-ARGOFFSET)+16
	CFI_MOVQ rsi, (RSI-ARGOFFSET)+16
	CFI_MOVQ rdx, (RDX-ARGOFFSET)+16
	CFI_MOVQ rcx, (RCX-ARGOFFSET)+16
	CFI_MOVQ rax, (RAX-ARGOFFSET)+16
	CFI_MOVQ r8, (R8-ARGOFFSET)+16
	CFI_MOVQ r9, (R9-ARGOFFSET)+16
	CFI_MOVQ r10, (R10-ARGOFFSET)+16
	CFI_MOVQ r11, (R11-ARGOFFSET)+16
	leaq -ARGOFFSET+16(%rsp),%rdi	/* arg1 for handler */
	movq %rbp, 8(%rsp)		/* push %rbp */
	CFI_MOVQ rbp, 8		/* push %rbp */
	leaq 8(%rsp), %rbp		/* mov %rsp, %ebp */
	testl $3, CS(%rdi)
	je 1f
@@ -303,9 +320,10 @@ ENTRY(save_args)
	 */
1:	incl %gs:pda_irqcount
	jne 2f
	pop %rax			/* move return address... */
	CFI_POPQ %rax			/* move return address... */
	mov %gs:pda_irqstackptr,%rsp
	push %rax			/* ... to the new stack */
	EMPTY_FRAME 0
	CFI_PUSHQ %rax			/* ... to the new stack */
	/*
	 * We entered an interrupt context - irqs are off:
	 */
@@ -319,7 +337,7 @@ END(save_args)
 */
/* rdi:	prev */
ENTRY(ret_from_fork)
	CFI_DEFAULT_STACK
	DEFAULT_FRAME
	push kernel_eflags(%rip)
	CFI_ADJUST_CFA_OFFSET 8
	popf				# reset kernel eflags
@@ -732,6 +750,7 @@ END(interrupt)
	subq $10*8, %rsp
	CFI_ADJUST_CFA_OFFSET 10*8
	call save_args
	PARTIAL_FRAME 0
	call \func
	.endm

@@ -949,11 +968,11 @@ END(spurious_interrupt)
	.macro zeroentry sym
	INTR_FRAME
	PARAVIRT_ADJUST_EXCEPTION_FRAME
	pushq $-1		/* ORIG_RAX: no syscall to restart */
	CFI_ADJUST_CFA_OFFSET 8
	CFI_PUSHQ $-1		/* ORIG_RAX: no syscall to restart */
	subq $15*8,%rsp
	CFI_ADJUST_CFA_OFFSET 15*8
	call error_entry
	DEFAULT_FRAME 0
	movq %rsp,%rdi		/* pt_regs pointer */
	xorl %esi,%esi		/* no error code */
	call \sym
@@ -967,6 +986,7 @@ END(spurious_interrupt)
	subq $15*8,%rsp
	CFI_ADJUST_CFA_OFFSET 15*8
	call error_entry
	DEFAULT_FRAME 0
	movq %rsp,%rdi			/* pt_regs pointer */
	movq ORIG_RAX(%rsp),%rsi	/* get error code */
	movq $-1,ORIG_RAX(%rsp)		/* no syscall to restart */
@@ -1079,40 +1099,25 @@ paranoid_schedule\trace:
 * returns in "no swapgs flag" in %ebx.
 */
KPROBE_ENTRY(error_entry)
	_frame RDI
	XCPT_FRAME
	CFI_ADJUST_CFA_OFFSET 15*8
	/* oldrax contains error code */
	cld
	movq %rdi,14*8+8(%rsp)
	CFI_REL_OFFSET rdi,RDI+8
	movq %rsi,13*8+8(%rsp)
	CFI_REL_OFFSET rsi,RSI+8
	movq %rdx,12*8+8(%rsp)
	CFI_REL_OFFSET rdx,RDX+8
	movq %rcx,11*8+8(%rsp)
	CFI_REL_OFFSET rcx,RCX+8
	movq %rax,10*8+8(%rsp)
	CFI_REL_OFFSET rax,RAX+8
	movq %r8, 9*8+8(%rsp)
	CFI_REL_OFFSET r8,R8+8
	movq %r9, 8*8+8(%rsp)
	CFI_REL_OFFSET r9,R9+8
	movq %r10,7*8+8(%rsp)
	CFI_REL_OFFSET r10,R10+8
	movq %r11,6*8+8(%rsp)
	CFI_REL_OFFSET r11,R11+8
	movq %rbx,5*8+8(%rsp)
	CFI_REL_OFFSET rbx,RBX+8
	movq %rbp,4*8+8(%rsp)
	CFI_REL_OFFSET rbp,RBP+8
	movq %r12,3*8+8(%rsp)
	CFI_REL_OFFSET r12,R12+8
	movq %r13,2*8+8(%rsp)
	CFI_REL_OFFSET r13,R13+8
	movq %r14,1*8+8(%rsp)
	CFI_REL_OFFSET r14,R14+8
	movq %r15,0*8+8(%rsp)
	CFI_REL_OFFSET r15,R15+8
	CFI_MOVQ rdi, RDI+8
	CFI_MOVQ rsi, RSI+8
	CFI_MOVQ rdx, RDX+8
	CFI_MOVQ rcx, RCX+8
	CFI_MOVQ rax, RAX+8
	CFI_MOVQ r8, R8+8
	CFI_MOVQ r9, R9+8
	CFI_MOVQ r10, R10+8
	CFI_MOVQ r11, R11+8
	CFI_MOVQ rbx, RBX+8
	CFI_MOVQ rbp, RBP+8
	CFI_MOVQ r12, R12+8
	CFI_MOVQ r13, R13+8
	CFI_MOVQ r14, R14+8
	CFI_MOVQ r15, R15+8
	xorl %ebx,%ebx
	testl $3,CS+8(%rsp)
	je error_kernelspace
@@ -1146,7 +1151,7 @@ KPROBE_END(error_entry)

/* ebx:	no swapgs flag (1: don't need swapgs, 0: need it) */
KPROBE_ENTRY(error_exit)
	_frame R15
	DEFAULT_FRAME
	movl %ebx,%eax
	RESTORE_REST
	DISABLE_INTERRUPTS(CLBR_NONE)
@@ -1455,7 +1460,7 @@ ENTRY(xen_do_hypervisor_callback) # do_hypervisor_callback(struct *pt_regs)
   see the correct pointer to the pt_regs */
	movq %rdi, %rsp            # we don't return, adjust the stack frame
	CFI_ENDPROC
	CFI_DEFAULT_STACK
	DEFAULT_FRAME
11:	incl %gs:pda_irqcount
	movq %rsp,%rbp
	CFI_DEF_CFA_REGISTER rbp
@@ -1483,10 +1488,13 @@ END(do_hypervisor_callback)
# with its current contents: any discrepancy means we in category 1.
*/
ENTRY(xen_failsafe_callback)
	framesz = (RIP-0x30)	/* workaround buggy gas */
	_frame framesz
	CFI_REL_OFFSET rcx, 0
	INTR_FRAME 1 (6*8)
	/*CFI_REL_OFFSET gs,GS*/
	/*CFI_REL_OFFSET fs,FS*/
	/*CFI_REL_OFFSET es,ES*/
	/*CFI_REL_OFFSET ds,DS*/
	CFI_REL_OFFSET r11,8
	CFI_REL_OFFSET rcx,0
	movw %ds,%cx
	cmpw %cx,0x10(%rsp)
	CFI_REMEMBER_STATE
@@ -1507,12 +1515,9 @@ ENTRY(xen_failsafe_callback)
	CFI_RESTORE r11
	addq $0x30,%rsp
	CFI_ADJUST_CFA_OFFSET -0x30
	pushq $0
	CFI_ADJUST_CFA_OFFSET 8
	pushq %r11
	CFI_ADJUST_CFA_OFFSET 8
	pushq %rcx
	CFI_ADJUST_CFA_OFFSET 8
	CFI_PUSHQ $0	/* RIP */
	CFI_PUSHQ %r11
	CFI_PUSHQ %rcx
	jmp general_protection
	CFI_RESTORE_STATE
1:	/* Segment mismatch => Category 1 (Bad segment). Retry the IRET. */
@@ -1522,8 +1527,7 @@ ENTRY(xen_failsafe_callback)
	CFI_RESTORE r11
	addq $0x30,%rsp
	CFI_ADJUST_CFA_OFFSET -0x30
	pushq $0
	CFI_ADJUST_CFA_OFFSET 8
	CFI_PUSHQ $0
	SAVE_ALL
	jmp error_exit
	CFI_ENDPROC