buildkernel fails after world update including new gcc 3.3.1-pre

Jens Rehsack rehsack at liwing.de
Fri Jul 18 08:14:44 PDT 2003


Hi,

I updated a system of us for testing the the compiler and I run into 
following problem:

cc -c -O -pipe -march=pentium4 -Wall \
     -Wredundant-decls -Wnested-externs -Wstrict-prototypes \
     -Wmissing-prototypes -Wpointer-arith -Winline \
     -Wcast-qual-fformat-extensions -std=c99  -nostdinc \
     -I-  -I. -I/usr/src/sys -I/usr/src/sys/dev \
     -I/usr/src/sys/contrib/dev/acpica \
     -I/usr/src/sys/contrib/ipfilter \
     -I/usr/src/sys/contrib/dev/ath \
     -I/usr/src/sys/contrib/dev/ath/freebsd -D_KERNEL \
     -include opt_global.h -fno-common  \
     -mno-align-long-strings \
     -mpreferred-stack-boundary=2 -ffreestanding \
     /usr/src/sys/dev/ata/ata-all.c
{standard input}: Assembler messages:
{standard input}:7652: Error: invalid character '_' in mnemonic
*** Error code 1

Stop in /usr/obj/usr/src/sys/MOBY.
*** Error code 1

Stop in /usr/src.
*** Error code 1

Stop in /usr/src.

The lines around the location are:
ata_enclosure_status:
         pushl   %ebp
         movl    %esp, %ebp
         pushl   %edi
         pushl   %esi
         pushl   %ebx
         subl    $24, %esp
         movl    8(%ebp), %edi
         movl    $6, -16(%ebp)
         testb   $8, 20(%edi)
         ds ; je .L2817
         movl    (%edi), %eax
         movl    $1, 4(%esp)
         movl    %eax, (%esp)
         call    *248(%eax)
         movl    (%edi), %ecx
         movl    $0, %eax
         movl    $128, %edx
#APP
                 lock ;          cmpxchgl %edx,244(%ecx) ;
setz     %al ;                   movzbl  %al,%eax ;      1:        #
atomic_cmpset_int
#NO_APP
         testl   %eax, %eax
         jne     .L2830
         movl    $0, %esi
         movl    $128, %ebx
.L2822:

The line 7652 is the "#NO_APP". After asking the current@ list
I didn't receive any answer so I assumed either noone had the
time to look over it or it's not really interesting for any
responsible. So I started some research about the '#APP'/'#NO_APP',
the code origin, etc.

The '#APP'/'#NO_APP' pair is used by the compiler to mark the
assembly section to be reformatted by the as(1) builtin preprocessor.
Because that's not the only '#APP'/'#NO_APP' pair, there must be sth.
different.

A try to reformat the assembly file produces the experience that
the error is gone when the label '1:' is placed on a new line.
The question I couldn't answer by myself is now:

is there any difference in the resulting code, if the inline assembly
of 'atomic_cmpset_int' will be written like:

static __inline int
atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src)
{
	int res = exp;

	__asm __volatile (
	"" __XSTRING(MPLOCKED) "\n\t"
	"cmpxchgl %1,%2\n\t"
	"setz %%al\n\t"
	"movzbl %%al,%0\n\t"
	"1:\n\t"
	"# atomic_cmpset_int"
	: "+a" (res)			/* 0 (result) */
	: "r" (src),			/* 1 */
	  "m" (*(dst))			/* 2 */
	: "memory");				

	return (res);
}

as it's shown in an example in
src/contrib/binutils/gas/config/tc-i386.c?

Or is the resulting code different from the original? I understood
the ';' as a instruction sepatator, so for my understanding there
will be no difference. But I think about the 'lock' instruction
which is required for SMP kernels? How works it here? Does it locks
the entire 3 instructions or just the first of them?

It would be great if someone could explain that to me.

Thanks and best regards,
Jens



More information about the freebsd-hackers mailing list