[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[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: