On Wed, 13 Jun 2001, H . J . Lu wrote: > > What's the problem with the kernel? It works fine for my R3400A > > DECstation. Glibc is 2.2.3 as released. If there is something wrong, I > > definitely want to know. > > It has something to do with the atomic emulation in kernel for mips I. Hmm, I thought Florian's sysmips() fixes went in. Here is a patch I use successfully for some time. It doesn't work for small negative integers, but glibc doesn't use them, AFAIK. Another possibility is to use the set of two patches for sys__test_and_set() I've sent here recently. This would break portability for now, though, if you wanted to distribute glibc or kernel binaries. This is also the reason I didn't put my current patched version of glibc on my FTP site. The patch is not against a current version of the kernel -- you might need to apply it manually. Maciej -- + Maciej W. Rozycki, Technical University of Gdansk, Poland + +--------------------------------------------------------------+ + e-mail: macro@ds2.pg.gda.pl, PGP key available + patch-mips-2.4.0-test11-20001211-sysmips-0 diff -up --recursive --new-file linux-mips-2.4.0-test11-20001211.macro/arch/mips/kernel/sysmips.c linux-mips-2.4.0-test11-20001211/arch/mips/kernel/sysmips.c --- linux-mips-2.4.0-test11-20001211.macro/arch/mips/kernel/sysmips.c Sat Nov 18 05:27:01 2000 +++ linux-mips-2.4.0-test11-20001211/arch/mips/kernel/sysmips.c Tue Dec 12 23:09:57 2000 @@ -75,21 +75,31 @@ sys_sysmips(int cmd, int arg1, int arg2, } case MIPS_ATOMIC_SET: { - unsigned int tmp; + int tmp1; p = (int *) arg1; errno = verify_area(VERIFY_WRITE, p, sizeof(*p)); if (errno) return errno; + errno = 0; +#ifndef CONFIG_CPU_HAS_LLSC + + save_and_cli(tmp1); + errno |= __get_user(tmp, p); + errno |= __put_user(arg2, p); + restore_flags(tmp1); + +#else /* CONFIG_CPU_HAS_LLSC */ + __asm__(".set\tpush\t\t\t# sysmips(MIPS_ATOMIC, ...)\n\t" ".set\tmips2\n\t" ".set\tnoat\n\t" - "1:\tll\t%0, %4\n\t" - "move\t$1, %3\n\t" - "2:\tsc\t$1, %1\n\t" - "beqz\t$1, 1b\n\t" + "1:\tll\t%0, %5\n\t" + "move\t%3, %4\n\t" + "2:\tsc\t%3, %1\n\t" + "beqz\t%3, 1b\n\t" ".set\tpop\n\t" ".section\t.fixup,\"ax\"\n" "3:\tli\t%2, 1\t\t\t# error\n\t" @@ -98,23 +108,17 @@ sys_sysmips(int cmd, int arg1, int arg2, ".word\t1b, 3b\n\t" ".word\t2b, 3b\n\t" ".previous\n\t" - : "=&r" (tmp), "=o" (* (u32 *) p), "=r" (errno) + : "=&r" (tmp), "=o" (* (u32 *) p), "=r" (errno), + "=&r" (tmp1) : "r" (arg2), "o" (* (u32 *) p), "2" (errno) : "$1"); +#endif /* CONFIG_CPU_HAS_LLSC */ + if (errno) return -EFAULT; - /* We're skipping error handling etc. */ - if (current->ptrace & PT_TRACESYS) - syscall_trace(); - - __asm__ __volatile__( - "move\t$29, %0\n\t" - "j\tret_from_sys_call" - : /* No outputs */ - : "r" (&cmd)); - /* Unreached */ + return tmp; } case MIPS_FIXADE: