diff options
| author | matteo <matteo@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2007-09-17 12:45:38 +0000 | 
|---|---|---|
| committer | matteo <matteo@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2007-09-17 12:45:38 +0000 | 
| commit | 351a3d1a648a3fe6a50b9c44d9408f5672e859d7 (patch) | |
| tree | 6a4d9d8edee878995941013c507ba35d1cd69e4d /target/linux/ar7/patches-2.6.22/100-board_support.patch | |
| parent | f07284d46fc35d17d545f4e041b36bf0507a8933 (diff) | |
detect ar7 at runtime in set_except_vector and remove useless volatile
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@8824 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/ar7/patches-2.6.22/100-board_support.patch')
| -rw-r--r-- | target/linux/ar7/patches-2.6.22/100-board_support.patch | 46 | 
1 files 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 0297ef651..c7ea6cc2a 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 | 
