diff --git a/debian/changelog b/debian/changelog index 3f9094a63..29ab058a6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -13,6 +13,7 @@ linux-2.6 (2.6.15+2.6.16-rc6-0experimental.1) UNRELEASED; urgency=low * [mips] SB1: Support for 1480 ethernet (Broadcom). * [mips] SB1: Support for NAPI (Tom Rix). * [mips] SB1: DUART support (Broadcom). + * [mips] Work around bad code generation for (Ralf Baechle). [ dann frazier ] * [ia64] use yaird on ia64 until #341181 is fixed diff --git a/debian/patches/mips-io-bad-code.patch b/debian/patches/mips-io-bad-code.patch new file mode 100644 index 000000000..e37f09e1c --- /dev/null +++ b/debian/patches/mips-io-bad-code.patch @@ -0,0 +1,59 @@ +From: linux-mips@linux-mips.org +Date: Wed, 15 Mar 2006 11:28:15 +0000 +To: git-commits@linux-mips.org +Subject: [MIPS] Work around bad code generation for . + +Author: Ralf Baechle Wed Mar 15 11:36:31 2006 +0000 +Commit: 6a186683e0a3d51836b6ef6b971508861c7002b5 +Gitweb: http://www.linux-mips.org/g/linux/6a186683 +Branch: master + +If a call to set_io_port_base() was being followed by usage of +mips_io_port_base in the same function gcc was possibly using the old +value due to some clever abuse of const. Adding a barrier will keep +the optimization and result in correct code with latest gcc. + +Signed-off-by: Ralf Baechle + +--- + + include/asm-mips/io.h | 18 +++++++++++++++--- + 1 files changed, 15 insertions(+), 3 deletions(-) + +diff --git a/include/asm-mips/io.h b/include/asm-mips/io.h +index 5c6d6ab..02995ad 100644 +--- a/include/asm-mips/io.h ++++ b/include/asm-mips/io.h +@@ -4,7 +4,7 @@ + * for more details. + * + * Copyright (C) 1994, 1995 Waldorf GmbH +- * Copyright (C) 1994 - 2000 Ralf Baechle ++ * Copyright (C) 1994 - 2000, 06 Ralf Baechle + * Copyright (C) 1999, 2000 Silicon Graphics, Inc. + * Copyright (C) 2004, 2005 MIPS Technologies, Inc. All rights reserved. + * Author: Maciej W. Rozycki +@@ -103,8 +103,20 @@ + */ + extern const unsigned long mips_io_port_base; + +-#define set_io_port_base(base) \ +- do { * (unsigned long *) &mips_io_port_base = (base); } while (0) ++/* ++ * Gcc will generate code to load the value of mips_io_port_base after each ++ * function call which may be fairly wasteful in some cases. So we don't ++ * play quite by the book. We tell gcc mips_io_port_base is a long variable ++ * which solves the code generation issue. Now we need to violate the ++ * aliasing rules a little to make initialization possible and finally we ++ * will need the barrier() to fight side effects of the aliasing chat. ++ * This trickery will eventually collapse under gcc's optimizer. Oh well. ++ */ ++static inline void set_io_port_base(unsigned long base) ++{ ++ * (unsigned long *) &mips_io_port_base; ++ barrier(); ++} + + /* + * Thanks to James van Artsdalen for a better timing-fix than + diff --git a/debian/patches/series/0experimental.1 b/debian/patches/series/0experimental.1 index fedc82d50..7561fa614 100644 --- a/debian/patches/series/0experimental.1 +++ b/debian/patches/series/0experimental.1 @@ -23,5 +23,6 @@ + mips-sb1-eth-1480.patch + mips-sb1-eth-napi.patch + mips-sb1-duart.patch ++ mips-io-bad-code.patch + s390-drivers-ccw-uevent-modalias.patch + s390-drivers-ccw-uevent-cleanup.patch