[PATCH] ll/sc emulation fix (was: Kernel vs. glibc problems)
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;
Reply to: