Re: simulate_ll and simulate_sc move to do_cpu from do_ri

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

 



Hi Ralf,

On Fri, 18 Apr 2003 20:45:53 +0200
Ralf Baechle <ralf@linux-mips.org> wrote:

> On Fri, Apr 18, 2003 at 06:17:48PM +0900, Yoichi Yuasa wrote:
> 
> > Why did you move simulate_ll and simulate_sc to do_cpu from do_ri?
> > NEC VR4100 series need simulate_ll and simulate_sc in do_ri.
> 
> As the CVS comment said ll is using the opcode for lwc0 and sc the opcode
> for swc0 so the expected behaviour of an attempt to execute ll or sc on a
> ll/sc-less processor is throwing a coprocessor unusable exception, not
> reserved exception.
> 
> So if the VR4100 series is indeed throwing RI exceptions then this processor
> is plain broken.  Will fix but not without cursing into NEC's direction.
> 
> Grr...

In addition, the attached patches are still required for NEC VR4100 series.
Please apply these patches.

Yoichi
diff -aruN --exclude=CVS --exclude=.cvsignore linux.orig/arch/mips/kernel/cpu-probe.c linux/arch/mips/kernel/cpu-probe.c
--- linux.orig/arch/mips/kernel/cpu-probe.c	Thu Apr 17 12:30:25 2003
+++ linux/arch/mips/kernel/cpu-probe.c	Mon Apr 21 12:30:05 2003
@@ -244,7 +244,7 @@
 				break;
 			}
                         current_cpu_data.isa_level = MIPS_CPU_ISA_III;
-                        current_cpu_data.options = R4K_OPTS | MIPS_CPU_LLSC;
+                        current_cpu_data.options = R4K_OPTS;
                         current_cpu_data.tlbsize = 32;
                         break;
 		case PRID_IMP_R4300:
diff -aruN --exclude=CVS --exclude=.cvsignore linux.orig/arch/mips/kernel/proc.c linux/arch/mips/kernel/proc.c
--- linux.orig/arch/mips/kernel/proc.c	Wed Apr 16 12:51:18 2003
+++ linux/arch/mips/kernel/proc.c	Mon Apr 21 12:24:00 2003
@@ -71,6 +71,10 @@
 	[CPU_VR4181A]	"NEC VR4181A"
 };
 
+#ifndef CONFIG_CPU_HAS_LLSC
+extern unsigned long ll_ops;
+extern unsigned long sc_ops;
+#endif
 
 static int show_cpuinfo(struct seq_file *m, void *v)
 {
diff -aruN --exclude=CVS --exclude=.cvsignore linux.orig/arch/mips/kernel/traps.c linux/arch/mips/kernel/traps.c
--- linux.orig/arch/mips/kernel/traps.c	Mon Apr 21 10:56:54 2003
+++ linux/arch/mips/kernel/traps.c	Mon Apr 21 12:39:25 2003
@@ -405,8 +405,8 @@
  * For now we don't have a mechanism to dump these variables to
  * /procfs anymore ...
  */
-static unsigned long ll_ops;
-static unsigned long sc_ops;
+unsigned long ll_ops;
+unsigned long sc_ops;
 #endif
 
 static struct task_struct *ll_task = NULL;
@@ -521,11 +521,11 @@
 
 	if ((opcode & OPCODE) == LL) {
 		simulate_ll(regs, opcode);
-		return;
+		return 0;
 	}
 	if ((opcode & OPCODE) == SC) {
 		simulate_sc(regs, opcode);
-		return;
+		return 0;
 	}
 }
 
diff -aruN --exclude=CVS --exclude=.cvsignore linux.orig/arch/mips/kernel/cpu-probe.c linux/arch/mips/kernel/cpu-probe.c
--- linux.orig/arch/mips/kernel/cpu-probe.c	Thu Apr 17 12:31:41 2003
+++ linux/arch/mips/kernel/cpu-probe.c	Mon Apr 21 18:28:51 2003
@@ -244,7 +244,7 @@
 				break;
 			}
                         current_cpu_data.isa_level = MIPS_CPU_ISA_III;
-                        current_cpu_data.options = R4K_OPTS | MIPS_CPU_LLSC;
+                        current_cpu_data.options = R4K_OPTS;
                         current_cpu_data.tlbsize = 32;
                         break;
 		case PRID_IMP_R4300:
diff -aruN --exclude=CVS --exclude=.cvsignore linux.orig/arch/mips/kernel/proc.c linux/arch/mips/kernel/proc.c
--- linux.orig/arch/mips/kernel/proc.c	Wed Apr 16 12:52:27 2003
+++ linux/arch/mips/kernel/proc.c	Mon Apr 21 18:29:29 2003
@@ -71,6 +71,10 @@
 	[CPU_VR4181A]	"NEC VR4181A"
 };
 
+#ifndef CONFIG_CPU_HAS_LLSC
+extern unsigned long ll_ops;
+extern unsigned long sc_ops;
+#endif
 
 static int show_cpuinfo(struct seq_file *m, void *v)
 {
diff -aruN --exclude=CVS --exclude=.cvsignore linux.orig/arch/mips/kernel/traps.c linux/arch/mips/kernel/traps.c
--- linux.orig/arch/mips/kernel/traps.c	Mon Apr 21 10:59:49 2003
+++ linux/arch/mips/kernel/traps.c	Mon Apr 21 18:30:15 2003
@@ -400,8 +400,8 @@
  * For now we don't have a mechanism to dump these variables to
  * /procfs anymore ...
  */
-static unsigned long ll_ops;
-static unsigned long sc_ops;
+unsigned long ll_ops;
+unsigned long sc_ops;
 #endif
 
 static struct task_struct *ll_task = NULL;
@@ -516,11 +516,11 @@
 
 	if ((opcode & OPCODE) == LL) {
 		simulate_ll(regs, opcode);
-		return;
+		return 0;
 	}
 	if ((opcode & OPCODE) == SC) {
 		simulate_sc(regs, opcode);
-		return;
+		return 0;
 	}
 }
 

[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux