diff options
author | Jan Beulich <JBeulich@novell.com> | 2010-09-02 09:07:16 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-09-03 02:14:11 -0400 |
commit | df5d1874ce1a1f0e0eceff4fa3a9d45620243a68 (patch) | |
tree | 0537808418ae9d181fa4a569b3573b1ac59e83c0 /arch/x86/kernel/entry_64.S | |
parent | a34107b5577968dc53cf9c2195c7c2d4a2caf9ce (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.S | 65 |
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 |
768 | 1: pushq $(~vector+0x80) /* Note: always in signed byte range */ | 754 | 1: 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 |
826 | exit_intr: | 812 | exit_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 |
956 | ENTRY(\sym) | 940 | ENTRY(\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 */ |
1139 | ENTRY(native_load_gs_index) | 1122 | ENTRY(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 |
1145 | gs_change: | 1127 | gs_change: |
1146 | movl %edi,%gs | 1128 | movl %edi,%gs |
1147 | 2: mfence /* workaround */ | 1129 | 2: 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 |
1153 | END(native_load_gs_index) | 1134 | END(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. */ |
1215 | ENTRY(call_softirq) | 1196 | ENTRY(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) |