summaryrefslogtreecommitdiff
path: root/cpu/i386
diff options
context:
space:
mode:
authorGraeme Russ <graeme.russ@gmail.com>2008-12-07 10:29:02 +1100
committerWolfgang Denk <wd@denx.de>2009-01-24 01:12:20 +0100
commit3f5f18d12d32ee0661bf51dfc55752c005230d6e (patch)
treeb0d03fbf7f52bb1457f7aeccee1d02701f27d881 /cpu/i386
parent9933d609020c297788f53f334c8465fa7a99b10c (diff)
downloadu-boot-imx-3f5f18d12d32ee0661bf51dfc55752c005230d6e.zip
u-boot-imx-3f5f18d12d32ee0661bf51dfc55752c005230d6e.tar.gz
u-boot-imx-3f5f18d12d32ee0661bf51dfc55752c005230d6e.tar.bz2
Moved generic (triple fault) reset code
Moved from interrupts.c to cpu.c and made into a weak function to allow vendor specific override Vendor specific CPU reset (like the AMD SC520 MMCR reset) can now be added to the vendor specific code without the need to remember to #undef usage of the generic method and if you forget to include your custom reset method, you will always get the default. Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
Diffstat (limited to 'cpu/i386')
-rw-r--r--cpu/i386/cpu.c17
-rw-r--r--cpu/i386/interrupts.c16
2 files changed, 17 insertions, 16 deletions
diff --git a/cpu/i386/cpu.c b/cpu/i386/cpu.c
index 5fd37c7..b9af5f8 100644
--- a/cpu/i386/cpu.c
+++ b/cpu/i386/cpu.c
@@ -35,6 +35,7 @@
#include <common.h>
#include <command.h>
+#include <asm/interrupt.h>
int cpu_init(void)
{
@@ -64,3 +65,19 @@ void flush_cache (unsigned long dummy1, unsigned long dummy2)
asm("wbinvd\n");
return;
}
+
+void __attribute__ ((regparm(0))) generate_gpf(void);
+
+/* segment 0x70 is an arbitrary segment which does not exist */
+asm(".globl generate_gpf\n"
+ "generate_gpf:\n"
+ "ljmp $0x70, $0x47114711\n");
+
+void __reset_cpu(ulong addr)
+{
+ printf("Resetting using i386 Triple Fault\n");
+ set_vector(13, generate_gpf); /* general protection fault handler */
+ set_vector(8, generate_gpf); /* double fault handler */
+ generate_gpf(); /* start the show */
+}
+void reset_cpu(ulong addr) __attribute__((weak, alias("__reset_cpu")));
diff --git a/cpu/i386/interrupts.c b/cpu/i386/interrupts.c
index ba9e89d..badb30b 100644
--- a/cpu/i386/interrupts.c
+++ b/cpu/i386/interrupts.c
@@ -508,19 +508,3 @@ int disable_interrupts(void)
return (flags&0x200); /* IE flags is bit 9 */
}
-
-
-#ifdef CONFIG_SYS_RESET_GENERIC
-
-void __attribute__ ((regparm(0))) generate_gpf(void);
-asm(".globl generate_gpf\n"
- "generate_gpf:\n"
- "ljmp $0x70, $0x47114711\n"); /* segment 0x70 is an arbitrary segment which does not
- * exist */
-void reset_cpu(ulong addr)
-{
- set_vector(13, generate_gpf); /* general protection fault handler */
- set_vector(8, generate_gpf); /* double fault handler */
- generate_gpf(); /* start the show */
-}
-#endif