cvs commit: src/sys/sparc64/include in_cksum.h

Christoph Mallon christoph.mallon at gmx.de
Fri Jun 27 20:25:14 UTC 2008


Marius Strobl wrote:
> marius      2008-06-25 21:04:59 UTC
> 
>   FreeBSD src repository
> 
>   Modified files:
>     sys/sparc64/include  in_cksum.h 
>   Log:
>   SVN rev 180011 on 2008-06-25 21:04:59Z by marius
>   
>   Use "__asm __volatile" rather than "__asm" for instruction sequences
>   that modify condition codes (the carry bit, in this case). Without
>   "__volatile", the compiler might add the inline assembler instructions
>   between unrelated code which also uses condition codes, modifying the
>   latter.
>   This prevents the TCP pseudo header checksum calculation done in
>   tcp_output() from having effects on other conditions when compiled
>   with GCC 4.2.1 at "-O2" and "options INET6" left out. [1]
>   
>   Reported & tested by:   Boris Kochergin [1]
>   MFC after:              3 days

This approach seems wrong to me and I think it works only by chance. The 
condition codes ("cc") should be added to the clobbered list of the asm 
statement instead of making the statement volatile: __asm("..." : $OUT : 
$IN : "cc");
This very case is also mentioned in the GCC documentation:
"If your assembler instruction can alter the condition code register,
add `cc' to the list of clobbered registers.  GCC on some machines
represents the condition codes as a specific hardware register; `cc'
serves to name this register.  On other machines, the condition code is
handled differently, and specifying `cc' has no effect.  But it is
valid no matter what the machine." (Section 5.35 Assembler Instructions 
with C Expression Operands)

I wrote a letter directly to Marius about this issue two days ago, but I 
got no response so far. Because this change has a MFC after 3 days, I'm 
writing to this list.

Regards
	Christoph


More information about the cvs-src mailing list