kernel: refresh patches against 3.9-rc6

Signed-off-by: Florian Fainelli <florian@openwrt.org>

SVN-Revision: 36297
This commit is contained in:
Florian Fainelli 2013-04-09 16:16:20 +00:00
parent c3366cd164
commit 915969ff2c
12 changed files with 18 additions and 388 deletions

View file

@ -1,368 +0,0 @@
From f9b4e05597e636a550af8392e80b15f79d9f9e11 Mon Sep 17 00:00:00 2001
From: Florian Fainelli <florian@openwrt.org>
Date: Thu, 14 Mar 2013 14:07:20 +0100
Subject: [PATCH] MIPS: fix code generation for non-DSP capable CPUs
Commit 32a7ede (MIPS: dsp: Add assembler support for DSP ASEs) has
enabled the use of DSP ASE specific instructions such as rddsp and wrdsp
under the idea that all code path that will make use of these two
instructions are properly checking for cpu_has_dsp to ensure that the
particular CPU we are running on *actually* supports DSP ASE.
This commit actually causes the following oops on QEMU Malta emulating a
MIPS 24Kc without the DSP ASE implemented:
[ 7.960000] Reserved instruction in kernel
[ 7.960000] Cpu 0
[ 7.960000] $ 0 : 00000000 00000000 00000014 00000005
[ 7.960000] $ 4 : 8fc2de48 00000001 00000000 8f59ddb0
[ 7.960000] $ 8 : 8f5ceec4 00000018 00000c00 00800000
[ 7.960000] $12 : 00000100 00000200 00000000 00457b84
[ 7.960000] $16 : 00000000 8fc2ba78 8f4ec980 00000001
[ 7.960000] $20 : 80418f90 00000000 00000000 000002dd
[ 7.960000] $24 : 0000009c 7730d7b8
[ 7.960000] $28 : 8f59c000 8f59dd38 00000001 80104248
[ 7.960000] Hi : 0000001d
[ 7.960000] Lo : 0000000b
[ 7.960000] epc : 801041ec thread_saved_pc+0x2c/0x38
[ 7.960000] Not tainted
[ 7.960000] ra : 80104248 get_wchan+0x48/0xac
[ 7.960000] Status: 1000b703 KERNEL EXL IE
[ 7.960000] Cause : 10800028
[ 7.960000] PrId : 00019300 (MIPS 24Kc)
[ 7.960000] Modules linked in:
[ 7.960000] Process killall (pid: 1574, threadinfo=8f59c000,
task=8fd14558, tls=773aa440)
[ 7.960000] Stack : 8fc2ba78 8012b008 0000000c 0000001d 00000000
00000000 8f58a380
8f58a380 8fc2ba78 80202668 8f59de78 8f468600 8f59de28
801b2a3c 8f59df00 8f98ba20 74696e69
8f468600 8f59de28 801b7308 0081c007 00000000 00000000
00000000 00000000 00000000 00000000
00000000 8fc2bbb4 00000001 0000001d 0000000b 77f038cc
7fe80648 ffffffff ffffffff 00000000
00000001 0016e000 00000000 ...
[ 7.960000] Call Trace:
[ 7.960000] [<801041ec>] thread_saved_pc+0x2c/0x38
[ 7.960000] [<80104248>] get_wchan+0x48/0xac
The disassembly of thread_saved_pc points to the following:
000006d0 <thread_saved_pc>:
6d0: 8c820208 lw v0,520(a0)
6d4: 3c030000 lui v1,0x0
6d8: 24630000 addiu v1,v1,0
6dc: 10430008 beq v0,v1,700 <thread_saved_pc+0x30>
6e0: 00000000 nop
6e4: 3c020000 lui v0,0x0
6e8: 8c43000c lw v1,12(v0)
6ec: 04620004 bltzl v1,700 <thread_saved_pc+0x30>
6f0: 00001021 move v0,zero
6f4: 8c840200 lw a0,512(a0)
6f8: 00031080 sll v0,v1,0x2
6fc: 7c44100a lwx v0,a0(v0) <------------
700: 03e00008 jr ra
704: 00000000 nop
If we specifically disable -mdsp/-mdspr2 for arch/mips/kernel/process.o,
we get the following (non-crashing) assembly:
00000708 <thread_saved_pc>:
708: 8c820208 lw v0,520(a0)
70c: 3c030000 lui v1,0x0
710: 24630000 addiu v1,v1,0
714: 10430009 beq v0,v1,73c <thread_saved_pc+0x34>
718: 00000000 nop
71c: 3c020000 lui v0,0x0
720: 8c42000c lw v0,12(v0)
724: 04420005 bltzl v0,73c <thread_saved_pc+0x34>
728: 00001021 move v0,zero
72c: 8c830200 lw v1,512(a0)
730: 00021080 sll v0,v0,0x2
734: 00431021 addu v0,v0,v1
738: 8c420000 lw v0,0(v0)
73c: 03e00008 jr ra
740: 00000000 nop
The specific line that leads a different assembly being produced is:
unsigned long thread_saved_pc(struct task_struct *tsk)
...
return ((unsigned long *)t->reg29)[schedule_mfi.pc_offset]; <---
The problem here is that the compiler was given the right to use DSP
instructions with the -mdsp / -mdspr2 command-line switches and
performed some optimization for us and used DSP ASE instructions where
we are not checking that the running CPU actually supports DSP ASE.
This patch fixes the issue by partially reverting commit 32a7ede for
arch/mips/kernel/Makefile in order to remove the -mdsp / -mdspr2
compiler command-line switches such that we are now guaranteed that the
compiler will not optimize using DSP ASE reserved instructions. We also
need to fixup the rddsp/wrdsp and m{t,h}{hi,lo}{0,1,2,3} macros in
arch/mips/include/asm/mipsregs.h to tell the assembler that we are going
to explicitely use DSP ASE reserved instructions.
Signed-off-by: Florian Fainelli <florian@openwrt.org>
---
Ralf, John,
This should be part of your 3.9-rc3 pull request if I may ;)
arch/mips/include/asm/mipsregs.h | 209 ++++++++++++++++++++++++++++++++++----
arch/mips/kernel/Makefile | 14 ---
2 files changed, 190 insertions(+), 33 deletions(-)
--- a/arch/mips/include/asm/mipsregs.h
+++ b/arch/mips/include/asm/mipsregs.h
@@ -1166,7 +1166,10 @@ do { \
unsigned int __dspctl; \
\
__asm__ __volatile__( \
+ " .set push \n" \
+ " .set dsp \n" \
" rddsp %0, %x1 \n" \
+ " .set pop \n" \
: "=r" (__dspctl) \
: "i" (mask)); \
__dspctl; \
@@ -1175,30 +1178,198 @@ do { \
#define wrdsp(val, mask) \
do { \
__asm__ __volatile__( \
+ " .set push \n" \
+ " .set dsp \n" \
" wrdsp %0, %x1 \n" \
+ " .set pop \n" \
: \
: "r" (val), "i" (mask)); \
} while (0)
-#define mflo0() ({ long mflo0; __asm__("mflo %0, $ac0" : "=r" (mflo0)); mflo0;})
-#define mflo1() ({ long mflo1; __asm__("mflo %0, $ac1" : "=r" (mflo1)); mflo1;})
-#define mflo2() ({ long mflo2; __asm__("mflo %0, $ac2" : "=r" (mflo2)); mflo2;})
-#define mflo3() ({ long mflo3; __asm__("mflo %0, $ac3" : "=r" (mflo3)); mflo3;})
-
-#define mfhi0() ({ long mfhi0; __asm__("mfhi %0, $ac0" : "=r" (mfhi0)); mfhi0;})
-#define mfhi1() ({ long mfhi1; __asm__("mfhi %0, $ac1" : "=r" (mfhi1)); mfhi1;})
-#define mfhi2() ({ long mfhi2; __asm__("mfhi %0, $ac2" : "=r" (mfhi2)); mfhi2;})
-#define mfhi3() ({ long mfhi3; __asm__("mfhi %0, $ac3" : "=r" (mfhi3)); mfhi3;})
-
-#define mtlo0(x) __asm__("mtlo %0, $ac0" ::"r" (x))
-#define mtlo1(x) __asm__("mtlo %0, $ac1" ::"r" (x))
-#define mtlo2(x) __asm__("mtlo %0, $ac2" ::"r" (x))
-#define mtlo3(x) __asm__("mtlo %0, $ac3" ::"r" (x))
-
-#define mthi0(x) __asm__("mthi %0, $ac0" ::"r" (x))
-#define mthi1(x) __asm__("mthi %0, $ac1" ::"r" (x))
-#define mthi2(x) __asm__("mthi %0, $ac2" ::"r" (x))
-#define mthi3(x) __asm__("mthi %0, $ac3" ::"r" (x))
+#define mflo0() \
+({ \
+ long mflo0; \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mflo %0, $ac0 \n" \
+ " .set pop \n" \
+ : "=r" (mflo0)); \
+ mflo0; \
+})
+
+#define mflo1() \
+({ \
+ long mflo1; \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mflo %0, $ac1 \n" \
+ " .set pop \n" \
+ : "=r" (mflo1)); \
+ mflo1; \
+})
+
+#define mflo2() \
+({ \
+ long mflo2; \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mflo %0, $ac2 \n" \
+ " .set pop \n" \
+ : "=r" (mflo2)); \
+ mflo2; \
+})
+
+#define mflo3() \
+({ \
+ long mflo3; \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mflo %0, $ac3 \n" \
+ " .set pop \n" \
+ : "=r" (mflo3)); \
+ mflo3; \
+})
+
+#define mfhi0() \
+({ \
+ long mfhi0; \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mfhi %0, $ac0 \n" \
+ " .set pop \n" \
+ : "=r" (mfhi0)); \
+ mfhi0; \
+})
+
+#define mfhi1() \
+({ \
+ long mfhi1; \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mfhi %0, $ac1 \n" \
+ " .set pop \n" \
+ : "=r" (mfhi1)); \
+ mfhi1; \
+})
+
+#define mfhi2() \
+({ \
+ long mfhi2; \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mfhi %0, $ac2 \n" \
+ " .set pop \n" \
+ : "=r" (mfhi2)); \
+ mfhi2; \
+})
+
+#define mfhi3() \
+({ \
+ long mfhi3; \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mfhi %0, $ac3 \n" \
+ " .set pop \n" \
+ : "=r" (mfhi3)); \
+ mfhi3; \
+})
+
+
+#define mtlo0(x) \
+({ \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mtlo %0, $ac0 \n" \
+ " .set pop \n" \
+ : \
+ : "r" (x)); \
+})
+
+#define mtlo1(x) \
+({ \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mtlo %0, $ac1 \n" \
+ " .set pop \n" \
+ : \
+ : "r" (x)); \
+})
+
+#define mtlo2(x) \
+({ \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mtlo %0, $ac2 \n" \
+ " .set pop \n" \
+ : \
+ : "r" (x)); \
+})
+
+#define mtlo3(x) \
+({ \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mtlo %0, $ac3 \n" \
+ " .set pop \n" \
+ : \
+ : "r" (x)); \
+})
+
+#define mthi0(x) \
+({ \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mthi %0, $ac0 \n" \
+ " .set pop \n" \
+ : \
+ : "r" (x)); \
+})
+
+#define mthi1(x) \
+({ \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mthi %0, $ac1 \n" \
+ " .set pop \n" \
+ : \
+ : "r" (x)); \
+})
+
+#define mthi2(x) \
+({ \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mthi %0, $ac2 \n" \
+ " .set pop \n" \
+ : \
+ : "r" (x)); \
+})
+
+#define mthi3(x) \
+({ \
+ __asm__( \
+ " .set push \n" \
+ " .set dsp \n" \
+ " mthi %0, $ac3 \n" \
+ " .set pop \n" \
+ : \
+ : "r" (x)); \
+})
#else
--- a/arch/mips/kernel/Makefile
+++ b/arch/mips/kernel/Makefile
@@ -109,20 +109,6 @@ obj-$(CONFIG_JUMP_LABEL) += jump_label.o
ifeq ($(CONFIG_CPU_MIPSR2), y)
CFLAGS_DSP = -DHAVE_AS_DSP
-#
-# Check if assembler supports DSP ASE
-#
-ifeq ($(call cc-option-yn,-mdsp), y)
-CFLAGS_DSP += -mdsp
-endif
-
-#
-# Check if assembler supports DSP ASE Rev2
-#
-ifeq ($(call cc-option-yn,-mdspr2), y)
-CFLAGS_DSP += -mdspr2
-endif
-
CFLAGS_signal.o = $(CFLAGS_DSP)
CFLAGS_signal32.o = $(CFLAGS_DSP)
CFLAGS_process.o = $(CFLAGS_DSP)

View file

@ -243,7 +243,7 @@
will be called when part or all of the page is to be removed will be called when part or all of the page is to be removed
--- a/MAINTAINERS --- a/MAINTAINERS
+++ b/MAINTAINERS +++ b/MAINTAINERS
@@ -5905,6 +5905,13 @@ F: drivers/scsi/osd/ @@ -5911,6 +5911,13 @@ F: drivers/scsi/osd/
F: include/scsi/osd_* F: include/scsi/osd_*
F: fs/exofs/ F: fs/exofs/
@ -335,7 +335,7 @@
goto out; goto out;
--- a/fs/namespace.c --- a/fs/namespace.c
+++ b/fs/namespace.c +++ b/fs/namespace.c
@@ -1399,6 +1399,24 @@ void drop_collected_mounts(struct vfsmou @@ -1403,6 +1403,24 @@ void drop_collected_mounts(struct vfsmou
release_mounts(&umount_list); release_mounts(&umount_list);
} }
@ -3118,7 +3118,7 @@
+module_exit(ovl_exit); +module_exit(ovl_exit);
--- a/fs/splice.c --- a/fs/splice.c
+++ b/fs/splice.c +++ b/fs/splice.c
@@ -1308,6 +1308,7 @@ long do_splice_direct(struct file *in, l @@ -1310,6 +1310,7 @@ long do_splice_direct(struct file *in, l
return ret; return ret;
} }
@ -3179,7 +3179,7 @@
static inline bool execute_ok(struct inode *inode) static inline bool execute_ok(struct inode *inode)
--- a/include/linux/mount.h --- a/include/linux/mount.h
+++ b/include/linux/mount.h +++ b/include/linux/mount.h
@@ -66,6 +66,9 @@ extern void mnt_pin(struct vfsmount *mnt @@ -68,6 +68,9 @@ extern void mnt_pin(struct vfsmount *mnt
extern void mnt_unpin(struct vfsmount *mnt); extern void mnt_unpin(struct vfsmount *mnt);
extern int __mnt_is_readonly(struct vfsmount *mnt); extern int __mnt_is_readonly(struct vfsmount *mnt);

View file

@ -64,7 +64,7 @@
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/rbtree.h> #include <linux/rbtree.h>
@@ -1777,3 +1778,5 @@ static int __init regmap_initcall(void) @@ -1778,3 +1779,5 @@ static int __init regmap_initcall(void)
return 0; return 0;
} }
postcore_initcall(regmap_initcall); postcore_initcall(regmap_initcall);

View file

@ -18,7 +18,7 @@ Acked-by: Rob Landley <rob@landley.net>
config CEVT_BCM1480 config CEVT_BCM1480
bool bool
@@ -2362,6 +2359,18 @@ config USE_OF @@ -2361,6 +2358,18 @@ config USE_OF
select OF_EARLY_FLATTREE select OF_EARLY_FLATTREE
select IRQ_DOMAIN select IRQ_DOMAIN

View file

@ -106,7 +106,7 @@
{ {
--- a/block/partition-generic.c --- a/block/partition-generic.c
+++ b/block/partition-generic.c +++ b/block/partition-generic.c
@@ -548,6 +548,7 @@ int invalidate_partitions(struct gendisk @@ -549,6 +549,7 @@ int invalidate_partitions(struct gendisk
return 0; return 0;
} }

View file

@ -1,6 +1,6 @@
--- a/drivers/mtd/devices/m25p80.c --- a/drivers/mtd/devices/m25p80.c
+++ b/drivers/mtd/devices/m25p80.c +++ b/drivers/mtd/devices/m25p80.c
@@ -682,6 +682,7 @@ @@ -768,6 +768,7 @@ static const struct spi_device_id m25p_i
/* PMC -- pm25x "blocks" are 32K, sectors are 4K */ /* PMC -- pm25x "blocks" are 32K, sectors are 4K */
{ "pm25lv512", INFO(0, 0, 32 * 1024, 2, SECT_4K_PMC) }, { "pm25lv512", INFO(0, 0, 32 * 1024, 2, SECT_4K_PMC) },
{ "pm25lv010", INFO(0, 0, 32 * 1024, 4, SECT_4K_PMC) }, { "pm25lv010", INFO(0, 0, 32 * 1024, 4, SECT_4K_PMC) },

View file

@ -30,7 +30,7 @@
/****************************************************************************/ /****************************************************************************/
struct m25p { struct m25p {
@@ -1017,7 +1023,7 @@ static int m25p_probe(struct spi_device @@ -1018,7 +1024,7 @@ static int m25p_probe(struct spi_device
flash->mtd._write = m25p80_write; flash->mtd._write = m25p80_write;
/* prefer "small sector" erase if possible */ /* prefer "small sector" erase if possible */

View file

@ -49,7 +49,7 @@
int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr, int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr,
unsigned char banned_flags) unsigned char banned_flags)
@@ -4944,6 +4943,9 @@ int __init addrconf_init(void) @@ -4965,6 +4964,9 @@ int __init addrconf_init(void)
ipv6_addr_label_rtnl_register(); ipv6_addr_label_rtnl_register();
@ -59,7 +59,7 @@
return 0; return 0;
errout: errout:
rtnl_af_unregister(&inet6_ops); rtnl_af_unregister(&inet6_ops);
@@ -4962,6 +4964,9 @@ void addrconf_cleanup(void) @@ -4983,6 +4985,9 @@ void addrconf_cleanup(void)
struct net_device *dev; struct net_device *dev;
int i; int i;

View file

@ -79,7 +79,7 @@
help help
--- a/net/core/dev.c --- a/net/core/dev.c
+++ b/net/core/dev.c +++ b/net/core/dev.c
@@ -2530,9 +2530,19 @@ int dev_hard_start_xmit(struct sk_buff * @@ -2529,9 +2529,19 @@ int dev_hard_start_xmit(struct sk_buff *
if (!list_empty(&ptype_all)) if (!list_empty(&ptype_all))
dev_queue_xmit_nit(skb, dev); dev_queue_xmit_nit(skb, dev);
@ -102,7 +102,7 @@
if (rc == NETDEV_TX_OK) if (rc == NETDEV_TX_OK)
txq_trans_update(txq); txq_trans_update(txq);
return rc; return rc;
@@ -2555,9 +2565,19 @@ gso: @@ -2554,9 +2564,19 @@ gso:
if (!list_empty(&ptype_all)) if (!list_empty(&ptype_all))
dev_queue_xmit_nit(nskb, dev); dev_queue_xmit_nit(nskb, dev);

View file

@ -345,7 +345,7 @@ Please use the new mainline SPI-GPIO driver, as of 2.6.29.
+MODULE_LICENSE("GPL v2"); +MODULE_LICENSE("GPL v2");
--- a/drivers/spi/Kconfig --- a/drivers/spi/Kconfig
+++ b/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig
@@ -177,6 +177,15 @@ config SPI_GPIO @@ -178,6 +178,15 @@ config SPI_GPIO
GPIO operations, you should be able to leverage that for better GPIO operations, you should be able to leverage that for better
speed with a custom version of this driver; see the source code. speed with a custom version of this driver; see the source code.

View file

@ -830,7 +830,7 @@
+be done automatically. +be done automatically.
--- a/MAINTAINERS --- a/MAINTAINERS
+++ b/MAINTAINERS +++ b/MAINTAINERS
@@ -3600,6 +3600,11 @@ L: linuxppc-dev@lists.ozlabs.org @@ -3606,6 +3606,11 @@ L: linuxppc-dev@lists.ozlabs.org
S: Odd Fixes S: Odd Fixes
F: drivers/tty/hvc/ F: drivers/tty/hvc/

View file

@ -1,8 +1,6 @@
Index: linux-3.8.3/init/main.c --- a/init/main.c
=================================================================== +++ b/init/main.c
--- linux-3.8.3.orig/init/main.c 2013-04-02 21:43:30.000000000 +0200 @@ -848,7 +848,8 @@ static int __ref kernel_init(void *unuse
+++ linux-3.8.3/init/main.c 2013-04-02 21:44:26.362130897 +0200
@@ -835,7 +835,8 @@
printk(KERN_WARNING "Failed to execute %s. Attempting " printk(KERN_WARNING "Failed to execute %s. Attempting "
"defaults...\n", execute_command); "defaults...\n", execute_command);
} }