aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/entry_64.S
diff options
context:
space:
mode:
authorJan Beulich <JBeulich@novell.com>2010-09-02 09:07:16 -0400
committerIngo Molnar <mingo@elte.hu>2010-09-03 02:14:11 -0400
commitdf5d1874ce1a1f0e0eceff4fa3a9d45620243a68 (patch)
tree0537808418ae9d181fa4a569b3573b1ac59e83c0 /arch/x86/kernel/entry_64.S
parenta34107b5577968dc53cf9c2195c7c2d4a2caf9ce (diff)
x86: Use {push,pop}{l,q}_cfi in more places
... plus additionally introduce {push,pop}f{l,q}_cfi. All in the hope that the code becomes better readable this way (it gets quite a bit smaller in any case). Signed-off-by: Jan Beulich <jbeulich@novell.com> Acked-by: Alexander van Heukelum <heukelum@fastmail.fm> LKML-Reference: <4C7FBDA40200007800013FAF@vpn.id2.novell.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/entry_64.S')
-rw-r--r--arch/x86/kernel/entry_64.S65
1 files changed, 23 insertions, 42 deletions
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
index 6f305830c80c..8851a2bb8c0b 100644
--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -213,23 +213,17 @@ ENDPROC(native_usergs_sysret64)
213 .macro FAKE_STACK_FRAME child_rip 213 .macro FAKE_STACK_FRAME child_rip
214 /* push in order ss, rsp, eflags, cs, rip */ 214 /* push in order ss, rsp, eflags, cs, rip */
215 xorl %eax, %eax 215 xorl %eax, %eax
216 pushq $__KERNEL_DS /* ss */ 216 pushq_cfi $__KERNEL_DS /* ss */
217 CFI_ADJUST_CFA_OFFSET 8
218 /*CFI_REL_OFFSET ss,0*/ 217 /*CFI_REL_OFFSET ss,0*/
219 pushq %rax /* rsp */ 218 pushq_cfi %rax /* rsp */
220 CFI_ADJUST_CFA_OFFSET 8
221 CFI_REL_OFFSET rsp,0 219 CFI_REL_OFFSET rsp,0
222 pushq $X86_EFLAGS_IF /* eflags - interrupts on */ 220 pushq_cfi $X86_EFLAGS_IF /* eflags - interrupts on */
223 CFI_ADJUST_CFA_OFFSET 8
224 /*CFI_REL_OFFSET rflags,0*/ 221 /*CFI_REL_OFFSET rflags,0*/
225 pushq $__KERNEL_CS /* cs */ 222 pushq_cfi $__KERNEL_CS /* cs */
226 CFI_ADJUST_CFA_OFFSET 8
227 /*CFI_REL_OFFSET cs,0*/ 223 /*CFI_REL_OFFSET cs,0*/
228 pushq \child_rip /* rip */ 224 pushq_cfi \child_rip /* rip */
229 CFI_ADJUST_CFA_OFFSET 8
230 CFI_REL_OFFSET rip,0 225 CFI_REL_OFFSET rip,0
231 pushq %rax /* orig rax */ 226 pushq_cfi %rax /* orig rax */
232 CFI_ADJUST_CFA_OFFSET 8
233 .endm 227 .endm
234 228
235 .macro UNFAKE_STACK_FRAME 229 .macro UNFAKE_STACK_FRAME
@@ -398,10 +392,8 @@ ENTRY(ret_from_fork)
398 392
399 LOCK ; btr $TIF_FORK,TI_flags(%r8) 393 LOCK ; btr $TIF_FORK,TI_flags(%r8)
400 394
401 push kernel_eflags(%rip) 395 pushq_cfi kernel_eflags(%rip)
402 CFI_ADJUST_CFA_OFFSET 8 396 popfq_cfi # reset kernel eflags
403 popf # reset kernel eflags
404 CFI_ADJUST_CFA_OFFSET -8
405 397
406 call schedule_tail # rdi: 'prev' task parameter 398 call schedule_tail # rdi: 'prev' task parameter
407 399
@@ -521,11 +513,9 @@ sysret_careful:
521 jnc sysret_signal 513 jnc sysret_signal
522 TRACE_IRQS_ON 514 TRACE_IRQS_ON
523 ENABLE_INTERRUPTS(CLBR_NONE) 515 ENABLE_INTERRUPTS(CLBR_NONE)
524 pushq %rdi 516 pushq_cfi %rdi
525 CFI_ADJUST_CFA_OFFSET 8
526 call schedule 517 call schedule
527 popq %rdi 518 popq_cfi %rdi
528 CFI_ADJUST_CFA_OFFSET -8
529 jmp sysret_check 519 jmp sysret_check
530 520
531 /* Handle a signal */ 521 /* Handle a signal */
@@ -634,11 +624,9 @@ int_careful:
634 jnc int_very_careful 624 jnc int_very_careful
635 TRACE_IRQS_ON 625 TRACE_IRQS_ON
636 ENABLE_INTERRUPTS(CLBR_NONE) 626 ENABLE_INTERRUPTS(CLBR_NONE)
637 pushq %rdi 627 pushq_cfi %rdi
638 CFI_ADJUST_CFA_OFFSET 8
639 call schedule 628 call schedule
640 popq %rdi 629 popq_cfi %rdi
641 CFI_ADJUST_CFA_OFFSET -8
642 DISABLE_INTERRUPTS(CLBR_NONE) 630 DISABLE_INTERRUPTS(CLBR_NONE)
643 TRACE_IRQS_OFF 631 TRACE_IRQS_OFF
644 jmp int_with_check 632 jmp int_with_check
@@ -652,12 +640,10 @@ int_check_syscall_exit_work:
652 /* Check for syscall exit trace */ 640 /* Check for syscall exit trace */
653 testl $_TIF_WORK_SYSCALL_EXIT,%edx 641 testl $_TIF_WORK_SYSCALL_EXIT,%edx
654 jz int_signal 642 jz int_signal
655 pushq %rdi 643 pushq_cfi %rdi
656 CFI_ADJUST_CFA_OFFSET 8
657 leaq 8(%rsp),%rdi # &ptregs -> arg1 644 leaq 8(%rsp),%rdi # &ptregs -> arg1
658 call syscall_trace_leave 645 call syscall_trace_leave
659 popq %rdi 646 popq_cfi %rdi
660 CFI_ADJUST_CFA_OFFSET -8
661 andl $~(_TIF_WORK_SYSCALL_EXIT|_TIF_SYSCALL_EMU),%edi 647 andl $~(_TIF_WORK_SYSCALL_EXIT|_TIF_SYSCALL_EMU),%edi
662 jmp int_restore_rest 648 jmp int_restore_rest
663 649
@@ -765,8 +751,7 @@ vector=FIRST_EXTERNAL_VECTOR
765 .if vector <> FIRST_EXTERNAL_VECTOR 751 .if vector <> FIRST_EXTERNAL_VECTOR
766 CFI_ADJUST_CFA_OFFSET -8 752 CFI_ADJUST_CFA_OFFSET -8
767 .endif 753 .endif
7681: pushq $(~vector+0x80) /* Note: always in signed byte range */ 7541: pushq_cfi $(~vector+0x80) /* Note: always in signed byte range */
769 CFI_ADJUST_CFA_OFFSET 8
770 .if ((vector-FIRST_EXTERNAL_VECTOR)%7) <> 6 755 .if ((vector-FIRST_EXTERNAL_VECTOR)%7) <> 6
771 jmp 2f 756 jmp 2f
772 .endif 757 .endif
@@ -821,6 +806,7 @@ ret_from_intr:
821 TRACE_IRQS_OFF 806 TRACE_IRQS_OFF
822 decl PER_CPU_VAR(irq_count) 807 decl PER_CPU_VAR(irq_count)
823 leaveq 808 leaveq
809 CFI_RESTORE rbp
824 CFI_DEF_CFA_REGISTER rsp 810 CFI_DEF_CFA_REGISTER rsp
825 CFI_ADJUST_CFA_OFFSET -8 811 CFI_ADJUST_CFA_OFFSET -8
826exit_intr: 812exit_intr:
@@ -902,11 +888,9 @@ retint_careful:
902 jnc retint_signal 888 jnc retint_signal
903 TRACE_IRQS_ON 889 TRACE_IRQS_ON
904 ENABLE_INTERRUPTS(CLBR_NONE) 890 ENABLE_INTERRUPTS(CLBR_NONE)
905 pushq %rdi 891 pushq_cfi %rdi
906 CFI_ADJUST_CFA_OFFSET 8
907 call schedule 892 call schedule
908 popq %rdi 893 popq_cfi %rdi
909 CFI_ADJUST_CFA_OFFSET -8
910 GET_THREAD_INFO(%rcx) 894 GET_THREAD_INFO(%rcx)
911 DISABLE_INTERRUPTS(CLBR_NONE) 895 DISABLE_INTERRUPTS(CLBR_NONE)
912 TRACE_IRQS_OFF 896 TRACE_IRQS_OFF
@@ -955,8 +939,7 @@ END(common_interrupt)
955.macro apicinterrupt num sym do_sym 939.macro apicinterrupt num sym do_sym
956ENTRY(\sym) 940ENTRY(\sym)
957 INTR_FRAME 941 INTR_FRAME
958 pushq $~(\num) 942 pushq_cfi $~(\num)
959 CFI_ADJUST_CFA_OFFSET 8
960 interrupt \do_sym 943 interrupt \do_sym
961 jmp ret_from_intr 944 jmp ret_from_intr
962 CFI_ENDPROC 945 CFI_ENDPROC
@@ -1138,16 +1121,14 @@ zeroentry simd_coprocessor_error do_simd_coprocessor_error
1138 /* edi: new selector */ 1121 /* edi: new selector */
1139ENTRY(native_load_gs_index) 1122ENTRY(native_load_gs_index)
1140 CFI_STARTPROC 1123 CFI_STARTPROC
1141 pushf 1124 pushfq_cfi
1142 CFI_ADJUST_CFA_OFFSET 8
1143 DISABLE_INTERRUPTS(CLBR_ANY & ~CLBR_RDI) 1125 DISABLE_INTERRUPTS(CLBR_ANY & ~CLBR_RDI)
1144 SWAPGS 1126 SWAPGS
1145gs_change: 1127gs_change:
1146 movl %edi,%gs 1128 movl %edi,%gs
11472: mfence /* workaround */ 11292: mfence /* workaround */
1148 SWAPGS 1130 SWAPGS
1149 popf 1131 popfq_cfi
1150 CFI_ADJUST_CFA_OFFSET -8
1151 ret 1132 ret
1152 CFI_ENDPROC 1133 CFI_ENDPROC
1153END(native_load_gs_index) 1134END(native_load_gs_index)
@@ -1214,8 +1195,7 @@ END(kernel_execve)
1214/* Call softirq on interrupt stack. Interrupts are off. */ 1195/* Call softirq on interrupt stack. Interrupts are off. */
1215ENTRY(call_softirq) 1196ENTRY(call_softirq)
1216 CFI_STARTPROC 1197 CFI_STARTPROC
1217 push %rbp 1198 pushq_cfi %rbp
1218 CFI_ADJUST_CFA_OFFSET 8
1219 CFI_REL_OFFSET rbp,0 1199 CFI_REL_OFFSET rbp,0
1220 mov %rsp,%rbp 1200 mov %rsp,%rbp
1221 CFI_DEF_CFA_REGISTER rbp 1201 CFI_DEF_CFA_REGISTER rbp
@@ -1224,6 +1204,7 @@ ENTRY(call_softirq)
1224 push %rbp # backlink for old unwinder 1204 push %rbp # backlink for old unwinder
1225 call __do_softirq 1205 call __do_softirq
1226 leaveq 1206 leaveq
1207 CFI_RESTORE rbp
1227 CFI_DEF_CFA_REGISTER rsp 1208 CFI_DEF_CFA_REGISTER rsp
1228 CFI_ADJUST_CFA_OFFSET -8 1209 CFI_ADJUST_CFA_OFFSET -8
1229 decl PER_CPU_VAR(irq_count) 1210 decl PER_CPU_VAR(irq_count)