Riccardo wrote:
I never got an error like this in my life :

 gcc -DHAVE_CONFIG_H -I. -I../../../kaffe/kaffe/kaffevm -I../../config -
I../../include/kaffe -I../../../kaffe/kaffe/kaffevm/systems/unix-
jthreads -I../../kaffe/kaffevm/jit3 -I../../../kaffe/kaffe/kaffevm/jit3 -
I../../../kaffe/libltdl -DTRANSLATOR -DJIT3 -I../../../kaffe/kaffe/jvmpi -
I../../../kaffe/kaffe/xprof -I../../include -DKVER=\"1.1.x-cvs\" -I/home/
multix/kaffe-cvs/netbsd-68k/../kaffe/kaffe/kaffevm -I/home/multix/kaffe-
cvs/netbsd-68k/../kaffe/kaffe/kaffevm/jit3 -I/home/multix/kaffe-cvs/
netbsd-68k/../kaffe/kaffe/kaffevm/systems/unix-jthreads -I../../../kaffe/
config -I../../../kaffe/include -DKAFFE_VMDEBUG -g -O2 -Wall -Wstrict-
prototypes -fno-omit-frame-pointer -c ../../../kaffe/kaffe/kaffevm/locks.
c -Wp,-MD,.deps/locks.TPlo  -fPIC -DPIC -o .libs/locks.o
/var/tmp/ccTh5fPf.s: Assembler messages:
/var/tmp/ccTh5fPf.s:2248: Error: operands mismatch -- statement `casl %
a0,%d3,(%a2)' ignored
gmake[3]: *** [locks.lo] Error 1

Kiyo Inaba looked at that one, it seems to be a bug in kaffe's m68k assembler sources, namely the COMPARE_AND_EXCHANGE macro. See http://gcc.gnu.org/ml/gcc-bugs/2003-04/msg00753.html


There is some code at http://www.uclibc.org/lists/uclibc/2002-August/004205.html that is about writing a compare_and_swap macro for a coldfire CPU for uclibc that might be interesting to take a look at. Tony had some ideas how to deal with it here: http://www.kaffe.org/pipermail/kaffe/2003-February/041462.html

I have a couple of ideas (though I don;t speak m68k assembler, so they may be bogus, you've been warned):

1. My guess is that the constraint for the first argument of casl is wrong, it should be a data register. Does changing "=&r" (tmp) into "=&d" (tmp) in line 181 of kaffe/config/m68k/common.h work?

2. Does reverting m68k to plain C COMPARE_AND_EXCHNAGE as proposed by me here: http://www.kaffe.org/pipermail/kaffe/2003-February/041464.html work?

For the long term, of course, atomic compare and exchange on different CPUs would be a good thing to delegate to a library. I'm not aware of any such library, but there was some talk on the linux kernel mailing list about such beasts here:
http://www.mail-archive.com/[EMAIL PROTECTED]/msg10303.html


The solution I have in mind is to use the code from glibc (in sysdeps/cpu-type/atomicity.h), like SableVM does.

glibc 2.3.2 has this for m68k ('20 and above due to casl, which is what kaffe is using, too):

static inline int
__attribute__ ((unused))
compare_and_swap (volatile long int *p, long int oldval, long int newval)
{
  char ret;
  long int readval;

  __asm__ __volatile__ ("cas%.l %2,%3,%1; seq %0"
                        : "=dm" (ret), "=m" (*p), "=d" (readval)
                        : "d" (newval), "m" (*p), "2" (oldval));
  return ret;
}



cheers,
dalibor topic



_______________________________________________
kaffe mailing list
[EMAIL PROTECTED]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to