[kernel] r7677 - dists/trunk/linux-2.6/debian/patches/bugfix/powerpc

Sven Luther luther at alioth.debian.org
Wed Nov 1 22:34:14 CET 2006


Author: luther
Date: Wed Nov  1 22:34:14 2006
New Revision: 7677

Modified:
   dists/trunk/linux-2.6/debian/patches/bugfix/powerpc/interrupt-alignement.patch
Log:
Updated powerpc interrupt alignement patch.


Modified: dists/trunk/linux-2.6/debian/patches/bugfix/powerpc/interrupt-alignement.patch
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/bugfix/powerpc/interrupt-alignement.patch	(original)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/powerpc/interrupt-alignement.patch	Wed Nov  1 22:34:14 2006
@@ -1,37 +1,92 @@
 # Fixes exceptions alignement. 
 # Author: Benjamin Herrenschmidt benh at kernel.crashing.org 
-# Reference: http://ozlabs.org/pipermail/linuxppc-dev/2006-October/027374.html
+# Reference: http://ozlabs.org/pipermail/linuxppc-dev/2006-November/027453.html
 # Upstream: will be pushed upstream.
 
+The alignment exception used to only check the exception table for
+-EFAULT, not for other errors. That opens an oops window if we can
+coerce the kernel into getting an alignment exception for other reasons
+in what would normally be a user-protected accessor, which can be done
+via some of the futex ops. This fixes it by always checking the
+exception tables.
+
+Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
+---
+
+Paul: this version sets the correct si_code
+
+This is 2.6.19 material and should probably go into stable as well.
+(Greg: take it if paulus acks it and it applies :)
+
 Index: linux-work/arch/powerpc/kernel/traps.c
 ===================================================================
---- linux-work.orig/arch/powerpc/kernel/traps.c	2006-10-23 14:41:37.000000000 +1000
-+++ linux-work/arch/powerpc/kernel/traps.c	2006-10-30 13:59:41.000000000 +1100
+--- linux-work.orig/arch/powerpc/kernel/traps.c	2006-11-01 14:59:07.000000000 +1100
++++ linux-work/arch/powerpc/kernel/traps.c	2006-11-01 15:01:06.000000000 +1100
 @@ -843,7 +843,7 @@ void __kprobes program_check_exception(s
  
  void alignment_exception(struct pt_regs *regs)
  {
 -	int fixed = 0;
-+	int sig, fixed = 0;
++	int sig, code, fixed = 0;
  
  	/* we don't implement logging of alignment exceptions */
  	if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS))
-@@ -856,15 +856,11 @@ void alignment_exception(struct pt_regs 
- 	}
+@@ -857,14 +857,16 @@ void alignment_exception(struct pt_regs 
  
  	/* Operand address was bad */
--	if (fixed == -EFAULT) {
+ 	if (fixed == -EFAULT) {
 -		if (user_mode(regs))
 -			_exception(SIGSEGV, regs, SEGV_ACCERR, regs->dar);
 -		else
 -			/* Search exception table */
 -			bad_page_fault(regs, regs->dar, SIGSEGV);
 -		return;
--	}
++		sig = SIGSEGV;
++		code = SEGV_ACCERR;
++	} else {
++		sig = SIGBUS;
++		code = BUS_ADRALN;
+ 	}
+-	_exception(SIGBUS, regs, BUS_ADRALN, regs->dar);
++	if (user_mode(regs))
++		_exception(sig, regs, code, regs->dar);
++	else
++		bad_page_fault(regs, regs->dar, sig);
+ }
+ 
+ void StackOverflow(struct pt_regs *regs)
+Index: linux-work/arch/ppc/kernel/traps.c
+===================================================================
+--- linux-work.orig/arch/ppc/kernel/traps.c	2006-11-01 14:59:07.000000000 +1100
++++ linux-work/arch/ppc/kernel/traps.c	2006-11-01 15:01:32.000000000 +1100
+@@ -708,7 +708,7 @@ void single_step_exception(struct pt_reg
+ 
+ void alignment_exception(struct pt_regs *regs)
+ {
+-	int fixed;
++	int sig, code, fixed = 0;
+ 
+ 	fixed = fix_alignment(regs);
+ 	if (fixed == 1) {
+@@ -717,14 +717,16 @@ void alignment_exception(struct pt_regs 
+ 		return;
+ 	}
+ 	if (fixed == -EFAULT) {
+-		/* fixed == -EFAULT means the operand address was bad */
+-		if (user_mode(regs))
+-			_exception(SIGSEGV, regs, SEGV_ACCERR, regs->dar);
+-		else
+-			bad_page_fault(regs, regs->dar, SIGSEGV);
+-		return;
++		sig = SIGSEGV;
++		code = SEGV_ACCERR;
++	} else {
++		sig = SIGBUS;
++		code = BUS_ADRALN;
+ 	}
 -	_exception(SIGBUS, regs, BUS_ADRALN, regs->dar);
-+	sig = fixed == -EFAULT ? SIGSEGV : SIGBUS;
 +	if (user_mode(regs))
-+		_exception(sig, regs, SEGV_ACCERR, regs->dar);
++		_exception(sig, regs, code, regs->dar);
 +	else
 +		bad_page_fault(regs, regs->dar, sig);
  }



More information about the Kernel-svn-changes mailing list