diff options
author | 2011-04-26 02:15:45 -0700 | |
---|---|---|
committer | 2011-04-26 02:15:45 -0700 | |
commit | c2ea737a926b3e6070a739ba42c810f5b3d21ca7 (patch) | |
tree | bd4b058a04da716043435a64755a0b2d684d6c61 /07341_all_mysql-5.1.56_hardened_x86_strings.patch | |
parent | Respin the hardened strings patch to include the CCASFLAGS fix from bug #347796. (diff) | |
download | mysql-extras-c2ea737a926b3e6070a739ba42c810f5b3d21ca7.tar.gz mysql-extras-c2ea737a926b3e6070a739ba42c810f5b3d21ca7.tar.bz2 mysql-extras-c2ea737a926b3e6070a739ba42c810f5b3d21ca7.zip |
Fix typos in patch naming
Diffstat (limited to '07341_all_mysql-5.1.56_hardened_x86_strings.patch')
-rw-r--r-- | 07341_all_mysql-5.1.56_hardened_x86_strings.patch | 955 |
1 files changed, 955 insertions, 0 deletions
diff --git a/07341_all_mysql-5.1.56_hardened_x86_strings.patch b/07341_all_mysql-5.1.56_hardened_x86_strings.patch new file mode 100644 index 0000000..1e25fd6 --- /dev/null +++ b/07341_all_mysql-5.1.56_hardened_x86_strings.patch @@ -0,0 +1,955 @@ +2010-11-10 Magnus Granberg <zorry@gento.org>, Francisco Blas Izquierdo Riera <franxisco1988@mixmail.com> + + #344031 + * configure.in: Rename strings-x86.s to strings-x86.S + * strings/Makefile.am Likewise. + * strings/Makefile.in Likewise. + * strings/strings-x86.S Copy of strings-x86.s to support -fPIC + +Signed-off-by: Robin H. Johnson <robbat2@gentoo.org> + +-- + configure.in | 4 + strings/Makefile.am | 4 + strings/Makefile.in | 6 + strings/strings-x86.S | 442 ++++++++++++++++++++++++++++++++++++++++++++++++++ + strings/strings-x86.s | 416 ----------------------------------------------- + 5 files changed, 449 insertions(+), 423 deletions(-) +diff -Nuar --exclude '*.orig' mysql.orig//configure.in mysql//configure.in +--- mysql.orig//configure.in 2011-02-11 19:20:19.000000000 +0000 ++++ mysql//configure.in 2011-04-17 22:36:09.579371779 +0000 +@@ -526,7 +526,7 @@ + + # We need an assembler, too + AM_PROG_AS +-CCASFLAGS="$CCASFLAGS $ASFLAGS" ++CCASFLAGS="$CCASFLAGS $(for flag in $ASFLAGS ; do echo "-Wa,$flag" ; done)" + + # Check if we need noexec stack for assembler + AC_CHECK_NOEXECSTACK +@@ -680,7 +680,7 @@ + + AC_MSG_CHECKING(if we should use assembler functions) + # For now we only support assembler on i386 and sparc systems +-AM_CONDITIONAL(ASSEMBLER_x86, test "$ENABLE_ASSEMBLER" = "yes" -a "$BASE_MACHINE_TYPE" = "i386" && $AS strings/strings-x86.s -o checkassembler >/dev/null 2>&1 && test -f checkassembler && (rm -f checkassembler; exit 0;)) ++AM_CONDITIONAL(ASSEMBLER_x86, test "$ENABLE_ASSEMBLER" = "yes" -a "$BASE_MACHINE_TYPE" = "i386" && $AS strings/strings-x86.S -o checkassembler >/dev/null 2>&1 && test -f checkassembler && (rm -f checkassembler; exit 0;)) + AM_CONDITIONAL(ASSEMBLER_sparc32, test "$ENABLE_ASSEMBLER" = "yes" -a "$BASE_MACHINE_TYPE" = "sparc") + AM_CONDITIONAL(ASSEMBLER_sparc64, test "$ENABLE_ASSEMBLER" = "yes" -a "$BASE_MACHINE_TYPE" = "sparcv9") + AM_CONDITIONAL(ASSEMBLER, test "$ASSEMBLER_x86_TRUE" = "" -o "$ASSEMBLER_sparc32_TRUE" = "") +diff -Nuar --exclude '*.orig' mysql.orig//strings/Makefile.am mysql//strings/Makefile.am +--- mysql.orig//strings/Makefile.am 2011-02-11 19:20:35.000000000 +0000 ++++ mysql//strings/Makefile.am 2011-04-17 22:35:39.803194869 +0000 +@@ -20,7 +20,7 @@ + + # Exact one of ASSEMBLER_X + if ASSEMBLER_x86 +-ASRCS = strings-x86.s longlong2str-x86.s my_strtoll10-x86.s ++ASRCS = strings-x86.S longlong2str-x86.s my_strtoll10-x86.s + CSRCS = bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c strtod.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-cp932.c ctype-czech.c ctype-eucjpms.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c ctype-ucs2.c ctype-uca.c ctype-win1250ch.c ctype-bin.c ctype-latin1.c my_vsnprintf.c xml.c decimal.c ctype-extra.c str_alloc.c longlong2str_asm.c my_strchr.c strmov.c + else + if ASSEMBLER_sparc32 +@@ -44,7 +44,7 @@ + EXTRA_DIST = ctype-big5.c ctype-cp932.c ctype-czech.c ctype-eucjpms.c ctype-euc_kr.c ctype-win1250ch.c \ + ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-utf8.c \ + ctype-ucs2.c ctype-uca.c ctype-tis620.c ctype-ujis.c \ +- xml.c decimal.c strto.c strings-x86.s \ ++ xml.c decimal.c strto.c strings-x86.S \ + longlong2str.c longlong2str-x86.s longlong2str_asm.c \ + my_strtoll10.c my_strtoll10-x86.s \ + strxmov.c bmove_upp.c strappend.c strcont.c strend.c \ +diff -Nuar --exclude '*.orig' mysql.orig//strings/Makefile.in mysql//strings/Makefile.in +--- mysql.orig//strings/Makefile.in 2011-02-11 19:24:24.000000000 +0000 ++++ mysql//strings/Makefile.in 2011-04-17 22:35:39.803194869 +0000 +@@ -87,7 +87,7 @@ + libmystrings_a_DEPENDENCIES = + am__libmystrings_a_SOURCES_DIST = bmove_upp-sparc.s strappend-sparc.s \ + strend-sparc.s strinstr-sparc.s strmake-sparc.s strmov-sparc.s \ +- strnmov-sparc.s strstr-sparc.s strings-x86.s \ ++ strnmov-sparc.s strstr-sparc.s strings-x86.S \ + longlong2str-x86.s my_strtoll10-x86.s strxmov.c bmove_upp.c \ + strappend.c strcont.c strend.c strfill.c strcend.c is_prefix.c \ + strstr.c strinstr.c strmake.c strnmov.c strmov.c \ +@@ -581,7 +581,7 @@ + @ASSEMBLER_sparc32_TRUE@@ASSEMBLER_x86_FALSE@ASRCS = bmove_upp-sparc.s strappend-sparc.s strend-sparc.s strinstr-sparc.s strmake-sparc.s strmov-sparc.s strnmov-sparc.s strstr-sparc.s + + # Exact one of ASSEMBLER_X +-@ASSEMBLER_x86_TRUE@ASRCS = strings-x86.s longlong2str-x86.s my_strtoll10-x86.s ++@ASSEMBLER_x86_TRUE@ASRCS = strings-x86.S longlong2str-x86.s my_strtoll10-x86.s + # These file MUST all be on the same line!! Otherwise automake + # generats a very broken makefile + @ASSEMBLER_sparc32_FALSE@@ASSEMBLER_x86_FALSE@CSRCS = strxmov.c bmove_upp.c strappend.c strcont.c strend.c strfill.c strcend.c is_prefix.c strstr.c strinstr.c strmake.c strnmov.c strmov.c longlong2str.c bfill.c bmove.c bmove512.c bchange.c strxnmov.c int2str.c str2int.c r_strinstr.c strtod.c strtol.c strtoul.c strtoll.c strtoull.c llstr.c strnlen.c ctype.c ctype-simple.c ctype-mb.c ctype-big5.c ctype-cp932.c ctype-czech.c ctype-eucjpms.c ctype-euc_kr.c ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-tis620.c ctype-ujis.c ctype-utf8.c ctype-ucs2.c ctype-uca.c ctype-win1250ch.c ctype-bin.c ctype-latin1.c my_vsnprintf.c xml.c decimal.c ctype-extra.c my_strtoll10.c str_alloc.c my_strchr.c +@@ -593,7 +593,7 @@ + EXTRA_DIST = ctype-big5.c ctype-cp932.c ctype-czech.c ctype-eucjpms.c ctype-euc_kr.c ctype-win1250ch.c \ + ctype-gb2312.c ctype-gbk.c ctype-sjis.c ctype-utf8.c \ + ctype-ucs2.c ctype-uca.c ctype-tis620.c ctype-ujis.c \ +- xml.c decimal.c strto.c strings-x86.s \ ++ xml.c decimal.c strto.c strings-x86.S \ + longlong2str.c longlong2str-x86.s longlong2str_asm.c \ + my_strtoll10.c my_strtoll10-x86.s \ + strxmov.c bmove_upp.c strappend.c strcont.c strend.c \ +diff -Nuar --exclude '*.orig' mysql.orig//strings/strings-x86.s mysql//strings/strings-x86.s +--- mysql.orig//strings/strings-x86.s 2011-02-11 19:20:41.000000000 +0000 ++++ mysql//strings/strings-x86.s 1970-01-01 00:00:00.000000000 +0000 +@@ -1,416 +0,0 @@ +-# Copyright (C) 2000 MySQL AB +-# This program is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; version 2 of the License. +-# +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. +-# +-# You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +- +-# Optimized string functions Intel 80x86 (gcc/gas syntax) +- +- .file "strings.s" +- .version "1.00" +- +-.text +- +-# Move a alligned, not overlapped, by (long) divided memory area +-# Args: to,from,length +- +-.globl bmove_align +- .type bmove_align,@function +-bmove_align: +- movl %edi,%edx +- push %esi +- movl 4(%esp),%edi # to +- movl 8(%esp),%esi # from +- movl 12(%esp),%ecx # length +- addw $3,%cx # fix if not divisible with long +- shrw $2,%cx +- jz .ba_20 +- .p2align 4,,7 +-.ba_10: +- movl -4(%esi,%ecx),%eax +- movl %eax,-4(%edi,%ecx) +- decl %ecx +- jnz .ba_10 +-.ba_20: pop %esi +- movl %edx,%edi +- ret +- +-.bmove_align_end: +- .size bmove_align,.bmove_align_end-bmove_align +- +- # Move a string from higher to lower +- # Arg from_end+1,to_end+1,length +- +-.globl bmove_upp +- .type bmove_upp,@function +-bmove_upp: +- movl %edi,%edx # Remember %edi +- push %esi +- movl 8(%esp),%edi # dst +- movl 16(%esp),%ecx # length +- movl 12(%esp),%esi # source +- test %ecx,%ecx +- jz .bu_20 +- subl %ecx,%esi # To start of strings +- subl %ecx,%edi +- +- .p2align 4,,7 +-.bu_10: movb -1(%esi,%ecx),%al +- movb %al,-1(%edi,%ecx) +- decl %ecx +- jnz .bu_10 +-.bu_20: pop %esi +- movl %edx,%edi +- ret +- +-.bmove_upp_end: +- .size bmove_upp,.bmove_upp_end-bmove_upp +- +- # Append fillchars to string +- # Args: dest,len,fill +- +-.globl strappend +- .type strappend,@function +-strappend: +- pushl %edi +- movl 8(%esp),%edi # Memory pointer +- movl 12(%esp),%ecx # Length +- clrl %eax # Find end of string +- repne +- scasb +- jnz sa_99 # String to long, shorten it +- movzb 16(%esp),%eax # Fillchar +- decl %edi # Point at end null +- incl %ecx # rep made one dec for null-char +- +- movb %al,%ah # (2) Set up a 32 bit pattern. +- movw %ax,%dx # (2) +- shll $16,%eax # (3) +- movw %dx,%ax # (2) %eax has the 32 bit pattern. +- +- movl %ecx,%edx # (2) Save the count of bytes. +- shrl $2,%ecx # (2) Number of dwords. +- rep +- stosl # (5 + 5n) +- movb $3,%cl # (2) +- and %edx,%ecx # (2) Fill in the odd bytes +- rep +- stosb # Move last bytes if any +- +-sa_99: movb $0,(%edi) # End of string +- popl %edi +- ret +-.strappend_end: +- .size strappend,.strappend_end-strappend +- +- # Find if string contains any char in another string +- # Arg: str,set +- # Ret: Pointer to first found char in str +- +-.globl strcont +- .type strcont,@function +-strcont: +- movl %edi,%edx +- pushl %esi +- movl 8(%esp),%esi # str +- movl 12(%esp),%ecx # set +- clrb %ah # For endtest +- jmp sc_60 +- +-sc_10: scasb +- jz sc_fo # Found char +-sc_20: cmp (%edi),%ah # Test if null +- jnz sc_10 # Not end of set yet +- incl %esi # Next char in str +-sc_60: movl %ecx,%edi # %edi = Set +- movb (%esi),%al # Test if this char exist +- andb %al,%al +- jnz sc_20 # Not end of string +- clrl %esi # Return Null +-sc_fo: movl %esi,%eax # Char found here +- movl %edx,%edi # Restore +- popl %esi +- ret +-.strcont_end: +- .size strcont,.strcont_end-strcont +- +- # Find end of string +- # Arg: str +- # ret: Pointer to end null +- +-.globl strend +- .type strend,@function +-strend: +- movl %edi,%edx # Save +- movl 4(%esp),%edi # str +- clrl %eax # Find end of string +- movl %eax,%ecx +- decl %ecx # ECX = -1 +- repne +- scasb +- movl %edi,%eax +- decl %eax # End of string +- movl %edx,%edi # Restore +- ret +-.strend_end: +- .size strend,.strend_end-strend +- +- # Make a string with len fill-chars and endnull +- # Args: dest,len,fill +- # Ret: dest+len +- +-.globl strfill +- .type strfill,@function +-strfill: +- pushl %edi +- movl 8(%esp),%edi # Memory pointer +- movl 12(%esp),%ecx # Length +- movzb 16(%esp),%eax # Fill +- +- movb %al,%ah # (2) Set up a 32 bit pattern +- movw %ax,%dx # (2) +- shll $16,%eax # (3) +- movw %dx,%ax # (2) %eax has the 32 bit pattern. +- +- movl %ecx,%edx # (2) Save the count of bytes. +- shrl $2,%ecx # (2) Number of dwords. +- rep +- stosl # (5 + 5n) +- movb $3,%cl # (2) +- and %edx,%ecx # (2) Fill in the odd bytes +- rep +- stosb # Move last bytes if any +- +- movb %cl,(%edi) # End NULL +- movl %edi,%eax # End i %eax +- popl %edi +- ret +-.strfill_end: +- .size strfill,.strfill_end-strfill +- +- +- # Find a char in or end of a string +- # Arg: str,char +- # Ret: pointer to found char or NullS +- +-.globl strcend +- .type strcend,@function +-strcend: +- movl %edi,%edx +- movl 4(%esp),%edi # str +- movb 8(%esp),%ah # search +- clrb %al # for scasb to find end +- +-se_10: cmpb (%edi),%ah +- jz se_20 # Found char +- scasb +- jnz se_10 # Not end +- dec %edi # Not found, point at end of string +-se_20: movl %edi,%eax +- movl %edx,%edi # Restore +- ret +-.strcend_end: +- .size strcend,.strcend_end-strcend +- +- # Test if string has a given suffix +- +-.globl is_prefix +- .type is_prefix,@function +-is_prefix: +- movl %edi,%edx # Save %edi +- pushl %esi # and %esi +- movl 12(%esp),%esi # get suffix +- movl 8(%esp),%edi # s1 +- movl $1,%eax # Ok and zero-test +-ip_10: cmpb (%esi),%ah +- jz suf_ok # End of string/ found suffix +- cmpsb # Compare strings +- jz ip_10 # Same, possible prefix +- xor %eax,%eax # Not suffix +-suf_ok: popl %esi +- movl %edx,%edi +- ret +-.is_prefix_end: +- .size is_prefix,.is_prefix_end-is_prefix +- +- # Find a substring in string +- # Arg: str,search +- +-.globl strstr +- .type strstr,@function +- +-strstr: +- pushl %edi +- pushl %esi +- movl 12(%esp),%esi # str +- movl 16(%esp),%edi # search +- movl %edi,%ecx +- incl %ecx # %ecx = search+1 +- movb (%edi),%ah # %ah = First char in search +- jmp sf_10 +- +-sf_00: movl %edx,%esi # si = Current str-pos +-sf_10: movb (%esi),%al # Test if this char exist +- andb %al,%al +- jz sf_90 # End of string, didn't find search +- incl %esi +- cmpb %al,%ah +- jnz sf_10 # Didn't find first char, continue +- movl %esi,%edx # Save str-pos in %edx +- movl %ecx,%edi +-sf_20: cmpb $0,(%edi) +- jz sf_fo # Found substring +- cmpsb +- jz sf_20 # Char ok +- jmp sf_00 # Next str-pos +- +-sf_90: movl $1,%edx # Return Null +-sf_fo: movl %edx,%eax # Char found here +- decl %eax # Pointed one after +- popl %esi +- popl %edi +- ret +-.strstr_end: +- .size strstr,.strstr_end-strstr +- +- +- # Find a substring in string, return index +- # Arg: str,search +- +-.globl strinstr +- .type strinstr,@function +- +-strinstr: +- pushl %ebp +- movl %esp,%ebp +- pushl 12(%ebp) # search +- pushl 8(%ebp) # str +- call strstr +- add $8,%esp +- or %eax,%eax +- jz si_99 # Not found, return NULL +- sub 8(%ebp),%eax # Pos from start +- inc %eax # And first pos = 1 +-si_99: popl %ebp +- ret +-.strinstr_end: +- .size strinstr,.strinstr_end-strinstr +- +- # Make a string of len length from another string +- # Arg: dst,src,length +- # ret: end of dst +- +-.globl strmake +- .type strmake,@function +- +-strmake: +- pushl %edi +- pushl %esi +- mov 12(%esp),%edi # dst +- movl $0,%edx +- movl 20(%esp),%ecx # length +- movl 16(%esp),%esi # src +- cmpl %edx,%ecx +- jz sm_90 +-sm_00: movb (%esi,%edx),%al +- cmpb $0,%al +- jz sm_90 +- movb %al,(%edi,%edx) +- incl %edx +- cmpl %edx,%ecx +- jnz sm_00 +-sm_90: movb $0,(%edi,%edx) +-sm_99: lea (%edi,%edx),%eax # Return pointer to end null +- pop %esi +- pop %edi +- ret +-.strmake_end: +- .size strmake,.strmake_end-strmake +- +- # Move a string with max len chars +- # arg: dst,src,len +- # ret: pos to first null or dst+len +- +-.globl strnmov +- .type strnmov,@function +-strnmov: +- pushl %edi +- pushl %esi +- movl 12(%esp),%edi # dst +- movl 16(%esp),%esi # src +- movl 20(%esp),%ecx # Length of memory-area +- jecxz snm_99 # Nothing to do +- clrb %al # For test of end-null +- +-snm_10: cmpb (%esi),%al # Next char to move +- movsb # move arg +- jz snm_20 # last char, fill with null +- loop snm_10 # Continue moving +- incl %edi # Point two after last +-snm_20: decl %edi # Point at first null (or last+1) +-snm_99: movl %edi,%eax # Pointer at last char +- popl %esi +- popl %edi +- ret +-.strnmov_end: +- .size strnmov,.strnmov_end-strnmov +- +- +-.globl strmov +- .type strmov,@function +-strmov: +- movl %esi,%ecx # Save old %esi and %edi +- movl %edi,%edx +- movl 8(%esp),%esi # get source pointer (s2) +- movl 4(%esp),%edi # %edi -> s1 +-smo_10: movb (%esi),%al +- movsb # move arg +- andb %al,%al +- jnz smo_10 # Not last +- movl %edi,%eax +- dec %eax +- movl %ecx,%esi # Restore +- movl %edx,%edi +- ret +-.strmov_end: +- .size strmov,.strmov_end-strmov +- +-.globl strxmov +- .type strxmov,@function +-strxmov: +- movl %ebx,%edx # Save %ebx, %esi and %edi +- mov %esi,%ecx +- push %edi +- leal 8(%esp),%ebx # Get destination +- movl (%ebx),%edi +- xorb %al,%al +- jmp next_str # Handle source ebx+4 +- +-start_str: +- movsb +- cmpb -1(%edi),%al +- jne start_str +- decl %edi # Don't copy last null +- +-next_str: +- addl $4,%ebx +- movl (%ebx),%esi +- orl %esi,%esi +- jne start_str +- movb %al,0(%edi) # Force last to ASCII 0 +- +- movl %edi,%eax # Return ptr to ASCII 0 +- pop %edi # Restore registers +- movl %ecx,%esi +- movl %edx,%ebx +- ret +-.strxmov_end: +- .size strxmov,.strxmov_end-strxmov +diff -Nuar --exclude '*.orig' mysql.orig//strings/strings-x86.S mysql//strings/strings-x86.S +--- mysql.orig//strings/strings-x86.S 1970-01-01 00:00:00.000000000 +0000 ++++ mysql//strings/strings-x86.S 2011-04-17 22:35:39.806527767 +0000 +@@ -0,0 +1,442 @@ ++# Copyright (C) 2000 MySQL AB ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; version 2 of the License. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ ++# Optimized string functions Intel 80x86 (gcc/gas syntax) ++ ++ .file "strings.S" ++ .version "1.01" ++ ++.text ++ ++# Move a alligned, not overlapped, by (long) divided memory area ++# Args: to,from,length ++ ++.globl bmove_align ++ .type bmove_align,@function ++bmove_align: ++ movl %edi,%edx ++ push %esi ++ movl 4(%esp),%edi # to ++ movl 8(%esp),%esi # from ++ movl 12(%esp),%ecx # length ++ addw $3,%cx # fix if not divisible with long ++ shrw $2,%cx ++ jz .ba_20 ++ .p2align 4,,7 ++.ba_10: ++ movl -4(%esi,%ecx),%eax ++ movl %eax,-4(%edi,%ecx) ++ decl %ecx ++ jnz .ba_10 ++.ba_20: pop %esi ++ movl %edx,%edi ++ ret ++ ++.bmove_align_end: ++ .size bmove_align,.bmove_align_end-bmove_align ++ ++ # Move a string from higher to lower ++ # Arg from_end+1,to_end+1,length ++ ++.globl bmove_upp ++ .type bmove_upp,@function ++bmove_upp: ++ movl %edi,%edx # Remember %edi ++ push %esi ++ movl 8(%esp),%edi # dst ++ movl 16(%esp),%ecx # length ++ movl 12(%esp),%esi # source ++ test %ecx,%ecx ++ jz .bu_20 ++ subl %ecx,%esi # To start of strings ++ subl %ecx,%edi ++ ++ .p2align 4,,7 ++.bu_10: movb -1(%esi,%ecx),%al ++ movb %al,-1(%edi,%ecx) ++ decl %ecx ++ jnz .bu_10 ++.bu_20: pop %esi ++ movl %edx,%edi ++ ret ++ ++.bmove_upp_end: ++ .size bmove_upp,.bmove_upp_end-bmove_upp ++ ++ # Append fillchars to string ++ # Args: dest,len,fill ++ ++.globl strappend ++ .type strappend,@function ++strappend: ++ pushl %edi ++ movl 8(%esp),%edi # Memory pointer ++ movl 12(%esp),%ecx # Length ++ clrl %eax # Find end of string ++ repne ++ scasb ++ jnz sa_99 # String to long, shorten it ++ movzb 16(%esp),%eax # Fillchar ++ decl %edi # Point at end null ++ incl %ecx # rep made one dec for null-char ++ ++ movb %al,%ah # (2) Set up a 32 bit pattern. ++ movw %ax,%dx # (2) ++ shll $16,%eax # (3) ++ movw %dx,%ax # (2) %eax has the 32 bit pattern. ++ ++ movl %ecx,%edx # (2) Save the count of bytes. ++ shrl $2,%ecx # (2) Number of dwords. ++ rep ++ stosl # (5 + 5n) ++ movb $3,%cl # (2) ++ and %edx,%ecx # (2) Fill in the odd bytes ++ rep ++ stosb # Move last bytes if any ++ ++sa_99: movb $0,(%edi) # End of string ++ popl %edi ++ ret ++.strappend_end: ++ .size strappend,.strappend_end-strappend ++ ++ # Find if string contains any char in another string ++ # Arg: str,set ++ # Ret: Pointer to first found char in str ++ ++.globl strcont ++ .type strcont,@function ++strcont: ++ movl %edi,%edx ++ pushl %esi ++ movl 8(%esp),%esi # str ++ movl 12(%esp),%ecx # set ++ clrb %ah # For endtest ++ jmp sc_60 ++ ++sc_10: scasb ++ jz sc_fo # Found char ++sc_20: cmp (%edi),%ah # Test if null ++ jnz sc_10 # Not end of set yet ++ incl %esi # Next char in str ++sc_60: movl %ecx,%edi # %edi = Set ++ movb (%esi),%al # Test if this char exist ++ andb %al,%al ++ jnz sc_20 # Not end of string ++ clrl %esi # Return Null ++sc_fo: movl %esi,%eax # Char found here ++ movl %edx,%edi # Restore ++ popl %esi ++ ret ++.strcont_end: ++ .size strcont,.strcont_end-strcont ++ ++ # Find end of string ++ # Arg: str ++ # ret: Pointer to end null ++ ++.globl strend ++ .type strend,@function ++strend: ++ movl %edi,%edx # Save ++ movl 4(%esp),%edi # str ++ clrl %eax # Find end of string ++ movl %eax,%ecx ++ decl %ecx # ECX = -1 ++ repne ++ scasb ++ movl %edi,%eax ++ decl %eax # End of string ++ movl %edx,%edi # Restore ++ ret ++.strend_end: ++ .size strend,.strend_end-strend ++ ++ # Make a string with len fill-chars and endnull ++ # Args: dest,len,fill ++ # Ret: dest+len ++ ++.globl strfill ++ .type strfill,@function ++strfill: ++ pushl %edi ++ movl 8(%esp),%edi # Memory pointer ++ movl 12(%esp),%ecx # Length ++ movzb 16(%esp),%eax # Fill ++ ++ movb %al,%ah # (2) Set up a 32 bit pattern ++ movw %ax,%dx # (2) ++ shll $16,%eax # (3) ++ movw %dx,%ax # (2) %eax has the 32 bit pattern. ++ ++ movl %ecx,%edx # (2) Save the count of bytes. ++ shrl $2,%ecx # (2) Number of dwords. ++ rep ++ stosl # (5 + 5n) ++ movb $3,%cl # (2) ++ and %edx,%ecx # (2) Fill in the odd bytes ++ rep ++ stosb # Move last bytes if any ++ ++ movb %cl,(%edi) # End NULL ++ movl %edi,%eax # End i %eax ++ popl %edi ++ ret ++.strfill_end: ++ .size strfill,.strfill_end-strfill ++ ++ ++ # Find a char in or end of a string ++ # Arg: str,char ++ # Ret: pointer to found char or NullS ++ ++.globl strcend ++ .type strcend,@function ++strcend: ++ movl %edi,%edx ++ movl 4(%esp),%edi # str ++ movb 8(%esp),%ah # search ++ clrb %al # for scasb to find end ++ ++se_10: cmpb (%edi),%ah ++ jz se_20 # Found char ++ scasb ++ jnz se_10 # Not end ++ dec %edi # Not found, point at end of string ++se_20: movl %edi,%eax ++ movl %edx,%edi # Restore ++ ret ++.strcend_end: ++ .size strcend,.strcend_end-strcend ++ ++ # Test if string has a given suffix ++ ++.globl is_prefix ++ .type is_prefix,@function ++is_prefix: ++ movl %edi,%edx # Save %edi ++ pushl %esi # and %esi ++ movl 12(%esp),%esi # get suffix ++ movl 8(%esp),%edi # s1 ++ movl $1,%eax # Ok and zero-test ++ip_10: cmpb (%esi),%ah ++ jz suf_ok # End of string/ found suffix ++ cmpsb # Compare strings ++ jz ip_10 # Same, possible prefix ++ xor %eax,%eax # Not suffix ++suf_ok: popl %esi ++ movl %edx,%edi ++ ret ++.is_prefix_end: ++ .size is_prefix,.is_prefix_end-is_prefix ++ ++ # Find a substring in string ++ # Arg: str,search ++ ++.globl strstr ++ .type strstr,@function ++ ++strstr: ++ pushl %edi ++ pushl %esi ++ movl 12(%esp),%esi # str ++ movl 16(%esp),%edi # search ++ movl %edi,%ecx ++ incl %ecx # %ecx = search+1 ++ movb (%edi),%ah # %ah = First char in search ++ jmp sf_10 ++ ++sf_00: movl %edx,%esi # si = Current str-pos ++sf_10: movb (%esi),%al # Test if this char exist ++ andb %al,%al ++ jz sf_90 # End of string, didn't find search ++ incl %esi ++ cmpb %al,%ah ++ jnz sf_10 # Didn't find first char, continue ++ movl %esi,%edx # Save str-pos in %edx ++ movl %ecx,%edi ++sf_20: cmpb $0,(%edi) ++ jz sf_fo # Found substring ++ cmpsb ++ jz sf_20 # Char ok ++ jmp sf_00 # Next str-pos ++ ++sf_90: movl $1,%edx # Return Null ++sf_fo: movl %edx,%eax # Char found here ++ decl %eax # Pointed one after ++ popl %esi ++ popl %edi ++ ret ++.strstr_end: ++ .size strstr,.strstr_end-strstr ++ ++ ++ # Find a substring in string, return index ++ # Arg: str,search ++ ++.globl strinstr ++ .type strinstr,@function ++ ++strinstr: ++ pushl %ebp ++ movl %esp,%ebp ++#ifdef __PIC__ ++# undef __i686 /* gcc define gets in our way */ ++ pushl %ebx ++ call __i686.get_pc_thunk.bx ++ addl $_GLOBAL_OFFSET_TABLE_, %ebx ++#endif ++ pushl 12(%ebp) # search ++ pushl 8(%ebp) # str ++#ifdef __PIC__ ++ call strstr@PLT /*We need to be sure that ebx point to the got*/ ++#else ++ call strstr ++#endif ++ add $8,%esp ++ or %eax,%eax ++ jz si_99 # Not found, return NULL ++ sub 8(%ebp),%eax # Pos from start ++ inc %eax # And first pos = 1 ++si_99: ++#ifdef __PIC__ ++ popl %ebx ++#endif ++ popl %ebp ++ ret ++.strinstr_end: ++ .size strinstr,.strinstr_end-strinstr ++ ++ # Make a string of len length from another string ++ # Arg: dst,src,length ++ # ret: end of dst ++ ++.globl strmake ++ .type strmake,@function ++ ++strmake: ++ pushl %edi ++ pushl %esi ++ mov 12(%esp),%edi # dst ++ movl $0,%edx ++ movl 20(%esp),%ecx # length ++ movl 16(%esp),%esi # src ++ cmpl %edx,%ecx ++ jz sm_90 ++sm_00: movb (%esi,%edx),%al ++ cmpb $0,%al ++ jz sm_90 ++ movb %al,(%edi,%edx) ++ incl %edx ++ cmpl %edx,%ecx ++ jnz sm_00 ++sm_90: movb $0,(%edi,%edx) ++sm_99: lea (%edi,%edx),%eax # Return pointer to end null ++ pop %esi ++ pop %edi ++ ret ++.strmake_end: ++ .size strmake,.strmake_end-strmake ++ ++ # Move a string with max len chars ++ # arg: dst,src,len ++ # ret: pos to first null or dst+len ++ ++.globl strnmov ++ .type strnmov,@function ++strnmov: ++ pushl %edi ++ pushl %esi ++ movl 12(%esp),%edi # dst ++ movl 16(%esp),%esi # src ++ movl 20(%esp),%ecx # Length of memory-area ++ jecxz snm_99 # Nothing to do ++ clrb %al # For test of end-null ++ ++snm_10: cmpb (%esi),%al # Next char to move ++ movsb # move arg ++ jz snm_20 # last char, fill with null ++ loop snm_10 # Continue moving ++ incl %edi # Point two after last ++snm_20: decl %edi # Point at first null (or last+1) ++snm_99: movl %edi,%eax # Pointer at last char ++ popl %esi ++ popl %edi ++ ret ++.strnmov_end: ++ .size strnmov,.strnmov_end-strnmov ++ ++ ++.globl strmov ++ .type strmov,@function ++strmov: ++ movl %esi,%ecx # Save old %esi and %edi ++ movl %edi,%edx ++ movl 8(%esp),%esi # get source pointer (s2) ++ movl 4(%esp),%edi # %edi -> s1 ++smo_10: movb (%esi),%al ++ movsb # move arg ++ andb %al,%al ++ jnz smo_10 # Not last ++ movl %edi,%eax ++ dec %eax ++ movl %ecx,%esi # Restore ++ movl %edx,%edi ++ ret ++.strmov_end: ++ .size strmov,.strmov_end-strmov ++ ++.globl strxmov ++ .type strxmov,@function ++strxmov: ++ movl %ebx,%edx # Save %ebx, %esi and %edi ++ mov %esi,%ecx ++ push %edi ++ leal 8(%esp),%ebx # Get destination ++ movl (%ebx),%edi ++ xorb %al,%al ++ jmp next_str # Handle source ebx+4 ++ ++start_str: ++ movsb ++ cmpb -1(%edi),%al ++ jne start_str ++ decl %edi # Don't copy last null ++ ++next_str: ++ addl $4,%ebx ++ movl (%ebx),%esi ++ orl %esi,%esi ++ jne start_str ++ movb %al,0(%edi) # Force last to ASCII 0 ++ ++ movl %edi,%eax # Return ptr to ASCII 0 ++ pop %edi # Restore registers ++ movl %ecx,%esi ++ movl %edx,%ebx ++ ret ++.strxmov_end: ++ .size strxmov,.strxmov_end-strxmov ++ ++#ifdef __PIC__ ++ .section .gnu.linkonce.t.__i686.get_pc_thunk.bx,"ax",@progbits ++ .globl __i686.get_pc_thunk.bx ++ .hidden __i686.get_pc_thunk.bx ++ .type __i686.get_pc_thunk.bx,@function ++__i686.get_pc_thunk.bx: ++ movl (%esp), %ebx ++ ret ++#endif ++ .section .note.GNU-stack,"",@progbits ++ |