patch-2.4.10 linux/arch/mips64/kernel/entry.S

Next file: linux/arch/mips64/kernel/init_task.c
Previous file: linux/arch/mips64/kernel/binfmt_elf32.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.9/linux/arch/mips64/kernel/entry.S linux/arch/mips64/kernel/entry.S
@@ -5,8 +5,9 @@
  *
  * Low level exception handling
  *
- * Copyright (C) 1994 - 2000 by Ralf Baechle
+ * Copyright (C) 1994 - 2000, 2001 Ralf Baechle
  * Copyright (C) 1999, 2000 Silicon Graphics
+ * Copyright (C) 2001 MIPS Technologies, Inc.
  */
 #include <linux/config.h>
 
@@ -15,53 +16,61 @@
 #include <asm/mipsregs.h>
 #include <asm/stackframe.h>
 
+/* This duplicates the definition from <linux/sched.h> */
+#define PT_TRACESYS	0x00000002		/* tracing system calls */
+
+#define KU_USER 0x10
+
 		.text
-		.set	noreorder
 		.align 4
 FEXPORT(ret_from_fork)
+		move	a0, v0			# prev
 		jal	schedule_tail
-		 move	a0, v0					# prev
+		lw	t0, TASK_PTRACE($28)	# syscall tracing enabled?
+		andi	t0, PT_TRACESYS
+		bnez	t0, tracesys_exit
 		j	ret_from_sys_call
-		 nop
-FEXPORT(handle_softirq)
-		jal	do_softirq
-		 nop
-		b	9f
-		 nop
+
+tracesys_exit:
+		jal	syscall_trace
+		b	ret_from_sys_call
+
+EXPORT(ret_from_irq)
+EXPORT(ret_from_exception)
+		lw	t0, PT_STATUS(sp)	# returning to kernel mode?
+		andi	t0, t0, KU_USER
+		bnez	t0, ret_from_sys_call
+		j	restore_all
 
 reschedule:	jal	schedule 
-		 nop
 
 FEXPORT(ret_from_sys_call)
-FEXPORT(ret_from_irq)
-		la	t1, irq_stat		# softirq_active
-#ifdef CONFIG_SMP
-		lwu	t0, TASK_PROCESSOR($28)
-		dsll	t0, t0, 5
-		daddu	t1, t0
-#endif
-		lw	t0, 0 (t1)		# softirq_active
-		lw	t1, 4 (t1)		# softirq_mask.  unused delay slot
-		and	t0, t1
-		bnez	t0, handle_softirq
-9:		 ld	t0, PT_STATUS(sp)	# returning to kernel mode?
-
-		andi	t1, t0, 0x10
-		beqz	t1, return		# -> yes
-		 ld	t1, TASK_NEED_RESCHED($28)
-		bnez	t1, reschedule
-		lw	v0, TASK_SIGPENDING($28)
-		 move	a0, zero
-		beqz	v0, return
-		 nop
-		jal	do_signal
-		 move	a1, sp
+		mfc0	t0, CP0_STATUS	# need_resched and signals atomic test
+		ori	t0, t0, 1
+		xori	t0, t0, 1
+		mtc0	t0, CP0_STATUS
+
+		ld	v0, TASK_NEED_RESCHED($28)
+		lw	v1, TASK_SIGPENDING($28)
+		bnez	v0, reschedule
+		bnez	v1, signal_return
 
-FEXPORT(return)	.set	noat
+restore_all:	.set	noat
 		RESTORE_ALL
 		eret
 		.set	at
 
+signal_return:	.type	signal_return, @function
+
+		mfc0	t0, CP0_STATUS
+		ori	t0, t0, 1
+		mtc0	t0, CP0_STATUS
+
+		move	a0, zero
+		move	a1, sp
+		jal	do_signal
+		b	restore_all
+
 /*
  * Common spurious interrupt handler.
  */
@@ -75,6 +84,6 @@
 		lui     t1,%hi(spurious_count)
 		lw      t0,%lo(spurious_count)(t1)
 		addiu   t0,1
+		sw      t0,%lo(spurious_count)(t1)
 		j	ret_from_irq
-		 sw      t0,%lo(spurious_count)(t1)
 		END(spurious_interrupt)

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)