LKML Archive on lore.kernel.org help / color / mirror / Atom feed
* STT_FUNC for assembler checksum and semaphore ops" in git-x86 @ 2008-01-09 21:57 Andi Kleen 2008-01-10 7:42 ` Sam Ravnborg 0 siblings, 1 reply; 7+ messages in thread From: Andi Kleen @ 2008-01-09 21:57 UTC (permalink / raw) To: jreiser, mingo; +Cc: tglx, linux-kernel In gitx86: commit 692effca950d7c6032e8e2ae785a32383e7af4a3 Author: John Reiser <jreiser@BitWagon.com> Date: Wed Jan 9 13:31:12 2008 +0100 STT_FUNC for assembler checksum and semaphore ops ... Comments? Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu> diff --git a/arch/x86/lib/checksum_32.S b/arch/x86/lib/checksum_32.S index adbccd0..1f9aacb 100644 --- a/arch/x86/lib/checksum_32.S +++ b/arch/x86/lib/checksum_32.S @@ -48,6 +48,7 @@ unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum) * Fortunately, it is easy to convert 2-byte alignment to 4-byte * alignment for the unrolled loop. */ + .type csum_partial, @function ENTRY(csum_partial) + .type csum_partial, @function ENTRY(csum_partial) CFI_STARTPROC pushl %esi @@ -141,11 +142,13 @@ ENTRY(csum_partial) ret CFI_ENDPROC ENDPROC(csum_partial) + .size csum_partial, . - csum_partial AK: Better option would be to just add to ENTRY/ENDPROC do something like (untested) #define ENTRY(x) \ ... .set curfunc, x #define ENDPROC(x) \ ... .size x - curfunc -Andi ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: STT_FUNC for assembler checksum and semaphore ops" in git-x86 2008-01-09 21:57 STT_FUNC for assembler checksum and semaphore ops" in git-x86 Andi Kleen @ 2008-01-10 7:42 ` Sam Ravnborg 2008-01-10 16:37 ` John Reiser 0 siblings, 1 reply; 7+ messages in thread From: Sam Ravnborg @ 2008-01-10 7:42 UTC (permalink / raw) To: Andi Kleen; +Cc: jreiser, mingo, tglx, linux-kernel On Wed, Jan 09, 2008 at 10:57:25PM +0100, Andi Kleen wrote: > > In gitx86: > > commit 692effca950d7c6032e8e2ae785a32383e7af4a3 > Author: John Reiser <jreiser@BitWagon.com> > Date: Wed Jan 9 13:31:12 2008 +0100 > > STT_FUNC for assembler checksum and semaphore ops > ... > Comments? > > Signed-off-by: Thomas Gleixner <tglx@linutronix.de> > Signed-off-by: Ingo Molnar <mingo@elte.hu> > > diff --git a/arch/x86/lib/checksum_32.S b/arch/x86/lib/checksum_32.S > index adbccd0..1f9aacb 100644 > --- a/arch/x86/lib/checksum_32.S > +++ b/arch/x86/lib/checksum_32.S > @@ -48,6 +48,7 @@ unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum) > * Fortunately, it is easy to convert 2-byte alignment to 4-byte > * alignment for the unrolled loop. > */ > + .type csum_partial, @function > ENTRY(csum_partial) > + .type csum_partial, @function > ENTRY(csum_partial) > CFI_STARTPROC > pushl %esi > @@ -141,11 +142,13 @@ ENTRY(csum_partial) > ret > CFI_ENDPROC > ENDPROC(csum_partial) > + .size csum_partial, . - csum_partial > > AK: > Better option would be to just add to ENTRY/ENDPROC > > do something like (untested) > > #define ENTRY(x) \ > ... > .set curfunc, x > > #define ENDPROC(x) \ > ... > .size x - curfunc > John got more or less same comment from me - but I did not hear further. As it stands out now it not nice. Sam ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: STT_FUNC for assembler checksum and semaphore ops" in git-x86 2008-01-10 7:42 ` Sam Ravnborg @ 2008-01-10 16:37 ` John Reiser 2008-01-10 18:02 ` Andi Kleen 0 siblings, 1 reply; 7+ messages in thread From: John Reiser @ 2008-01-10 16:37 UTC (permalink / raw) To: Sam Ravnborg, Andi Kleen; +Cc: mingo, tglx, linux-kernel >>+ .type csum_partial, @function >> ENTRY(csum_partial) >>+ .type csum_partial, @function >> ENTRY(csum_partial) >> CFI_STARTPROC >> pushl %esi >>@@ -141,11 +142,13 @@ ENTRY(csum_partial) >> ret >> CFI_ENDPROC >> ENDPROC(csum_partial) >>+ .size csum_partial, . - csum_partial >>AK [Andi Kleen]: >>Better option would be to just add to ENTRY/ENDPROC ... > John got more or less same comment from me [Sam Ravnborg] - but > I did not hear further. > As it stands out now it not nice. It does look ugly. But .size and .type are oriented towards static description, while the dwarf2 CurrentFrameInfo (CFI) annotations are oriented towards dynamic traceback and unwinding. Forcing the coupling between static and dynamic annotation might lead to trouble when the fast path to 'ret' is in the middle, and code for the slow path appears after the 'ret'; or when a recursive tail 'falls through" into the entry point. A quick test shows that multiple .size pseudo-ops for the same symbol are accepted (the last one wins) so default coupling can be overridden. I'll test revised macros and report shortly. -- John Reiser, jreiser@BitWagon.com ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: STT_FUNC for assembler checksum and semaphore ops" in git-x86 2008-01-10 16:37 ` John Reiser @ 2008-01-10 18:02 ` Andi Kleen 2008-01-11 0:59 ` John Reiser 0 siblings, 1 reply; 7+ messages in thread From: Andi Kleen @ 2008-01-10 18:02 UTC (permalink / raw) To: John Reiser; +Cc: Sam Ravnborg, Andi Kleen, mingo, tglx, linux-kernel > It does look ugly. But .size and .type are oriented towards static > description, while the dwarf2 CurrentFrameInfo (CFI) annotations > are oriented towards dynamic traceback and unwinding. Forcing the ENTRY/ENDPROC have nothing to do with dwarf2. That is CFI_STARTPROC/ENDPROC. But actually checking the default implementation in linkage.h already implements size: #ifndef END #define END(name) \ .size name, .-name #endif #ifndef ENDPROC #define ENDPROC(name) \ .type name, @function; \ END(name) #endif Are you sure it doesn't work? Your patch should be not needed. If it's still wrong then just ENDPROCs() need to be added. -Andi ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: STT_FUNC for assembler checksum and semaphore ops" in git-x86 2008-01-10 18:02 ` Andi Kleen @ 2008-01-11 0:59 ` John Reiser 2008-01-11 2:57 ` Andi Kleen 0 siblings, 1 reply; 7+ messages in thread From: John Reiser @ 2008-01-11 0:59 UTC (permalink / raw) To: Andi Kleen, mingo, Jeff Dike; +Cc: Sam Ravnborg, tglx, linux-kernel Andi Kleen wrote: > But actually checking the default implementation in linkage.h already > implements size: [snip] > Are you sure it doesn't work? Your patch should be not needed. If it's > still wrong then just ENDPROCs() need to be added. The ENDPROCs() were not used everywhere. Some code used just END() instead, while other code used nothing. um/sys-i386/checksum.S didn't #include <linux/linkage.h> . I also got confused because gcc puts the .type near the ENTRY, while ENDPROC puts it on the opposite end. Here is a revised patch against linux-2.6-x86.git , including a comment in linkage.h which explains one motivation. PowerPC is different ("_GLOBAL" instead of "ENTRY") and foreign to me, so I left it alone. Signed off by: John Reiser <jreiser@BitWagon.com> diff --git a/include/linux/linkage.h b/include/linux/linkage.h index ff203dd..024cfab 100644 --- a/include/linux/linkage.h +++ b/include/linux/linkage.h @@ -53,6 +53,10 @@ .size name, .-name #endif +/* If symbol 'name' is treated as a subroutine (gets called, and returns) + * then please use ENDPROC to mark 'name' as STT_FUNC for the benefit of + * static analysis tools such as stack depth analyzer. + */ #ifndef ENDPROC #define ENDPROC(name) \ .type name, @function; \ diff --git a/arch/x86/lib/semaphore_32.S b/arch/x86/lib/semaphore_32.S index 444fba4..e2c6e0d 100644 --- a/arch/x86/lib/semaphore_32.S +++ b/arch/x86/lib/semaphore_32.S @@ -49,7 +49,7 @@ ENTRY(__down_failed) ENDFRAME ret CFI_ENDPROC - END(__down_failed) + ENDPROC(__down_failed) ENTRY(__down_failed_interruptible) CFI_STARTPROC @@ -70,7 +70,7 @@ ENTRY(__down_failed_interruptible) ENDFRAME ret CFI_ENDPROC - END(__down_failed_interruptible) + ENDPROC(__down_failed_interruptible) ENTRY(__down_failed_trylock) CFI_STARTPROC @@ -91,7 +91,7 @@ ENTRY(__down_failed_trylock) ENDFRAME ret CFI_ENDPROC - END(__down_failed_trylock) + ENDPROC(__down_failed_trylock) ENTRY(__up_wakeup) CFI_STARTPROC @@ -112,7 +112,7 @@ ENTRY(__up_wakeup) ENDFRAME ret CFI_ENDPROC - END(__up_wakeup) + ENDPROC(__up_wakeup) /* * rw spinlock fallbacks @@ -132,7 +132,7 @@ ENTRY(__write_lock_failed) ENDFRAME ret CFI_ENDPROC - END(__write_lock_failed) + ENDPROC(__write_lock_failed) ENTRY(__read_lock_failed) CFI_STARTPROC @@ -148,7 +148,7 @@ ENTRY(__read_lock_failed) ENDFRAME ret CFI_ENDPROC - END(__read_lock_failed) + ENDPROC(__read_lock_failed) #endif @@ -170,7 +170,7 @@ ENTRY(call_rwsem_down_read_failed) CFI_ADJUST_CFA_OFFSET -4 ret CFI_ENDPROC - END(call_rwsem_down_read_failed) + ENDPROC(call_rwsem_down_read_failed) ENTRY(call_rwsem_down_write_failed) CFI_STARTPROC @@ -182,7 +182,7 @@ ENTRY(call_rwsem_down_write_failed) CFI_ADJUST_CFA_OFFSET -4 ret CFI_ENDPROC - END(call_rwsem_down_write_failed) + ENDPROC(call_rwsem_down_write_failed) ENTRY(call_rwsem_wake) CFI_STARTPROC @@ -196,7 +196,7 @@ ENTRY(call_rwsem_wake) CFI_ADJUST_CFA_OFFSET -4 1: ret CFI_ENDPROC - END(call_rwsem_wake) + ENDPROC(call_rwsem_wake) /* Fix up special calling conventions */ ENTRY(call_rwsem_downgrade_wake) @@ -214,6 +214,6 @@ ENTRY(call_rwsem_downgrade_wake) CFI_ADJUST_CFA_OFFSET -4 ret CFI_ENDPROC - END(call_rwsem_downgrade_wake) + ENDPROC(call_rwsem_downgrade_wake) #endif diff --git a/arch/um/sys-i386/checksum.S b/arch/um/sys-i386/checksum.S index 62c7e56..4f3f62b 100644 --- a/arch/um/sys-i386/checksum.S +++ b/arch/um/sys-i386/checksum.S @@ -26,6 +26,7 @@ */ #include <asm/errno.h> +#include <linux/linkage.h> /* * computes a partial checksum, e.g. for TCP/UDP fragments @@ -48,7 +49,7 @@ unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum) * Fortunately, it is easy to convert 2-byte alignment to 4-byte * alignment for the unrolled loop. */ -csum_partial: +ENTRY(csum_partial) pushl %esi pushl %ebx movl 20(%esp),%eax # Function arg: unsigned int sum @@ -113,12 +114,13 @@ csum_partial: popl %ebx popl %esi ret + ENDPROC(csum_partial) #else /* Version for PentiumII/PPro */ -csum_partial: +ENTRY(csum_partial) pushl %esi pushl %ebx movl 20(%esp),%eax # Function arg: unsigned int sum @@ -211,6 +213,7 @@ csum_partial: popl %ebx popl %esi ret + ENDPROC(csum_partial) #endif @@ -250,7 +253,7 @@ unsigned int csum_partial_copy_generic (const char *src, char *dst, #define ARGBASE 16 #define FP 12 -csum_partial_copy_generic_i386: +ENTRY(csum_partial_copy_generic_i386) subl $4,%esp pushl %edi pushl %esi @@ -368,6 +371,7 @@ DST( movb %cl, (%edi) ) popl %edi popl %ecx # equivalent to addl $4,%esp ret + ENDPROC(csum_partial_copy_generic_i386) #else @@ -385,7 +389,7 @@ DST( movb %cl, (%edi) ) #define ARGBASE 12 -csum_partial_copy_generic_i386: +ENTRY(csum_partial_copy_generic_i386) pushl %ebx pushl %edi pushl %esi @@ -452,6 +456,7 @@ DST( movb %dl, (%edi) ) popl %edi popl %ebx ret + ENDPROC(csum_partial_copy_generic_i386) #undef ROUND #undef ROUND1 diff --git a/arch/m32r/lib/checksum.S b/arch/m32r/lib/checksum.S index 0af0360..2492222 100644 --- a/arch/m32r/lib/checksum.S +++ b/arch/m32r/lib/checksum.S @@ -153,6 +153,7 @@ ENTRY(csum_partial) addx r0, r2 || ldi r2, #0 addx r0, r2 jmp r14 + ENDPROC(csum_partial) #else /* not CONFIG_ISA_DUAL_ISSUE */ @@ -288,6 +289,7 @@ ENTRY(csum_partial) ldi r2, #0 addx r0, r2 jmp r14 + ENDPROC(csum_partial) #endif /* not CONFIG_ISA_DUAL_ISSUE */ @@ -316,5 +318,6 @@ ENTRY(csum_partial_copy_generic) nop nop nop + ENDPROC(csum_partial_copy_generic) .end diff --git a/arch/m68k/lib/semaphore.S b/arch/m68k/lib/semaphore.S index 0215624..f28889c 100644 --- a/arch/m68k/lib/semaphore.S +++ b/arch/m68k/lib/semaphore.S @@ -22,6 +22,7 @@ ENTRY(__down_failed) movel (%sp)+,%a1 moveml (%sp)+,%a0/%d0/%d1 rts + ENDPROC(__down_failed) ENTRY(__down_failed_interruptible) movel %a0,-(%sp) @@ -32,6 +33,7 @@ ENTRY(__down_failed_interruptible) movel (%sp)+,%d1 movel (%sp)+,%a0 rts + ENDPROC(__down_failed_interruptible) ENTRY(__down_failed_trylock) movel %a0,-(%sp) @@ -42,6 +44,7 @@ ENTRY(__down_failed_trylock) movel (%sp)+,%d1 movel (%sp)+,%a0 rts + ENDPROC(__down_failed_trylock) ENTRY(__up_wakeup) moveml %a0/%d0/%d1,-(%sp) @@ -50,4 +53,5 @@ ENTRY(__up_wakeup) movel (%sp)+,%a1 moveml (%sp)+,%a0/%d0/%d1 rts + ENDPROC(__up_wakeup) diff --git a/arch/m68knommu/lib/semaphore.S b/arch/m68knommu/lib/semaphore.S index 87c7460..e4bcb07 100644 --- a/arch/m68knommu/lib/semaphore.S +++ b/arch/m68knommu/lib/semaphore.S @@ -30,6 +30,7 @@ ENTRY(__down_failed) movel (%sp)+,%d0 movel (%sp)+,%d1 rts + ENDPROC(__down_failed) ENTRY(__down_failed_interruptible) movel %a0,-(%sp) @@ -39,6 +40,7 @@ ENTRY(__down_failed_interruptible) movel (%sp)+,%a1 movel (%sp)+,%d1 rts + ENDPROC(__down_failed_interruptible) ENTRY(__up_wakeup) #ifdef CONFIG_COLDFIRE @@ -53,6 +55,7 @@ ENTRY(__up_wakeup) movel (%sp)+,%d0 movel (%sp)+,%d1 rts + ENDPROC(__up_wakeup) ENTRY(__down_failed_trylock) movel %a0,-(%sp) @@ -63,4 +66,5 @@ ENTRY(__down_failed_trylock) movel (%sp)+,%d1 movel (%sp)+,%a0 rts + ENDPROC(__down_failed_trylock) diff --git a/arch/sh/lib/checksum.S b/arch/sh/lib/checksum.S index cbdd0d4..c7a41de 100644 --- a/arch/sh/lib/checksum.S +++ b/arch/sh/lib/checksum.S @@ -143,6 +143,7 @@ ENTRY(csum_partial) 9: rts mov r6, r0 + ENDPROC(csum_partial) /* unsigned int csum_partial_copy_generic (const char *src, char *dst, int len, @@ -384,3 +385,4 @@ DST( mov.b r0,@r5 ) add #8,r15 rts mov r7,r0 + ENDPROC(csum_partial_copy_generic) diff --git a/arch/xtensa/lib/checksum.S b/arch/xtensa/lib/checksum.S index 9d9cd99..9d12ade 100644 --- a/arch/xtensa/lib/checksum.S +++ b/arch/xtensa/lib/checksum.S @@ -169,6 +169,7 @@ ENTRY(csum_partial) addi a2, a2, 2 3: j 5b /* branch to handle the remaining byte */ + ENDPROC(csum_partial) @@ -406,4 +407,5 @@ DST( s8i a8, a3, 1 ) retw .previous + ENDPROC(csum_partial_copy_generic) -- John Reiser, jreiser@BitWagon.com ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: STT_FUNC for assembler checksum and semaphore ops" in git-x86 2008-01-11 0:59 ` John Reiser @ 2008-01-11 2:57 ` Andi Kleen 2008-01-11 4:18 ` John Reiser 0 siblings, 1 reply; 7+ messages in thread From: Andi Kleen @ 2008-01-11 2:57 UTC (permalink / raw) To: John Reiser Cc: Andi Kleen, mingo, Jeff Dike, Sam Ravnborg, tglx, linux-kernel On Thu, Jan 10, 2008 at 04:59:52PM -0800, John Reiser wrote: > Andi Kleen wrote: > > But actually checking the default implementation in linkage.h already > > implements size: [snip] > > > Are you sure it doesn't work? Your patch should be not needed. If it's > > still wrong then just ENDPROCs() need to be added. > > The ENDPROCs() were not used everywhere. Some code used just END() instead, > while other code used nothing. um/sys-i386/checksum.S didn't #include END() is fine too since it contains .size too: #ifndef END #define END(name) \ .size name, .-name #endif > diff --git a/arch/x86/lib/semaphore_32.S b/arch/x86/lib/semaphore_32.S > index 444fba4..e2c6e0d 100644 > --- a/arch/x86/lib/semaphore_32.S > +++ b/arch/x86/lib/semaphore_32.S > @@ -49,7 +49,7 @@ ENTRY(__down_failed) > ENDFRAME > ret > CFI_ENDPROC > - END(__down_failed) > + ENDPROC(__down_failed) I don't think these change makes sense given the definition of END() shown above. The only change that would make sense is adding END() (or ENDPROC()) to a function that doesn't have either of them yet. Since you seem to do nop changes something is wrong with your testing procedure? -Andi ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: STT_FUNC for assembler checksum and semaphore ops" in git-x86 2008-01-11 2:57 ` Andi Kleen @ 2008-01-11 4:18 ` John Reiser 0 siblings, 0 replies; 7+ messages in thread From: John Reiser @ 2008-01-11 4:18 UTC (permalink / raw) To: Andi Kleen; +Cc: mingo, Jeff Dike, Sam Ravnborg, tglx, linux-kernel Andi Kleen wrote: > On Thu, Jan 10, 2008 at 04:59:52PM -0800, John Reiser wrote: > >>Andi Kleen wrote: >> >>>But actually checking the default implementation in linkage.h already >>>implements size: [snip] >> >>>Are you sure it doesn't work? Your patch should be not needed. If it's >>>still wrong then just ENDPROCs() need to be added. >> >>The ENDPROCs() were not used everywhere. Some code used just END() instead, >>while other code used nothing. um/sys-i386/checksum.S didn't #include > > > END() is fine too since it contains .size too: > > #ifndef END > #define END(name) \ > .size name, .-name > #endif > > >>diff --git a/arch/x86/lib/semaphore_32.S b/arch/x86/lib/semaphore_32.S >>index 444fba4..e2c6e0d 100644 >>--- a/arch/x86/lib/semaphore_32.S >>+++ b/arch/x86/lib/semaphore_32.S >>@@ -49,7 +49,7 @@ ENTRY(__down_failed) >> ENDFRAME >> ret >> CFI_ENDPROC >>- END(__down_failed) >>+ ENDPROC(__down_failed) > > > I don't think these change makes sense given the definition of END() > shown above. > > The only change that would make sense is adding END() (or ENDPROC()) > to a function that doesn't have either of them yet. No. The pseudo op ".type name, @function" appears only in ENDPROC; it does not appear in END. So changing END to ENDPROC *does* alter the Elf32_Sym for 'name'. Just END produces STT_NOTYPE; ENDPROC produces STT_FUNC. A static analysis tool can get the info it wants much more easily if all subroutines are marked as STT_FUNC. In theory the tool could sort the symbols, notice the disjoint coverage of the address space by the .size intervals of consecutive symbols that are the targets of a CALL instruction, and thus deduce that ".type foo, @function" *should* have been specified. But this is a heuristic, and it fails on boundaries where assembly code is invoked via trap, interrupt, or exception (anything other than CALL). Instead, specify STT_FUNC for each subroutine in the first place. That requires .type, which means ENDPROC (not END) from linux/linkage.h. -- John Reiser, jreiser@BitWagon.com ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2008-01-11 4:18 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2008-01-09 21:57 STT_FUNC for assembler checksum and semaphore ops" in git-x86 Andi Kleen 2008-01-10 7:42 ` Sam Ravnborg 2008-01-10 16:37 ` John Reiser 2008-01-10 18:02 ` Andi Kleen 2008-01-11 0:59 ` John Reiser 2008-01-11 2:57 ` Andi Kleen 2008-01-11 4:18 ` John Reiser
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).