2008-01-07 17:25:39

by John Reiser

[permalink] [raw]
Subject: STT_FUNC for assembler checksum and semaphore ops

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, [email protected]


2008-01-07 19:23:20

by Sam Ravnborg

[permalink] [raw]
Subject: Re: STT_FUNC for assembler checksum and semaphore ops

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

2008-01-08 09:37:01

by Ingo Molnar

[permalink] [raw]
Subject: Re: STT_FUNC for assembler checksum and semaphore ops


* John Reiser <[email protected]> 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