lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Fri, 03 Sep 2010 00:55:11 +0200
From:	"Alexander van Heukelum" <heukelum@...tmail.fm>
To:	"Jan Beulich" <JBeulich@...ell.com>, "Ingo Molnar" <mingo@...e.hu>,
	"Thomas Gleixner" <tglx@...utronix.de>,
	"H. Peter Anvin" <hpa@...or.com>
Cc:	linux-kernel@...r.kernel.org
Subject: Re: [PATCH] x86: use {push,pop}{l,q}_cfi in more places

On Thu, 02 Sep 2010 14:07 +0100, "Jan Beulich" <JBeulich@...ell.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@...ell.com>

Generated binary is identical...

Acked-by: Alexander van Heukelum <heukelum@...tmail.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@...r.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ