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
_______________________________________________
cvs-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to