forked from Minki/linux
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: Alexander van Heukelum <heukelum@fastmail.fm> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
d99015b1ab
commit
dcd072e260
@ -60,6 +60,23 @@
|
|||||||
#define __AUDIT_ARCH_LE 0x40000000
|
#define __AUDIT_ARCH_LE 0x40000000
|
||||||
|
|
||||||
.code64
|
.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_FUNCTION_TRACER
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
@ -213,84 +230,84 @@ ENTRY(native_usergs_sysret64)
|
|||||||
CFI_ADJUST_CFA_OFFSET -(6*8)
|
CFI_ADJUST_CFA_OFFSET -(6*8)
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro CFI_DEFAULT_STACK start=1
|
|
||||||
.if \start
|
|
||||||
CFI_STARTPROC simple
|
|
||||||
CFI_SIGNAL_FRAME
|
|
||||||
CFI_DEF_CFA rsp,SS+8
|
|
||||||
.else
|
|
||||||
CFI_DEF_CFA_OFFSET SS+8
|
|
||||||
.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
|
.macro EMPTY_FRAME start=1 offset=0
|
||||||
|
.if \start
|
||||||
CFI_STARTPROC simple
|
CFI_STARTPROC simple
|
||||||
CFI_SIGNAL_FRAME
|
CFI_SIGNAL_FRAME
|
||||||
CFI_DEF_CFA rsp,SS+8-\ref
|
CFI_DEF_CFA rsp,8+\offset
|
||||||
/*CFI_REL_OFFSET ss,SS-\ref*/
|
.else
|
||||||
CFI_REL_OFFSET rsp,RSP-\ref
|
CFI_DEF_CFA_OFFSET 8+\offset
|
||||||
/*CFI_REL_OFFSET rflags,EFLAGS-\ref*/
|
.endif
|
||||||
/*CFI_REL_OFFSET cs,CS-\ref*/
|
|
||||||
CFI_REL_OFFSET rip,RIP-\ref
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* initial frame state for interrupts (and exceptions without error code)
|
* initial frame state for interrupts (and exceptions without error code)
|
||||||
*/
|
*/
|
||||||
#define INTR_FRAME _frame RIP
|
.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 exceptions with error code (and interrupts
|
* initial frame state for exceptions with error code (and interrupts
|
||||||
* with vector already pushed)
|
* 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 */
|
/* save partial stack frame */
|
||||||
ENTRY(save_args)
|
ENTRY(save_args)
|
||||||
XCPT_FRAME
|
XCPT_FRAME
|
||||||
cld
|
cld
|
||||||
movq %rdi, 8*8+16(%rsp)
|
CFI_MOVQ rdi, (RDI-ARGOFFSET)+16
|
||||||
CFI_REL_OFFSET rdi, 8*8+16
|
CFI_MOVQ rsi, (RSI-ARGOFFSET)+16
|
||||||
movq %rsi, 7*8+16(%rsp)
|
CFI_MOVQ rdx, (RDX-ARGOFFSET)+16
|
||||||
CFI_REL_OFFSET rsi, 7*8+16
|
CFI_MOVQ rcx, (RCX-ARGOFFSET)+16
|
||||||
movq %rdx, 6*8+16(%rsp)
|
CFI_MOVQ rax, (RAX-ARGOFFSET)+16
|
||||||
CFI_REL_OFFSET rdx, 6*8+16
|
CFI_MOVQ r8, (R8-ARGOFFSET)+16
|
||||||
movq %rcx, 5*8+16(%rsp)
|
CFI_MOVQ r9, (R9-ARGOFFSET)+16
|
||||||
CFI_REL_OFFSET rcx, 5*8+16
|
CFI_MOVQ r10, (R10-ARGOFFSET)+16
|
||||||
movq %rax, 4*8+16(%rsp)
|
CFI_MOVQ r11, (R11-ARGOFFSET)+16
|
||||||
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
|
|
||||||
leaq -ARGOFFSET+16(%rsp),%rdi /* arg1 for handler */
|
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 */
|
leaq 8(%rsp), %rbp /* mov %rsp, %ebp */
|
||||||
testl $3, CS(%rdi)
|
testl $3, CS(%rdi)
|
||||||
je 1f
|
je 1f
|
||||||
@ -303,9 +320,10 @@ ENTRY(save_args)
|
|||||||
*/
|
*/
|
||||||
1: incl %gs:pda_irqcount
|
1: incl %gs:pda_irqcount
|
||||||
jne 2f
|
jne 2f
|
||||||
pop %rax /* move return address... */
|
CFI_POPQ %rax /* move return address... */
|
||||||
mov %gs:pda_irqstackptr,%rsp
|
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:
|
* We entered an interrupt context - irqs are off:
|
||||||
*/
|
*/
|
||||||
@ -319,7 +337,7 @@ END(save_args)
|
|||||||
*/
|
*/
|
||||||
/* rdi: prev */
|
/* rdi: prev */
|
||||||
ENTRY(ret_from_fork)
|
ENTRY(ret_from_fork)
|
||||||
CFI_DEFAULT_STACK
|
DEFAULT_FRAME
|
||||||
push kernel_eflags(%rip)
|
push kernel_eflags(%rip)
|
||||||
CFI_ADJUST_CFA_OFFSET 8
|
CFI_ADJUST_CFA_OFFSET 8
|
||||||
popf # reset kernel eflags
|
popf # reset kernel eflags
|
||||||
@ -732,6 +750,7 @@ END(interrupt)
|
|||||||
subq $10*8, %rsp
|
subq $10*8, %rsp
|
||||||
CFI_ADJUST_CFA_OFFSET 10*8
|
CFI_ADJUST_CFA_OFFSET 10*8
|
||||||
call save_args
|
call save_args
|
||||||
|
PARTIAL_FRAME 0
|
||||||
call \func
|
call \func
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
@ -949,11 +968,11 @@ END(spurious_interrupt)
|
|||||||
.macro zeroentry sym
|
.macro zeroentry sym
|
||||||
INTR_FRAME
|
INTR_FRAME
|
||||||
PARAVIRT_ADJUST_EXCEPTION_FRAME
|
PARAVIRT_ADJUST_EXCEPTION_FRAME
|
||||||
pushq $-1 /* ORIG_RAX: no syscall to restart */
|
CFI_PUSHQ $-1 /* ORIG_RAX: no syscall to restart */
|
||||||
CFI_ADJUST_CFA_OFFSET 8
|
|
||||||
subq $15*8,%rsp
|
subq $15*8,%rsp
|
||||||
CFI_ADJUST_CFA_OFFSET 15*8
|
CFI_ADJUST_CFA_OFFSET 15*8
|
||||||
call error_entry
|
call error_entry
|
||||||
|
DEFAULT_FRAME 0
|
||||||
movq %rsp,%rdi /* pt_regs pointer */
|
movq %rsp,%rdi /* pt_regs pointer */
|
||||||
xorl %esi,%esi /* no error code */
|
xorl %esi,%esi /* no error code */
|
||||||
call \sym
|
call \sym
|
||||||
@ -967,6 +986,7 @@ END(spurious_interrupt)
|
|||||||
subq $15*8,%rsp
|
subq $15*8,%rsp
|
||||||
CFI_ADJUST_CFA_OFFSET 15*8
|
CFI_ADJUST_CFA_OFFSET 15*8
|
||||||
call error_entry
|
call error_entry
|
||||||
|
DEFAULT_FRAME 0
|
||||||
movq %rsp,%rdi /* pt_regs pointer */
|
movq %rsp,%rdi /* pt_regs pointer */
|
||||||
movq ORIG_RAX(%rsp),%rsi /* get error code */
|
movq ORIG_RAX(%rsp),%rsi /* get error code */
|
||||||
movq $-1,ORIG_RAX(%rsp) /* no syscall to restart */
|
movq $-1,ORIG_RAX(%rsp) /* no syscall to restart */
|
||||||
@ -1079,40 +1099,25 @@ paranoid_schedule\trace:
|
|||||||
* returns in "no swapgs flag" in %ebx.
|
* returns in "no swapgs flag" in %ebx.
|
||||||
*/
|
*/
|
||||||
KPROBE_ENTRY(error_entry)
|
KPROBE_ENTRY(error_entry)
|
||||||
_frame RDI
|
XCPT_FRAME
|
||||||
CFI_ADJUST_CFA_OFFSET 15*8
|
CFI_ADJUST_CFA_OFFSET 15*8
|
||||||
/* oldrax contains error code */
|
/* oldrax contains error code */
|
||||||
cld
|
cld
|
||||||
movq %rdi,14*8+8(%rsp)
|
CFI_MOVQ rdi, RDI+8
|
||||||
CFI_REL_OFFSET rdi,RDI+8
|
CFI_MOVQ rsi, RSI+8
|
||||||
movq %rsi,13*8+8(%rsp)
|
CFI_MOVQ rdx, RDX+8
|
||||||
CFI_REL_OFFSET rsi,RSI+8
|
CFI_MOVQ rcx, RCX+8
|
||||||
movq %rdx,12*8+8(%rsp)
|
CFI_MOVQ rax, RAX+8
|
||||||
CFI_REL_OFFSET rdx,RDX+8
|
CFI_MOVQ r8, R8+8
|
||||||
movq %rcx,11*8+8(%rsp)
|
CFI_MOVQ r9, R9+8
|
||||||
CFI_REL_OFFSET rcx,RCX+8
|
CFI_MOVQ r10, R10+8
|
||||||
movq %rax,10*8+8(%rsp)
|
CFI_MOVQ r11, R11+8
|
||||||
CFI_REL_OFFSET rax,RAX+8
|
CFI_MOVQ rbx, RBX+8
|
||||||
movq %r8, 9*8+8(%rsp)
|
CFI_MOVQ rbp, RBP+8
|
||||||
CFI_REL_OFFSET r8,R8+8
|
CFI_MOVQ r12, R12+8
|
||||||
movq %r9, 8*8+8(%rsp)
|
CFI_MOVQ r13, R13+8
|
||||||
CFI_REL_OFFSET r9,R9+8
|
CFI_MOVQ r14, R14+8
|
||||||
movq %r10,7*8+8(%rsp)
|
CFI_MOVQ r15, R15+8
|
||||||
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
|
|
||||||
xorl %ebx,%ebx
|
xorl %ebx,%ebx
|
||||||
testl $3,CS+8(%rsp)
|
testl $3,CS+8(%rsp)
|
||||||
je error_kernelspace
|
je error_kernelspace
|
||||||
@ -1146,7 +1151,7 @@ KPROBE_END(error_entry)
|
|||||||
|
|
||||||
/* ebx: no swapgs flag (1: don't need swapgs, 0: need it) */
|
/* ebx: no swapgs flag (1: don't need swapgs, 0: need it) */
|
||||||
KPROBE_ENTRY(error_exit)
|
KPROBE_ENTRY(error_exit)
|
||||||
_frame R15
|
DEFAULT_FRAME
|
||||||
movl %ebx,%eax
|
movl %ebx,%eax
|
||||||
RESTORE_REST
|
RESTORE_REST
|
||||||
DISABLE_INTERRUPTS(CLBR_NONE)
|
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 */
|
see the correct pointer to the pt_regs */
|
||||||
movq %rdi, %rsp # we don't return, adjust the stack frame
|
movq %rdi, %rsp # we don't return, adjust the stack frame
|
||||||
CFI_ENDPROC
|
CFI_ENDPROC
|
||||||
CFI_DEFAULT_STACK
|
DEFAULT_FRAME
|
||||||
11: incl %gs:pda_irqcount
|
11: incl %gs:pda_irqcount
|
||||||
movq %rsp,%rbp
|
movq %rsp,%rbp
|
||||||
CFI_DEF_CFA_REGISTER 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.
|
# with its current contents: any discrepancy means we in category 1.
|
||||||
*/
|
*/
|
||||||
ENTRY(xen_failsafe_callback)
|
ENTRY(xen_failsafe_callback)
|
||||||
framesz = (RIP-0x30) /* workaround buggy gas */
|
INTR_FRAME 1 (6*8)
|
||||||
_frame framesz
|
/*CFI_REL_OFFSET gs,GS*/
|
||||||
CFI_REL_OFFSET rcx, 0
|
/*CFI_REL_OFFSET fs,FS*/
|
||||||
CFI_REL_OFFSET r11, 8
|
/*CFI_REL_OFFSET es,ES*/
|
||||||
|
/*CFI_REL_OFFSET ds,DS*/
|
||||||
|
CFI_REL_OFFSET r11,8
|
||||||
|
CFI_REL_OFFSET rcx,0
|
||||||
movw %ds,%cx
|
movw %ds,%cx
|
||||||
cmpw %cx,0x10(%rsp)
|
cmpw %cx,0x10(%rsp)
|
||||||
CFI_REMEMBER_STATE
|
CFI_REMEMBER_STATE
|
||||||
@ -1507,12 +1515,9 @@ ENTRY(xen_failsafe_callback)
|
|||||||
CFI_RESTORE r11
|
CFI_RESTORE r11
|
||||||
addq $0x30,%rsp
|
addq $0x30,%rsp
|
||||||
CFI_ADJUST_CFA_OFFSET -0x30
|
CFI_ADJUST_CFA_OFFSET -0x30
|
||||||
pushq $0
|
CFI_PUSHQ $0 /* RIP */
|
||||||
CFI_ADJUST_CFA_OFFSET 8
|
CFI_PUSHQ %r11
|
||||||
pushq %r11
|
CFI_PUSHQ %rcx
|
||||||
CFI_ADJUST_CFA_OFFSET 8
|
|
||||||
pushq %rcx
|
|
||||||
CFI_ADJUST_CFA_OFFSET 8
|
|
||||||
jmp general_protection
|
jmp general_protection
|
||||||
CFI_RESTORE_STATE
|
CFI_RESTORE_STATE
|
||||||
1: /* Segment mismatch => Category 1 (Bad segment). Retry the IRET. */
|
1: /* Segment mismatch => Category 1 (Bad segment). Retry the IRET. */
|
||||||
@ -1522,8 +1527,7 @@ ENTRY(xen_failsafe_callback)
|
|||||||
CFI_RESTORE r11
|
CFI_RESTORE r11
|
||||||
addq $0x30,%rsp
|
addq $0x30,%rsp
|
||||||
CFI_ADJUST_CFA_OFFSET -0x30
|
CFI_ADJUST_CFA_OFFSET -0x30
|
||||||
pushq $0
|
CFI_PUSHQ $0
|
||||||
CFI_ADJUST_CFA_OFFSET 8
|
|
||||||
SAVE_ALL
|
SAVE_ALL
|
||||||
jmp error_exit
|
jmp error_exit
|
||||||
CFI_ENDPROC
|
CFI_ENDPROC
|
||||||
|
Loading…
Reference in New Issue
Block a user