Messages in this thread | ![/](/images/icornerl.gif) | | From | "Alexander van Heukelum" <> | Subject | Re: [PATCH] x86: use {push,pop}{l,q}_cfi in more places | Date | Fri, 03 Sep 2010 00:55:11 +0200 |
| |
On Thu, 02 Sep 2010 14:07 +0100, "Jan Beulich" <JBeulich@novell.com> wrote: > ... 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>
Generated binary is identical...
Acked-by: Alexander van Heukelum <heukelum@fastmail.fm>
> --- > arch/x86/include/asm/dwarf2.h | 20 ++ > arch/x86/kernel/entry_32.S | 294 > ++++++++++++++---------------------------- > arch/x86/kernel/entry_64.S | 65 +++----- > 3 files changed, 141 insertions(+), 238 deletions(-) > > --- linux-2.6.36-rc3/arch/x86/include/asm/dwarf2.h > +++ 2.6.36-rc3-x86-push-pop-cfi/arch/x86/include/asm/dwarf2.h > @@ -89,6 +89,16 @@ > CFI_ADJUST_CFA_OFFSET -8 > .endm > > + .macro pushfq_cfi > + pushfq > + CFI_ADJUST_CFA_OFFSET 8 > + .endm > + > + .macro popfq_cfi > + popfq > + CFI_ADJUST_CFA_OFFSET -8 > + .endm > + > .macro movq_cfi reg offset=0 > movq %\reg, \offset(%rsp) > CFI_REL_OFFSET \reg, \offset > @@ -109,6 +119,16 @@ > CFI_ADJUST_CFA_OFFSET -4 > .endm > > + .macro pushfl_cfi > + pushfl > + CFI_ADJUST_CFA_OFFSET 4 > + .endm > + > + .macro popfl_cfi > + popfl > + CFI_ADJUST_CFA_OFFSET -4 > + .endm > + > .macro movl_cfi reg offset=0 > movl %\reg, \offset(%esp) > CFI_REL_OFFSET \reg, \offset > --- linux-2.6.36-rc3/arch/x86/kernel/entry_32.S > +++ 2.6.36-rc3-x86-push-pop-cfi/arch/x86/kernel/entry_32.S > @@ -115,8 +115,7 @@ > > /* unfortunately push/pop can't be no-op */ > .macro PUSH_GS > - pushl $0 > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $0 > .endm > .macro POP_GS pop=0 > addl $(4 + \pop), %esp > @@ -140,14 +139,12 @@ > #else /* CONFIG_X86_32_LAZY_GS */ > > .macro PUSH_GS > - pushl %gs > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %gs > /*CFI_REL_OFFSET gs, 0*/ > .endm > > .macro POP_GS pop=0 > -98: popl %gs > - CFI_ADJUST_CFA_OFFSET -4 > +98: popl_cfi %gs > /*CFI_RESTORE gs*/ > .if \pop <> 0 > add $\pop, %esp > @@ -195,35 +192,25 @@ > .macro SAVE_ALL > cld > PUSH_GS > - pushl %fs > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %fs > /*CFI_REL_OFFSET fs, 0;*/ > - pushl %es > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %es > /*CFI_REL_OFFSET es, 0;*/ > - pushl %ds > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %ds > /*CFI_REL_OFFSET ds, 0;*/ > - pushl %eax > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %eax > CFI_REL_OFFSET eax, 0 > - pushl %ebp > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %ebp > CFI_REL_OFFSET ebp, 0 > - pushl %edi > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %edi > CFI_REL_OFFSET edi, 0 > - pushl %esi > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %esi > CFI_REL_OFFSET esi, 0 > - pushl %edx > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %edx > CFI_REL_OFFSET edx, 0 > - pushl %ecx > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %ecx > CFI_REL_OFFSET ecx, 0 > - pushl %ebx > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %ebx > CFI_REL_OFFSET ebx, 0 > movl $(__USER_DS), %edx > movl %edx, %ds > @@ -234,39 +221,29 @@ > .endm > > .macro RESTORE_INT_REGS > - popl %ebx > - CFI_ADJUST_CFA_OFFSET -4 > + popl_cfi %ebx > CFI_RESTORE ebx > - popl %ecx > - CFI_ADJUST_CFA_OFFSET -4 > + popl_cfi %ecx > CFI_RESTORE ecx > - popl %edx > - CFI_ADJUST_CFA_OFFSET -4 > + popl_cfi %edx > CFI_RESTORE edx > - popl %esi > - CFI_ADJUST_CFA_OFFSET -4 > + popl_cfi %esi > CFI_RESTORE esi > - popl %edi > - CFI_ADJUST_CFA_OFFSET -4 > + popl_cfi %edi > CFI_RESTORE edi > - popl %ebp > - CFI_ADJUST_CFA_OFFSET -4 > + popl_cfi %ebp > CFI_RESTORE ebp > - popl %eax > - CFI_ADJUST_CFA_OFFSET -4 > + popl_cfi %eax > CFI_RESTORE eax > .endm > > .macro RESTORE_REGS pop=0 > RESTORE_INT_REGS > -1: popl %ds > - CFI_ADJUST_CFA_OFFSET -4 > +1: popl_cfi %ds > /*CFI_RESTORE ds;*/ > -2: popl %es > - CFI_ADJUST_CFA_OFFSET -4 > +2: popl_cfi %es > /*CFI_RESTORE es;*/ > -3: popl %fs > - CFI_ADJUST_CFA_OFFSET -4 > +3: popl_cfi %fs > /*CFI_RESTORE fs;*/ > POP_GS \pop > .pushsection .fixup, "ax" > @@ -320,16 +297,12 @@ > > ENTRY(ret_from_fork) > CFI_STARTPROC > - pushl %eax > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %eax > call schedule_tail > GET_THREAD_INFO(%ebp) > - popl %eax > - CFI_ADJUST_CFA_OFFSET -4 > - pushl $0x0202 # Reset kernel eflags > - CFI_ADJUST_CFA_OFFSET 4 > - popfl > - CFI_ADJUST_CFA_OFFSET -4 > + popl_cfi %eax > + pushl_cfi $0x0202 # Reset kernel eflags > + popfl_cfi > jmp syscall_exit > CFI_ENDPROC > END(ret_from_fork) > @@ -409,29 +382,23 @@ sysenter_past_esp: > * enough kernel state to call TRACE_IRQS_OFF can be called - but > * we immediately enable interrupts at that point anyway. > */ > - pushl $(__USER_DS) > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $(__USER_DS) > /*CFI_REL_OFFSET ss, 0*/ > - pushl %ebp > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %ebp > CFI_REL_OFFSET esp, 0 > - pushfl > + pushfl_cfi > orl $X86_EFLAGS_IF, (%esp) > - CFI_ADJUST_CFA_OFFSET 4 > - pushl $(__USER_CS) > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $(__USER_CS) > /*CFI_REL_OFFSET cs, 0*/ > /* > * Push current_thread_info()->sysenter_return to the stack. > * A tiny bit of offset fixup is necessary - 4*4 means the 4 words > * pushed above; +8 corresponds to copy_thread's esp0 setting. > */ > - pushl (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp) > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp) > CFI_REL_OFFSET eip, 0 > > - pushl %eax > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %eax > SAVE_ALL > ENABLE_INTERRUPTS(CLBR_NONE) > > @@ -486,8 +453,7 @@ sysenter_audit: > movl %eax,%edx /* 2nd arg: syscall number */ > movl $AUDIT_ARCH_I386,%eax /* 1st arg: audit arch */ > call audit_syscall_entry > - pushl %ebx > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %ebx > movl PT_EAX(%esp),%eax /* reload syscall number */ > jmp sysenter_do_call > > @@ -529,8 +495,7 @@ ENDPROC(ia32_sysenter_target) > # system call handler stub > ENTRY(system_call) > RING0_INT_FRAME # can't unwind into user space anyway > - pushl %eax # save orig_eax > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %eax # save orig_eax > SAVE_ALL > GET_THREAD_INFO(%ebp) > # system call tracing in operation / emulation > @@ -566,7 +531,6 @@ restore_all_notrace: > je ldt_ss # returning to user-space with LDT SS > restore_nocheck: > RESTORE_REGS 4 # skip orig_eax/error_code > - CFI_ADJUST_CFA_OFFSET -4 > irq_return: > INTERRUPT_RETURN > .section .fixup,"ax" > @@ -619,10 +583,8 @@ ldt_ss: > shr $16, %edx > mov %dl, GDT_ESPFIX_SS + 4 /* bits 16..23 */ > mov %dh, GDT_ESPFIX_SS + 7 /* bits 24..31 */ > - pushl $__ESPFIX_SS > - CFI_ADJUST_CFA_OFFSET 4 > - push %eax /* new kernel esp */ > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $__ESPFIX_SS > + pushl_cfi %eax /* new kernel esp */ > /* Disable interrupts, but do not irqtrace this section: we > * will soon execute iret and the tracer was already set to > * the irqstate after the iret */ > @@ -666,11 +628,9 @@ work_notifysig: # deal > with pending s > > ALIGN > work_notifysig_v86: > - pushl %ecx # save ti_flags for > do_notify_resume > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %ecx # save ti_flags for > do_notify_resume > call save_v86_state # %eax contains pt_regs pointer > - popl %ecx > - CFI_ADJUST_CFA_OFFSET -4 > + popl_cfi %ecx > movl %eax, %esp > #else > movl %esp, %eax > @@ -795,10 +763,8 @@ ptregs_clone: > mov GDT_ESPFIX_SS + 7, %ah /* bits 24..31 */ > shl $16, %eax > addl %esp, %eax /* the adjusted stack pointer */ > - pushl $__KERNEL_DS > - CFI_ADJUST_CFA_OFFSET 4 > - pushl %eax > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $__KERNEL_DS > + pushl_cfi %eax > lss (%esp), %esp /* switch to the normal stack segment */ > CFI_ADJUST_CFA_OFFSET -8 > .endm > @@ -835,8 +801,7 @@ vector=FIRST_EXTERNAL_VECTOR > .if vector <> FIRST_EXTERNAL_VECTOR > CFI_ADJUST_CFA_OFFSET -4 > .endif > -1: pushl $(~vector+0x80) /* Note: always in signed byte range */ > - CFI_ADJUST_CFA_OFFSET 4 > +1: pushl_cfi $(~vector+0x80) /* Note: always in signed byte > range */ > .if ((vector-FIRST_EXTERNAL_VECTOR)%7) <> 6 > jmp 2f > .endif > @@ -876,8 +841,7 @@ ENDPROC(common_interrupt) > #define BUILD_INTERRUPT3(name, nr, fn) \ > ENTRY(name) \ > RING0_INT_FRAME; \ > - pushl $~(nr); \ > - CFI_ADJUST_CFA_OFFSET 4; \ > + pushl_cfi $~(nr); \ > SAVE_ALL; \ > TRACE_IRQS_OFF \ > movl %esp,%eax; \ > @@ -893,21 +857,18 @@ ENDPROC(name) > > ENTRY(coprocessor_error) > RING0_INT_FRAME > - pushl $0 > - CFI_ADJUST_CFA_OFFSET 4 > - pushl $do_coprocessor_error > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $0 > + pushl_cfi $do_coprocessor_error > jmp error_code > CFI_ENDPROC > END(coprocessor_error) > > ENTRY(simd_coprocessor_error) > RING0_INT_FRAME > - pushl $0 > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $0 > #ifdef CONFIG_X86_INVD_BUG > /* AMD 486 bug: invd from userspace calls exception 19 instead of #GP */ > -661: pushl $do_general_protection > +661: pushl_cfi $do_general_protection > 662: > .section .altinstructions,"a" > .balign 4 > @@ -922,19 +883,16 @@ ENTRY(simd_coprocessor_error) > 664: > .previous > #else > - pushl $do_simd_coprocessor_error > + pushl_cfi $do_simd_coprocessor_error > #endif > - CFI_ADJUST_CFA_OFFSET 4 > jmp error_code > CFI_ENDPROC > END(simd_coprocessor_error) > > ENTRY(device_not_available) > RING0_INT_FRAME > - pushl $-1 # mark this as an int > - CFI_ADJUST_CFA_OFFSET 4 > - pushl $do_device_not_available > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $-1 # mark this as an int > + pushl_cfi $do_device_not_available > jmp error_code > CFI_ENDPROC > END(device_not_available) > @@ -956,82 +914,68 @@ END(native_irq_enable_sysexit) > > ENTRY(overflow) > RING0_INT_FRAME > - pushl $0 > - CFI_ADJUST_CFA_OFFSET 4 > - pushl $do_overflow > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $0 > + pushl_cfi $do_overflow > jmp error_code > CFI_ENDPROC > END(overflow) > > ENTRY(bounds) > RING0_INT_FRAME > - pushl $0 > - CFI_ADJUST_CFA_OFFSET 4 > - pushl $do_bounds > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $0 > + pushl_cfi $do_bounds > jmp error_code > CFI_ENDPROC > END(bounds) > > ENTRY(invalid_op) > RING0_INT_FRAME > - pushl $0 > - CFI_ADJUST_CFA_OFFSET 4 > - pushl $do_invalid_op > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $0 > + pushl_cfi $do_invalid_op > jmp error_code > CFI_ENDPROC > END(invalid_op) > > ENTRY(coprocessor_segment_overrun) > RING0_INT_FRAME > - pushl $0 > - CFI_ADJUST_CFA_OFFSET 4 > - pushl $do_coprocessor_segment_overrun > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $0 > + pushl_cfi $do_coprocessor_segment_overrun > jmp error_code > CFI_ENDPROC > END(coprocessor_segment_overrun) > > ENTRY(invalid_TSS) > RING0_EC_FRAME > - pushl $do_invalid_TSS > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $do_invalid_TSS > jmp error_code > CFI_ENDPROC > END(invalid_TSS) > > ENTRY(segment_not_present) > RING0_EC_FRAME > - pushl $do_segment_not_present > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $do_segment_not_present > jmp error_code > CFI_ENDPROC > END(segment_not_present) > > ENTRY(stack_segment) > RING0_EC_FRAME > - pushl $do_stack_segment > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $do_stack_segment > jmp error_code > CFI_ENDPROC > END(stack_segment) > > ENTRY(alignment_check) > RING0_EC_FRAME > - pushl $do_alignment_check > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $do_alignment_check > jmp error_code > CFI_ENDPROC > END(alignment_check) > > ENTRY(divide_error) > RING0_INT_FRAME > - pushl $0 # no error code > - CFI_ADJUST_CFA_OFFSET 4 > - pushl $do_divide_error > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $0 # no error code > + pushl_cfi $do_divide_error > jmp error_code > CFI_ENDPROC > END(divide_error) > @@ -1039,10 +983,8 @@ END(divide_error) > #ifdef CONFIG_X86_MCE > ENTRY(machine_check) > RING0_INT_FRAME > - pushl $0 > - CFI_ADJUST_CFA_OFFSET 4 > - pushl machine_check_vector > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $0 > + pushl_cfi machine_check_vector > jmp error_code > CFI_ENDPROC > END(machine_check) > @@ -1050,10 +992,8 @@ END(machine_check) > > ENTRY(spurious_interrupt_bug) > RING0_INT_FRAME > - pushl $0 > - CFI_ADJUST_CFA_OFFSET 4 > - pushl $do_spurious_interrupt_bug > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $0 > + pushl_cfi $do_spurious_interrupt_bug > jmp error_code > CFI_ENDPROC > END(spurious_interrupt_bug) > @@ -1084,8 +1024,7 @@ ENTRY(xen_sysenter_target) > > ENTRY(xen_hypervisor_callback) > CFI_STARTPROC > - pushl $0 > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $0 > SAVE_ALL > TRACE_IRQS_OFF > > @@ -1121,23 +1060,20 @@ ENDPROC(xen_hypervisor_callback) > # We distinguish between categories by maintaining a status value in > EAX. > ENTRY(xen_failsafe_callback) > CFI_STARTPROC > - pushl %eax > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %eax > movl $1,%eax > 1: mov 4(%esp),%ds > 2: mov 8(%esp),%es > 3: mov 12(%esp),%fs > 4: mov 16(%esp),%gs > testl %eax,%eax > - popl %eax > - CFI_ADJUST_CFA_OFFSET -4 > + popl_cfi %eax > lea 16(%esp),%esp > CFI_ADJUST_CFA_OFFSET -16 > jz 5f > addl $16,%esp > jmp iret_exc # EAX != 0 => Category 2 (Bad IRET) > -5: pushl $0 # EAX == 0 => Category 1 (Bad segment) > - CFI_ADJUST_CFA_OFFSET 4 > +5: pushl_cfi $0 # EAX == 0 => Category 1 (Bad segment) > SAVE_ALL > jmp ret_from_exception > CFI_ENDPROC > @@ -1287,40 +1223,29 @@ syscall_table_size=(.-sys_call_table) > > ENTRY(page_fault) > RING0_EC_FRAME > - pushl $do_page_fault > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $do_page_fault > ALIGN > error_code: > /* the function address is in %gs's slot on the stack */ > - pushl %fs > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %fs > /*CFI_REL_OFFSET fs, 0*/ > - pushl %es > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %es > /*CFI_REL_OFFSET es, 0*/ > - pushl %ds > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %ds > /*CFI_REL_OFFSET ds, 0*/ > - pushl %eax > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %eax > CFI_REL_OFFSET eax, 0 > - pushl %ebp > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %ebp > CFI_REL_OFFSET ebp, 0 > - pushl %edi > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %edi > CFI_REL_OFFSET edi, 0 > - pushl %esi > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %esi > CFI_REL_OFFSET esi, 0 > - pushl %edx > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %edx > CFI_REL_OFFSET edx, 0 > - pushl %ecx > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %ecx > CFI_REL_OFFSET ecx, 0 > - pushl %ebx > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %ebx > CFI_REL_OFFSET ebx, 0 > cld > movl $(__KERNEL_PERCPU), %ecx > @@ -1362,12 +1287,9 @@ END(page_fault) > movl TSS_sysenter_sp0 + \offset(%esp), %esp > CFI_DEF_CFA esp, 0 > CFI_UNDEFINED eip > - pushfl > - CFI_ADJUST_CFA_OFFSET 4 > - pushl $__KERNEL_CS > - CFI_ADJUST_CFA_OFFSET 4 > - pushl $sysenter_past_esp > - CFI_ADJUST_CFA_OFFSET 4 > + pushfl_cfi > + pushl_cfi $__KERNEL_CS > + pushl_cfi $sysenter_past_esp > CFI_REL_OFFSET eip, 0 > .endm > > @@ -1377,8 +1299,7 @@ ENTRY(debug) > jne debug_stack_correct > FIX_STACK 12, debug_stack_correct, debug_esp_fix_insn > debug_stack_correct: > - pushl $-1 # mark this as an int > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $-1 # mark this as an int > SAVE_ALL > TRACE_IRQS_OFF > xorl %edx,%edx # error code 0 > @@ -1398,32 +1319,27 @@ END(debug) > */ > ENTRY(nmi) > RING0_INT_FRAME > - pushl %eax > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %eax > movl %ss, %eax > cmpw $__ESPFIX_SS, %ax > - popl %eax > - CFI_ADJUST_CFA_OFFSET -4 > + popl_cfi %eax > je nmi_espfix_stack > cmpl $ia32_sysenter_target,(%esp) > je nmi_stack_fixup > - pushl %eax > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %eax > movl %esp,%eax > /* Do not access memory above the end of our stack page, > * it might not exist. > */ > andl $(THREAD_SIZE-1),%eax > cmpl $(THREAD_SIZE-20),%eax > - popl %eax > - CFI_ADJUST_CFA_OFFSET -4 > + popl_cfi %eax > jae nmi_stack_correct > cmpl $ia32_sysenter_target,12(%esp) > je nmi_debug_stack_check > nmi_stack_correct: > /* We have a RING0_INT_FRAME here */ > - pushl %eax > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %eax > SAVE_ALL > xorl %edx,%edx # zero error code > movl %esp,%eax # pt_regs pointer > @@ -1452,18 +1368,14 @@ nmi_espfix_stack: > * > * create the pointer to lss back > */ > - pushl %ss > - CFI_ADJUST_CFA_OFFSET 4 > - pushl %esp > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %ss > + pushl_cfi %esp > addl $4, (%esp) > /* copy the iret frame of 12 bytes */ > .rept 3 > - pushl 16(%esp) > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi 16(%esp) > .endr > - pushl %eax > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi %eax > SAVE_ALL > FIXUP_ESPFIX_STACK # %eax == %esp > xorl %edx,%edx # zero error code > @@ -1477,8 +1389,7 @@ END(nmi) > > ENTRY(int3) > RING0_INT_FRAME > - pushl $-1 # mark this as an int > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $-1 # mark this as an int > SAVE_ALL > TRACE_IRQS_OFF > xorl %edx,%edx # zero error code > @@ -1490,8 +1401,7 @@ END(int3) > > ENTRY(general_protection) > RING0_EC_FRAME > - pushl $do_general_protection > - CFI_ADJUST_CFA_OFFSET 4 > + pushl_cfi $do_general_protection > jmp error_code > CFI_ENDPROC > END(general_protection) > --- linux-2.6.36-rc3/arch/x86/kernel/entry_64.S > +++ 2.6.36-rc3-x86-push-pop-cfi/arch/x86/kernel/entry_64.S > @@ -213,23 +213,17 @@ ENDPROC(native_usergs_sysret64) > .macro FAKE_STACK_FRAME child_rip > /* push in order ss, rsp, eflags, cs, rip */ > xorl %eax, %eax > - pushq $__KERNEL_DS /* ss */ > - CFI_ADJUST_CFA_OFFSET 8 > + pushq_cfi $__KERNEL_DS /* ss */ > /*CFI_REL_OFFSET ss,0*/ > - pushq %rax /* rsp */ > - CFI_ADJUST_CFA_OFFSET 8 > + pushq_cfi %rax /* rsp */ > CFI_REL_OFFSET rsp,0 > - pushq $X86_EFLAGS_IF /* eflags - interrupts on */ > - CFI_ADJUST_CFA_OFFSET 8 > + pushq_cfi $X86_EFLAGS_IF /* eflags - interrupts on */ > /*CFI_REL_OFFSET rflags,0*/ > - pushq $__KERNEL_CS /* cs */ > - CFI_ADJUST_CFA_OFFSET 8 > + pushq_cfi $__KERNEL_CS /* cs */ > /*CFI_REL_OFFSET cs,0*/ > - pushq \child_rip /* rip */ > - CFI_ADJUST_CFA_OFFSET 8 > + pushq_cfi \child_rip /* rip */ > CFI_REL_OFFSET rip,0 > - pushq %rax /* orig rax */ > - CFI_ADJUST_CFA_OFFSET 8 > + pushq_cfi %rax /* orig rax */ > .endm > > .macro UNFAKE_STACK_FRAME > @@ -398,10 +392,8 @@ ENTRY(ret_from_fork) > > LOCK ; btr $TIF_FORK,TI_flags(%r8) > > - push kernel_eflags(%rip) > - CFI_ADJUST_CFA_OFFSET 8 > - popf # reset kernel eflags > - CFI_ADJUST_CFA_OFFSET -8 > + pushq_cfi kernel_eflags(%rip) > + popfq_cfi # reset kernel eflags > > call schedule_tail # rdi: 'prev' task parameter > > @@ -521,11 +513,9 @@ sysret_careful: > jnc sysret_signal > TRACE_IRQS_ON > ENABLE_INTERRUPTS(CLBR_NONE) > - pushq %rdi > - CFI_ADJUST_CFA_OFFSET 8 > + pushq_cfi %rdi > call schedule > - popq %rdi > - CFI_ADJUST_CFA_OFFSET -8 > + popq_cfi %rdi > jmp sysret_check > > /* Handle a signal */ > @@ -634,11 +624,9 @@ int_careful: > jnc int_very_careful > TRACE_IRQS_ON > ENABLE_INTERRUPTS(CLBR_NONE) > - pushq %rdi > - CFI_ADJUST_CFA_OFFSET 8 > + pushq_cfi %rdi > call schedule > - popq %rdi > - CFI_ADJUST_CFA_OFFSET -8 > + popq_cfi %rdi > DISABLE_INTERRUPTS(CLBR_NONE) > TRACE_IRQS_OFF > jmp int_with_check > @@ -652,12 +640,10 @@ int_check_syscall_exit_work: > /* Check for syscall exit trace */ > testl $_TIF_WORK_SYSCALL_EXIT,%edx > jz int_signal > - pushq %rdi > - CFI_ADJUST_CFA_OFFSET 8 > + pushq_cfi %rdi > leaq 8(%rsp),%rdi # &ptregs -> arg1 > call syscall_trace_leave > - popq %rdi > - CFI_ADJUST_CFA_OFFSET -8 > + popq_cfi %rdi > andl $~(_TIF_WORK_SYSCALL_EXIT|_TIF_SYSCALL_EMU),%edi > jmp int_restore_rest > > @@ -766,8 +752,7 @@ vector=FIRST_EXTERNAL_VECTOR > .if vector <> FIRST_EXTERNAL_VECTOR > CFI_ADJUST_CFA_OFFSET -8 > .endif > -1: pushq $(~vector+0x80) /* Note: always in signed byte range */ > - CFI_ADJUST_CFA_OFFSET 8 > +1: pushq_cfi $(~vector+0x80) /* Note: always in signed byte > range */ > .if ((vector-FIRST_EXTERNAL_VECTOR)%7) <> 6 > jmp 2f > .endif > @@ -822,6 +807,7 @@ ret_from_intr: > TRACE_IRQS_OFF > decl PER_CPU_VAR(irq_count) > leaveq > + CFI_RESTORE rbp > CFI_DEF_CFA_REGISTER rsp > CFI_ADJUST_CFA_OFFSET -8 > exit_intr: > @@ -903,11 +889,9 @@ retint_careful: > jnc retint_signal > TRACE_IRQS_ON > ENABLE_INTERRUPTS(CLBR_NONE) > - pushq %rdi > - CFI_ADJUST_CFA_OFFSET 8 > + pushq_cfi %rdi > call schedule > - popq %rdi > - CFI_ADJUST_CFA_OFFSET -8 > + popq_cfi %rdi > GET_THREAD_INFO(%rcx) > DISABLE_INTERRUPTS(CLBR_NONE) > TRACE_IRQS_OFF > @@ -956,8 +940,7 @@ END(common_interrupt) > .macro apicinterrupt num sym do_sym > ENTRY(\sym) > INTR_FRAME > - pushq $~(\num) > - CFI_ADJUST_CFA_OFFSET 8 > + pushq_cfi $~(\num) > interrupt \do_sym > jmp ret_from_intr > CFI_ENDPROC > @@ -1139,16 +1122,14 @@ zeroentry simd_coprocessor_error do_simd > /* edi: new selector */ > ENTRY(native_load_gs_index) > CFI_STARTPROC > - pushf > - CFI_ADJUST_CFA_OFFSET 8 > + pushfq_cfi > DISABLE_INTERRUPTS(CLBR_ANY & ~CLBR_RDI) > SWAPGS > gs_change: > movl %edi,%gs > 2: mfence /* workaround */ > SWAPGS > - popf > - CFI_ADJUST_CFA_OFFSET -8 > + popfq_cfi > ret > CFI_ENDPROC > END(native_load_gs_index) > @@ -1215,8 +1196,7 @@ END(kernel_execve) > /* Call softirq on interrupt stack. Interrupts are off. */ > ENTRY(call_softirq) > CFI_STARTPROC > - push %rbp > - CFI_ADJUST_CFA_OFFSET 8 > + pushq_cfi %rbp > CFI_REL_OFFSET rbp,0 > mov %rsp,%rbp > CFI_DEF_CFA_REGISTER rbp > @@ -1225,6 +1205,7 @@ ENTRY(call_softirq) > push %rbp # backlink for old unwinder > call __do_softirq > leaveq > + CFI_RESTORE rbp > CFI_DEF_CFA_REGISTER rsp > CFI_ADJUST_CFA_OFFSET -8 > decl PER_CPU_VAR(irq_count) > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" > in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > > >
| ![\](/images/icornerr.gif) |