On Sun, Apr 04, 2004 at 07:35:12PM +0200, Karsten Merker wrote: > On Sun, Apr 04, 2004 at 05:50:10PM +0200, Guido Guenther wrote: > > On Sun, Apr 04, 2004 at 01:52:12PM +0200, Karsten Merker wrote: > > > On a DECstation 5000/20, having an R3000, the following combinations work: > > > - Debian 2.4.19 plus Debian/Woody glibc (2.2.5) > > > - Debian 2.4.19 plus Debian/Sarge glibc (2.3.2) > > > - CVS 2.4.25 from 2004/03/25 plus Debian/Woody glibc (2.2.5) > > > But running the same CVS 2.4.25 with the Debian/Sarge glibc (2.3.2) > > > causes (at least) ls, sleep and tar to die with "illegal instruction". > > > What is the illegal instruction? Gdb should tell. > > It is an "ll" instruction in libpthread (checked in the cases of > ls, sleep and tar). ll/sc should be emulated by the kernel on R3k, > so it looks like there is a problem with the emulation code. The reason seems to be in arch/mips/kernel/cpu-probe.c. In function cpu_probe_legacy the following flags are set for R2k/R3k: c->options = MIPS_CPU_TLB | MIPS_CPU_NOFPUEX | MIPS_CPU_LLSC; i.e. R2k and R3k are assumed to have ll/sc implemented, so the ll/sc emulation does not get called. The following micro-patch should fix that. Regards, Karsten -- #include <standard_disclaimer> Nach Paragraph 28 Abs. 3 Bundesdatenschutzgesetz widerspreche ich der Nutzung oder Uebermittlung meiner Daten fuer Werbezwecke oder fuer die Markt- oder Meinungsforschung.
--- linux-mips-cvs-20040326/arch/mips/kernel/cpu-probe.c Thu Feb 5 20:54:41 2004 +++ linux-mips-cvs-20040326.patched/arch/mips/kernel/cpu-probe.c Sun Apr 4 20:23:21 2004 @@ -170,8 +170,7 @@ case PRID_IMP_R2000: c->cputype = CPU_R2000; c->isa_level = MIPS_CPU_ISA_I; - c->options = MIPS_CPU_TLB | MIPS_CPU_NOFPUEX | - MIPS_CPU_LLSC; + c->options = MIPS_CPU_TLB | MIPS_CPU_NOFPUEX; if (__cpu_has_fpu()) c->options |= MIPS_CPU_FPU; c->tlbsize = 64; @@ -185,8 +184,7 @@ else c->cputype = CPU_R3000; c->isa_level = MIPS_CPU_ISA_I; - c->options = MIPS_CPU_TLB | MIPS_CPU_NOFPUEX | - MIPS_CPU_LLSC; + c->options = MIPS_CPU_TLB | MIPS_CPU_NOFPUEX; if (__cpu_has_fpu()) c->options |= MIPS_CPU_FPU; c->tlbsize = 64;