From aa1144ff37d7a35649aa6e37fb3d6899f3880ee9 Mon Sep 17 00:00:00 2001 From: Matteo Croce Date: Mon, 17 Sep 2007 12:45:38 +0000 Subject: [PATCH] detect ar7 at runtime in set_except_vector and remove useless volatile SVN-Revision: 8824 --- .../patches-2.6.22/100-board_support.patch | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/target/linux/ar7/patches-2.6.22/100-board_support.patch b/target/linux/ar7/patches-2.6.22/100-board_support.patch index 0297ef651f..c7ea6cc2ae 100644 --- a/target/linux/ar7/patches-2.6.22/100-board_support.patch +++ b/target/linux/ar7/patches-2.6.22/100-board_support.patch @@ -26,31 +26,35 @@ diff -urN linux-2.6.22/arch/mips/Kconfig linux-2.6.22.new/arch/mips/Kconfig diff -urN linux-2.6.22/arch/mips/kernel/traps.c linux-2.6.22.new/arch/mips/kernel/traps.c --- linux-2.6.22/arch/mips/kernel/traps.c 2007-07-09 01:32:17.000000000 +0200 +++ linux-2.6.22.new/arch/mips/kernel/traps.c 2007-07-11 02:32:39.000000000 +0200 -@@ -1075,9 +1075,23 @@ void *set_except_vector(int n, void *addr) +@@ -1074,11 +1074,23 @@ void *set_except_vector(int n, void *addr) + unsigned long old_handler = exception_handlers[n]; exception_handlers[n] = handler; - if (n == 0 && cpu_has_divec) { -+#ifdef CONFIG_AR7 -+ /* lui k0, 0x0000 */ -+ *(volatile u32 *)(ebase + 0x200) = -+ 0x3c1a0000 | (handler >> 16); -+ /* ori k0, 0x0000 */ -+ *(volatile u32 *)(ebase + 0x204) = -+ 0x375a0000 | (handler & 0xffff); -+ /* jr k0 */ -+ *(volatile u32 *)(ebase + 0x208) = 0x03400008; -+ /* nop */ -+ *(volatile u32 *)(ebase + 0x20C) = 0x00000000; -+ flush_icache_range(ebase + 0x200, ebase + 0x210); -+#else - *(volatile u32 *)(ebase + 0x200) = 0x08000000 | - (0x03ffffff & (handler >> 2)); - flush_icache_range(ebase + 0x200, ebase + 0x204); -+#endif - } +- if (n == 0 && cpu_has_divec) { +- *(volatile u32 *)(ebase + 0x200) = 0x08000000 | +- (0x03ffffff & (handler >> 2)); +- flush_icache_range(ebase + 0x200, ebase + 0x204); +- } ++ if (n == 0 && cpu_has_divec) ++ if ((handler ^ (ebase + 4)) & 0xfc000000) { ++ /* lui k0, 0x0000 */ ++ *(u32 *)(ebase + 0x200) = 0x3c1a0000 | (handler >> 16); ++ /* ori k0, 0x0000 */ ++ *(u32 *)(ebase + 0x204) = ++ 0x375a0000 | (handler & 0xffff); ++ /* jr k0 */ ++ *(u32 *)(ebase + 0x208) = 0x03400008; ++ /* nop */ ++ *(u32 *)(ebase + 0x20C) = 0x00000000; ++ flush_icache_range(ebase + 0x200, ebase + 0x210); ++ } else { ++ *(volatile u32 *)(ebase + 0x200) = ++ 0x08000000 | (0x03ffffff & (handler >> 2)); ++ flush_icache_range(ebase + 0x200, ebase + 0x204); ++ } return (void *)old_handler; } - + diff -urN linux-2.6.22/arch/mips/Makefile linux-2.6.22.new/arch/mips/Makefile --- linux-2.6.22/arch/mips/Makefile 2007-07-09 01:32:17.000000000 +0200 +++ linux-2.6.22.new/arch/mips/Makefile 2007-07-11 02:32:39.000000000 +0200 -- 2.30.2