Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 18 Jul 2003 17:14:39 +0200
From:      Jens Rehsack <rehsack@liwing.de>
To:        FreeBSD Hackers <freebsd-hackers@freebsd.org>
Subject:   buildkernel fails after world update including new gcc 3.3.1-pre
Message-ID:  <3F180EDF.2050708@liwing.de>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3F180EDF.2050708>