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