public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* STT_FUNC for assembler checksum and semaphore ops
@ 2008-01-07 17:23 John Reiser
  2008-01-07 19:22 ` Sam Ravnborg
  2008-01-08  9:35 ` Ingo Molnar
  0 siblings, 2 replies; 3+ messages in thread
From: John Reiser @ 2008-01-07 17:23 UTC (permalink / raw)
  To: Paul Mackerras, Hirokazu Takata, David S. Miller,
	Geert Uytterhoeven, Roman Zippel, Greg Ungerer, Mikael Starvik,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin
  Cc: linux-kernel

Dear $ARCH Maintainers,

This patch adds Elf32_Sym .st_info (STT_FUNC) and .st_size for hand-coded
checksum and semaphore subroutines.  I needed this info when writing a
static analyzer for stack depth [grovel over ./vmlinux] on the um
(UserModeLinux) $ARCH for i386.  The changes work on i386.  Other $ARCH
are analogous but not tested.  Other arch/x86/lib/*.S are not used by um
currently.  [Should analogous changes be made anyway?]

Comments?

--- ./arch/um/sys-i386/checksum.S.orig	2007-11-02 07:03:46.000000000 -0700
+++ ./arch/um/sys-i386/checksum.S	2008-01-07 08:45:39.000000000 -0800
@@ -38,6 +38,7 @@
 .text
 .align 4
 .globl csum_partial
+.type csum_partial, @function
 		
 #ifndef CONFIG_X86_USE_PPRO_CHECKSUM

@@ -213,6 +214,7 @@
 	ret
 				
 #endif
+.size csum_partial, . - csum_partial

 /*
 unsigned int csum_partial_copy_generic (const char *src, char *dst,
@@ -244,6 +246,7 @@

 .align 4
 .globl csum_partial_copy_generic_i386
+.type csum_partial_copy_generic_i386, @function
 				
 #ifndef CONFIG_X86_USE_PPRO_CHECKSUM

@@ -457,3 +460,4 @@
 #undef ROUND1		
 		
 #endif
+.size csum_partial_copy_generic_i386, . - csum_partial_copy_generic_i386
--- ./arch/ppc/lib/checksum.S.orig	2007-11-02 07:03:46.000000000 -0700
+++ ./arch/ppc/lib/checksum.S	2008-01-07 08:45:39.000000000 -0800
@@ -23,6 +23,7 @@
  * ip_fast_csum(buf, len) -- Optimized for IP header
  * len is in words and is always >= 5.
  */
+.type ip_fast_csum, @function
 _GLOBAL(ip_fast_csum)
 	lwz	r0,0(r3)
 	lwzu	r5,4(r3)
@@ -39,11 +40,13 @@
 	not	r3,r3
 	srwi	r3,r3,16
 	blr
+.size ip_fast_csum, . - ip_fast_csum

 /*
  * Compute checksum of TCP or UDP pseudo-header:
  *   csum_tcpudp_magic(saddr, daddr, len, proto, sum)
  */	
+.type csum_tcpudp_magic, @function
 _GLOBAL(csum_tcpudp_magic)
 	rlwimi	r5,r6,16,0,15	/* put proto in upper half of len */
 	addc	r0,r3,r4	/* add 4 32-bit words together */
@@ -55,6 +58,7 @@
 	not	r3,r3
 	srwi	r3,r3,16
 	blr
+.size csum_tcpudp_magic, . - csum_tcpudp_magic

 /*
  * computes the checksum of a memory block at buff, length len,
@@ -62,6 +66,7 @@
  *
  * csum_partial(buff, len, sum)
  */
+.type csum_partial, @function
 _GLOBAL(csum_partial)
 	addic	r0,r5,0
 	subi	r3,r3,4
@@ -93,6 +98,7 @@
 	adde	r0,r0,r5
 5:	addze	r3,r0		/* add in final carry */
 	blr
+.size csum_partial, . - csum_partial

 /*
  * Computes the checksum of a memory block at src, length len,
@@ -103,6 +109,7 @@
  *
  * csum_partial_copy_generic(src, dst, len, sum, src_err, dst_err)
  */
+.type csum_partial_copy_generic, @function
 _GLOBAL(csum_partial_copy_generic)
 	addic	r0,r6,0
 	subi	r3,r3,4
@@ -202,6 +209,7 @@
 	stw	r6,0(r8)
 1:	addze	r3,r0
 	blr
+.size csum_partial_copy_generic, . - csum_partial_copy_generic

 .section __ex_table,"a"
 	.long	81b,src_error_1
--- ./arch/m32r/lib/checksum.S.orig	2007-11-02 07:03:46.000000000 -0700
+++ ./arch/m32r/lib/checksum.S	2008-01-07 08:45:39.000000000 -0800
@@ -50,6 +50,7 @@
 	 */

 	.text
+	.type csum_partial, @function
 ENTRY(csum_partial)
 	; Function args
 	;  r0: unsigned char *buff
@@ -153,6 +154,7 @@
 	addx	r0, r2		    ||	ldi	r2, #0
 	addx	r0, r2
 	jmp	r14
+	.size csum_partial, . - csum_partial

 #else /* not CONFIG_ISA_DUAL_ISSUE */

@@ -165,6 +167,7 @@
 	 */

 	.text
+	.type csum_partial, @function
 ENTRY(csum_partial)
 	; Function args
 	;  r0: unsigned char *buff
@@ -288,6 +291,7 @@
 	ldi	r2, #0
 	addx	r0, r2
 	jmp	r14
+	.size csum_partial, . - csum_partial

 #endif /* not CONFIG_ISA_DUAL_ISSUE */

@@ -307,6 +311,7 @@
  *	  them all but there's no guarantee.
  */

+	.type csum_partial_copy_generic, @function
 ENTRY(csum_partial_copy_generic)
 	nop
 	nop
@@ -316,5 +321,6 @@
 	nop
 	nop
 	nop
+	.size csum_partial_copy_generic, . - csum_partial_copy_generic

 	.end
--- ./arch/sparc/lib/checksum.S.orig	2007-11-02 07:03:46.000000000 -0700
+++ ./arch/sparc/lib/checksum.S	2008-01-07 08:45:39.000000000 -0800
@@ -104,6 +104,7 @@
 	 * buffer of size 0x20.  Follow the code path for that case.
 	 */
 	.globl	csum_partial
+	.type csum_partial, @function
 csum_partial:			/* %o0=buf, %o1=len, %o2=sum */
 	andcc	%o0, 0x7, %g0				! alignment problems?
 	bne	csum_partial_fix_alignment		! yep, handle it
@@ -140,8 +141,10 @@
 	 andcc	%o1, 8, %g0				! check how much
 cpout:	retl						! get outta here
 	 mov	%o2, %o0				! return computed csum
+	.size csum_partial, . - csum_partial

 	.globl __csum_partial_copy_start, __csum_partial_copy_end
+	.type __csum_partial_copy_start, @function
 __csum_partial_copy_start:

 /* Work around cpp -rob */
@@ -322,6 +325,7 @@
 	addx	%g0, %g7, %g7
 	b	3f
 	 andcc	%g1, 0xffffff80, %g0
+	.size __csum_partial_copy_start, . - __csum_partial_copy_start

 	/* Sun, you just can't beat me, you just can't.  Stop trying,
 	 * give up.  I'm serious, I am going to kick the living shit
@@ -329,6 +333,7 @@
 	 */
 	.align	8
 	.globl	__csum_partial_copy_sparc_generic
+	.type __csum_partial_copy_sparc_generic, @function
 __csum_partial_copy_sparc_generic:
 					/* %o0=src, %o1=dest, %g1=len, %g7=sum */
 	xor	%o0, %o1, %o4		! get changing bits
@@ -576,6 +581,7 @@
 	st	%i5, [%o2]
 	ret
 	 restore
+	.size __csum_partial_copy_sparc_generic, . - __csum_partial_copy_sparc_generic

         .section __ex_table,#alloc
         .align 4
--- ./arch/sh/lib/checksum.S.orig	2007-11-02 07:03:46.000000000 -0700
+++ ./arch/sh/lib/checksum.S	2008-01-07 08:45:39.000000000 -0800
@@ -41,6 +41,7 @@
  */

 .text
+.type csum_partial, @function
 ENTRY(csum_partial)
 	  /*
 	   * Experiments with Ethernet and SLIP connections show that buff
@@ -143,6 +144,7 @@
 9:
 	rts
 	 mov	r6, r0
+	.size csum_partial, . - csum_partial

 /*
 unsigned int csum_partial_copy_generic (const char *src, char *dst, int len,
@@ -182,6 +184,7 @@
 ! int *SRC_ERR_PTR
 ! int *DST_ERR_PTR
 !
+	.type csum_partial_copy_generic, @function
 ENTRY(csum_partial_copy_generic)
 	mov.l	r5,@-r15
 	mov.l	r6,@-r15
@@ -384,3 +387,4 @@
 	add	#8,r15
 	rts
 	 mov	r7,r0
+	.size csum_partial_copy_generic, . - csum_partial_copy_generic
--- ./arch/m68k/lib/semaphore.S.orig	2007-11-02 07:03:46.000000000 -0700
+++ ./arch/m68k/lib/semaphore.S	2008-01-07 08:45:39.000000000 -0800
@@ -15,6 +15,7 @@
  * need to convert that sequence back into the C sequence when
  * there is contention on the semaphore.
  */
+	.type __down_failed, @function
 ENTRY(__down_failed)
 	moveml %a0/%d0/%d1,-(%sp)
 	movel %a1,-(%sp)
@@ -22,7 +23,9 @@
 	movel (%sp)+,%a1
 	moveml (%sp)+,%a0/%d0/%d1
 	rts
+	.size __down_failed, . - __down_failed

+	.type __down_failed_interruptible, @function
 ENTRY(__down_failed_interruptible)
 	movel %a0,-(%sp)
 	movel %d1,-(%sp)
@@ -32,7 +35,9 @@
 	movel (%sp)+,%d1
 	movel (%sp)+,%a0
 	rts
+	.size __down_failed_interruptible, . - __down_failed_interruptible

+	.type __down_failed_trylock, @function
 ENTRY(__down_failed_trylock)
 	movel %a0,-(%sp)
 	movel %d1,-(%sp)
@@ -42,7 +47,9 @@
 	movel (%sp)+,%d1
 	movel (%sp)+,%a0
 	rts
+	.size __down_failed_trylock, . - __down_failed_trylock

+	.type __up_wakeup, @function
 ENTRY(__up_wakeup)
 	moveml %a0/%d0/%d1,-(%sp)
 	movel %a1,-(%sp)
@@ -50,4 +57,5 @@
 	movel (%sp)+,%a1
 	moveml (%sp)+,%a0/%d0/%d1
 	rts
+	.size __up_wakeup, . - __up_wakeup

--- ./arch/m68knommu/lib/semaphore.S.orig	2007-11-02 07:03:46.000000000 -0700
+++ ./arch/m68knommu/lib/semaphore.S	2008-01-07 08:45:39.000000000 -0800
@@ -17,6 +17,7 @@
  * to increment the number of waiters on the semaphore,
  * call "__down()", and then eventually return to try again.
  */
+	.type __down_failed, @function
 ENTRY(__down_failed)
 #ifdef CONFIG_COLDFIRE
 	subl #12,%sp
@@ -39,7 +40,9 @@
 	movel (%sp)+,%a1
 	movel (%sp)+,%d1
 	rts
+	.size __down_failed, . - __down_failed

+	.type __up_wakeup, @function
 ENTRY(__up_wakeup)
 #ifdef CONFIG_COLDFIRE
 	subl #12,%sp
@@ -63,4 +66,5 @@
 	movel (%sp)+,%d1
 	movel (%sp)+,%a0
 	rts
+	.size __up_wakeup, . - __up_wakeup

--- ./arch/xtensa/lib/checksum.S.orig	2007-11-02 07:03:47.000000000 -0700
+++ ./arch/xtensa/lib/checksum.S	2008-01-07 08:45:39.000000000 -0800
@@ -40,6 +40,7 @@
 99:				;

 .text
+.type csum_partial, @function
 ENTRY(csum_partial)
 	  /*
 	   * Experiments with Ethernet and SLIP connections show that buf
@@ -169,6 +170,7 @@
 	addi	a2, a2, 2
 3:
 	j	5b		/* branch to handle the remaining byte */
+	.size csum_partial, . - csum_partial



@@ -210,6 +212,7 @@
     alignments work, but not nearly as efficiently.
  */

+	.type csum_partial_copy_generic, @function
 ENTRY(csum_partial_copy_generic)
 	entry	sp, 32
 	mov	a12, a3
@@ -406,4 +409,5 @@
 	retw

 .previous
+	.size csum_partial_copy_generic, . - csum_partial_copy_generic

--- ./arch/x86/lib/semaphore_32.S.orig	2007-11-02 07:03:46.000000000 -0700
+++ ./arch/x86/lib/semaphore_32.S	2008-01-07 08:45:39.000000000 -0800
@@ -30,6 +30,7 @@
  * value or just clobbered..
  */
 	.section .sched.text
+	.type __down_failed, @function
 ENTRY(__down_failed)
 	CFI_STARTPROC
 	FRAME
@@ -50,7 +51,9 @@
 	ret
 	CFI_ENDPROC
 	END(__down_failed)
+	.size __down_failed, . - __down_failed

+	.type __down_failed_interruptible, @function
 ENTRY(__down_failed_interruptible)
 	CFI_STARTPROC
 	FRAME
@@ -71,7 +74,9 @@
 	ret
 	CFI_ENDPROC
 	END(__down_failed_interruptible)
+	.size __down_failed_interruptible, . - __down_failed_interruptible

+	.type __down_failed_trylock, @function
 ENTRY(__down_failed_trylock)
 	CFI_STARTPROC
 	FRAME
@@ -92,7 +97,9 @@
 	ret
 	CFI_ENDPROC
 	END(__down_failed_trylock)
+	.size __down_failed_trylock, . - __down_failed_trylock

+	.type __up_wakeup, @function
 ENTRY(__up_wakeup)
 	CFI_STARTPROC
 	FRAME
@@ -113,11 +120,13 @@
 	ret
 	CFI_ENDPROC
 	END(__up_wakeup)
+	.size __up_wakeup, . - __up_wakeup

 /*
  * rw spinlock fallbacks
  */
 #ifdef CONFIG_SMP
+	.type __write_lock_failed, @function
 ENTRY(__write_lock_failed)
 	CFI_STARTPROC simple
 	FRAME
@@ -133,7 +142,9 @@
 	ret
 	CFI_ENDPROC
 	END(__write_lock_failed)
+	.size __write_lock_failed, . - __write_lock_failed

+	.type __read_lock_failed, @function
 ENTRY(__read_lock_failed)
 	CFI_STARTPROC
 	FRAME
@@ -149,12 +160,14 @@
 	ret
 	CFI_ENDPROC
 	END(__read_lock_failed)
+	.size __read_lock_failed, . - __read_lock_failed

 #endif

 #ifdef CONFIG_RWSEM_XCHGADD_ALGORITHM

 /* Fix up special calling conventions */
+	.type call_rwsem_down_read_failed, @function
 ENTRY(call_rwsem_down_read_failed)
 	CFI_STARTPROC
 	push %ecx
@@ -171,7 +184,9 @@
 	ret
 	CFI_ENDPROC
 	END(call_rwsem_down_read_failed)
+	.size call_rwsem_down_read_failed, . - call_rwsem_down_read_failed

+	.type call_rwsem_down_write_failed, @function
 ENTRY(call_rwsem_down_write_failed)
 	CFI_STARTPROC
 	push %ecx
@@ -183,7 +198,9 @@
 	ret
 	CFI_ENDPROC
 	END(call_rwsem_down_write_failed)
+	.size call_rwsem_down_write_failed, . - call_rwsem_down_write_failed

+	.type call_rwsem_wake, @function
 ENTRY(call_rwsem_wake)
 	CFI_STARTPROC
 	decw %dx    /* do nothing if still outstanding active readers */
@@ -197,8 +214,10 @@
 1:	ret
 	CFI_ENDPROC
 	END(call_rwsem_wake)
+	.size call_rwsem_wake, . - call_rwsem_wake

 /* Fix up special calling conventions */
+	.type call_rwsem_downgrade_wake, @function
 ENTRY(call_rwsem_downgrade_wake)
 	CFI_STARTPROC
 	push %ecx
@@ -215,5 +234,6 @@
 	ret
 	CFI_ENDPROC
 	END(call_rwsem_downgrade_wake)
+	.size call_rwsem_downgrade_wake, . - call_rwsem_downgrade_wake

 #endif
--- ./arch/x86/lib/checksum_32.S.orig	2007-11-02 07:03:46.000000000 -0700
+++ ./arch/x86/lib/checksum_32.S	2008-01-07 08:45:39.000000000 -0800
@@ -48,6 +48,7 @@
 	   * Fortunately, it is easy to convert 2-byte alignment to 4-byte
 	   * alignment for the unrolled loop.
 	   */		
+	.type csum_partial, @function
 ENTRY(csum_partial)
 	CFI_STARTPROC
 	pushl %esi
@@ -141,11 +142,13 @@
 	ret
 	CFI_ENDPROC
 ENDPROC(csum_partial)
+	.size csum_partial, . - csum_partial

 #else

 /* Version for PentiumII/PPro */

+	.type csum_partial, @function
 ENTRY(csum_partial)
 	CFI_STARTPROC
 	pushl %esi
@@ -269,6 +272,7 @@
 	ret
 	CFI_ENDPROC
 ENDPROC(csum_partial)
+	.size csum_partial, . - csum_partial
 				
 #endif

@@ -305,6 +309,7 @@
 #define ARGBASE 16		
 #define FP		12
 		
+	.type csum_partial_copy_generic, @function
 ENTRY(csum_partial_copy_generic)
 	CFI_STARTPROC
 	subl  $4,%esp	
@@ -440,6 +445,7 @@
 	ret	
 	CFI_ENDPROC
 ENDPROC(csum_partial_copy_generic)
+	.size csum_partial_copy_generic, . - csum_partial_copy_generic

 #else

@@ -457,6 +463,7 @@

 #define ARGBASE 12
 		
+	.type csum_partial_copy_generic, @function
 ENTRY(csum_partial_copy_generic)
 	CFI_STARTPROC
 	pushl %ebx
@@ -539,6 +546,7 @@
 	ret
 	CFI_ENDPROC
 ENDPROC(csum_partial_copy_generic)
+	.size csum_partial_copy_generic, . - csum_partial_copy_generic
 				
 #undef ROUND
 #undef ROUND1		
--- ./arch/cris/arch-v10/lib/checksum.S.orig	2007-11-02 07:03:45.000000000 -0700
+++ ./arch/cris/arch-v10/lib/checksum.S	2008-01-07 08:45:39.000000000 -0800
@@ -6,6 +6,7 @@
  */

 	.globl	csum_partial
+	.type csum_partial, @function
 csum_partial:
 	
 	;; r10 - src
@@ -121,4 +122,4 @@
 	addu.b	[$r10],$r12
 	ret
 	move.d	$r12, $r10
-		
+	.size csum_partial, . - csum_partial
--- ./arch/cris/arch-v32/lib/checksum.S.orig	2007-11-02 07:03:45.000000000 -0700
+++ ./arch/cris/arch-v32/lib/checksum.S	2008-01-07 08:45:39.000000000 -0800
@@ -6,6 +6,7 @@
  */

 	.globl	csum_partial
+	.type csum_partial, @function
 csum_partial:

 	;; r10 - src
@@ -109,3 +110,4 @@
 	addu.b	[$r10],$r12
 	ret
 	move.d	$r12,$r10
+	.size csum_partial, . - csum_partial

-- 
John Reiser, jreiser@BitWagon.com


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: STT_FUNC for assembler checksum and semaphore ops
  2008-01-07 17:23 STT_FUNC for assembler checksum and semaphore ops John Reiser
@ 2008-01-07 19:22 ` Sam Ravnborg
  2008-01-08  9:35 ` Ingo Molnar
  1 sibling, 0 replies; 3+ messages in thread
From: Sam Ravnborg @ 2008-01-07 19:22 UTC (permalink / raw)
  To: John Reiser
  Cc: Paul Mackerras, Hirokazu Takata, David S. Miller,
	Geert Uytterhoeven, Roman Zippel, Greg Ungerer, Mikael Starvik,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, linux-kernel

On Mon, Jan 07, 2008 at 09:23:37AM -0800, John Reiser wrote:
> Dear $ARCH Maintainers,
> 
> This patch adds Elf32_Sym .st_info (STT_FUNC) and .st_size for hand-coded
> checksum and semaphore subroutines.  I needed this info when writing a
> static analyzer for stack depth [grovel over ./vmlinux] on the um
> (UserModeLinux) $ARCH for i386.  The changes work on i386.  Other $ARCH
> are analogous but not tested.  Other arch/x86/lib/*.S are not used by um
> currently.  [Should analogous changes be made anyway?]
> 
> Comments?

I do not know the assembly stuff in question,
but the code you add would be nicer if packed in a macro.
You may even use _GLOBAL and/or ENTRY for your purpose.

	Sam

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: STT_FUNC for assembler checksum and semaphore ops
  2008-01-07 17:23 STT_FUNC for assembler checksum and semaphore ops John Reiser
  2008-01-07 19:22 ` Sam Ravnborg
@ 2008-01-08  9:35 ` Ingo Molnar
  1 sibling, 0 replies; 3+ messages in thread
From: Ingo Molnar @ 2008-01-08  9:35 UTC (permalink / raw)
  To: John Reiser
  Cc: Paul Mackerras, Hirokazu Takata, David S. Miller,
	Geert Uytterhoeven, Roman Zippel, Greg Ungerer, Mikael Starvik,
	Thomas Gleixner, Ingo Molnar, H. Peter Anvin, linux-kernel


* John Reiser <jreiser@BitWagon.com> wrote:

> Dear $ARCH Maintainers,
> 
> This patch adds Elf32_Sym .st_info (STT_FUNC) and .st_size for 
> hand-coded checksum and semaphore subroutines.  I needed this info 
> when writing a static analyzer for stack depth [grovel over ./vmlinux] 
> on the um (UserModeLinux) $ARCH for i386.  The changes work on i386.  
> Other $ARCH are analogous but not tested.  Other arch/x86/lib/*.S are 
> not used by um currently.  [Should analogous changes be made anyway?]
> 
> Comments?

thanks, i have picked up the x86 bits.

Will pick up later cleanup versions as well if there's some better macro 
approach to do this as an ENTRY thing, as we could consolidate both the 
start and the end into a single macro:

        .type __down_failed_trylock, @function
ENTRY(__down_failed_trylock)
        CFI_STARTPROC

        CFI_ENDPROC
        END(__down_failed_trylock)
        .size __down_failed_trylock, . - __down_failed_trylock

perhaps START_FUNCTION() and END_FUNCTION() macros?

	Ingo

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2008-01-08  9:37 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-07 17:23 STT_FUNC for assembler checksum and semaphore ops John Reiser
2008-01-07 19:22 ` Sam Ravnborg
2008-01-08  9:35 ` Ingo Molnar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox