This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Problems with egcs-1.0.1-/gcc-2.8.0-inline assembly [causes a kernel-oops in de4x5-driver]
- To: egcs-bugs at cygnus dot com
- Subject: Problems with egcs-1.0.1-/gcc-2.8.0-inline assembly [causes a kernel-oops in de4x5-driver]
- From: Bernd Nottelmann <nottelm at ptp283 dot uni-muenster dot de>
- Date: Mon, 19 Jan 1998 16:28:15 +0100
- Organization: Westfälische Wilhelms-Universität Münster
Hi,
consider the following C-program (a very very simplified version
of de4x5.c :-):
-----------------------snip-----------------------
extern inline char * strstr(const char * cs,const char * ct)
{
register char * __res;
__asm__ __volatile__(
"cld\n\t" \
"movl %4,%%edi\n\t"
"repne\n\t"
"scasb\n\t"
"notl %%ecx\n\t"
"decl %%ecx\n\t" /* NOTE! This also sets Z if searchstring='' */
"movl %%ecx,%%edx\n"
"1:\tmovl %4,%%edi\n\t"
"movl %%esi,%%eax\n\t"
"movl %%edx,%%ecx\n\t"
"repe\n\t" /* <- SEGMENTATION FAULT HERE */
"cmpsb\n\t"
"je 2f\n\t" /* also works for empty string, see above */
"xchgl %%eax,%%esi\n\t"
"incl %%esi\n\t"
"cmpb $0,-1(%%eax)\n\t"
"jne 1b\n\t"
"xorl %%eax,%%eax\n\t"
"2:"
:"=a" (__res):"0" (0),"c" (0xffffffff),"S" (cs),"g" (ct)
:"cx","dx","di","si");
return __res;
}
#include <stdio.h>
main() {
int i, siglen;
char ManCode[8];
const char *signatures[]={"DE425","DE434","DE435","DE450","DE500"};
siglen = sizeof(signatures)/sizeof(const char *);
ManCode[0]='_'; ManCode[1]='_';
ManCode[2]='?'; ManCode[3]='?'; ManCode[5]='?';
ManCode[6]='\0';
for (i=0;i<siglen;i++)
if (strstr(ManCode, signatures[i]) != NULL)
printf("Found\n");
else
printf("Not found\n");
}
-----------------------snip-----------------------
Compiled with
gcc strtst.c -o strtst
it runs without any error messages:
# ./strtst
Not found
Not found
Not found
Not found
Not found
but when I compile it with -O and higher optimizations
it gives a seg fault (it occurs in the assembler line with
the corresponding comment).
My egcs has been only build from the gcc-subtree
I hope I have given enough information to you.
Bernd
.file "strtst.c"
.version "01.01"
/ GNU C version egcs-2.90.23 980102 (egcs-1.0.1 release) (i686-pc-linux-gnulibc1) compiled by GNU C version egcs-2.90.23 980102 (egcs-1.0.1 release).
/ options passed:
/ options enabled: -fpeephole -ffunction-cse -fkeep-static-consts
/ -fpcc-struct-return -fsched-interblock -fsched-spec -fcommon
/ -fverbose-asm -fgnu-linker -fargument-alias -m80387 -mhard-float
/ -mno-soft-float -mieee-fp -mfp-ret-in-387 -mschedule-prologue
/ -mcpu=pentiumpro -march=pentium
gcc2_compiled.:
.section .rodata
.LC0:
.string "DE425"
.LC1:
.string "DE434"
.LC2:
.string "DE435"
.LC3:
.string "DE450"
.LC4:
.string "DE500"
.LC5:
.string "Found\n"
.LC6:
.string "Not found\n"
.text
.align 4
.globl main
.type main,@function
main:
pushl %ebp
movl %esp,%ebp
subl $36,%esp
leal -36(%ebp),%eax
movl $.LC0,-36(%ebp)
movl $.LC1,-32(%ebp)
movl $.LC2,-28(%ebp)
movl $.LC3,-24(%ebp)
movl $.LC4,-20(%ebp)
movl $5,-8(%ebp)
movb $95,-16(%ebp)
movb $95,-15(%ebp)
movb $63,-15(%ebp)
movb $63,-15(%ebp)
movb $63,-15(%ebp)
movb $0,-10(%ebp)
movl $0,-4(%ebp)
.L3:
movl -4(%ebp),%eax
cmpl %eax,-8(%ebp)
jg .L6
jmp .L4
.align 4
.L6:
movl -4(%ebp),%eax
movl %eax,%edx
leal 0(,%edx,4),%eax
leal -36(%ebp),%edx
movl (%eax,%edx),%eax
pushl %eax
leal -16(%ebp),%eax
pushl %eax
call strstr
addl $8,%esp
movl %eax,%eax
testl %eax,%eax
je .L7
pushl $.LC5
call printf
addl $4,%esp
jmp .L5
.align 4
.L7:
pushl $.LC6
call printf
addl $4,%esp
.L8:
.L5:
incl -4(%ebp)
jmp .L3
.align 4
.L4:
.L2:
movl %ebp,%esp
popl %ebp
ret
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) egcs-2.90.23 980102 (egcs-1.0.1 release)"
.file "strtst.c"
.version "01.01"
/ GNU C version egcs-2.90.23 980102 (egcs-1.0.1 release) (i686-pc-linux-gnulibc1) compiled by GNU C version egcs-2.90.23 980102 (egcs-1.0.1 release).
/ options passed: -O
/ options enabled: -fdefer-pop -fthread-jumps -fpeephole -ffunction-cse
/ -finline -fkeep-static-consts -fpcc-struct-return -fsched-interblock
/ -fsched-spec -fcommon -fverbose-asm -fgnu-linker -falias-check
/ -fargument-alias -m80387 -mhard-float -mno-soft-float -mieee-fp
/ -mfp-ret-in-387 -mschedule-prologue -mcpu=pentiumpro -march=pentium
gcc2_compiled.:
.section .rodata
.LC0:
.string "DE425"
.LC1:
.string "DE434"
.LC2:
.string "DE435"
.LC3:
.string "DE450"
.LC4:
.string "DE500"
.LC5:
.string "Found\n"
.LC6:
.string "Not found\n"
.text
.align 4
.globl main
.type main,@function
main:
pushl %ebp
movl %esp,%ebp
subl $40,%esp
pushl %edi
pushl %esi
pushl %ebx
movl $.LC0,-28(%ebp)
movl $.LC1,-24(%ebp)
movl $.LC2,-20(%ebp)
movl $.LC3,-16(%ebp)
movl $.LC4,-12(%ebp)
movb $95,-8(%ebp)
movb $63,-7(%ebp)
movb $0,-2(%ebp)
movl $0,-40(%ebp)
leal -28(%ebp),%edx
movl %edx,-32(%ebp)
leal -8(%ebp),%ecx
movl %ecx,-36(%ebp)
.align 4
.L6:
xorl %eax,%eax
movl $-1,%ecx
movl -36(%ebp),%esi
movl -40(%ebp),%edx
movl -32(%ebp),%ebx
#APP
cld
movl (%ebx,%edx,4),%edi
repne
scasb
notl %ecx
decl %ecx
movl %ecx,%edx
1: movl (%ebx,%edx,4),%edi
movl %esi,%eax
movl %edx,%ecx
repe
cmpsb
je 2f
xchgl %eax,%esi
incl %esi
cmpb $0,-1(%eax)
jne 1b
xorl %eax,%eax
2:
#NO_APP
testl %eax,%eax
je .L7
pushl $.LC5
jmp .L11
.align 4
.L7:
pushl $.LC6
.L11:
call printf
addl $4,%esp
incl -40(%ebp)
cmpl $5,-40(%ebp)
jl .L6
leal -52(%ebp),%esp
popl %ebx
popl %esi
popl %edi
movl %ebp,%esp
popl %ebp
ret
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) egcs-2.90.23 980102 (egcs-1.0.1 release)"