Moved generic (triple fault) reset code
authorGraeme Russ <graeme.russ@gmail.com>
Sat, 6 Dec 2008 23:29:02 +0000 (10:29 +1100)
committerWolfgang Denk <wd@denx.de>
Sat, 24 Jan 2009 00:12:20 +0000 (01:12 +0100)
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>
cpu/i386/cpu.c
cpu/i386/interrupts.c

index 5fd37c72a6078fd8b1db611c47af7a275d933826..b9af5f89d532c11356b2f31f9bfe1a78e9604e98 100644 (file)
@@ -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")));
index ba9e89df26117d8b57cf767b1ecf34f7820ae555..badb30bb8a1b3a044c0b59d2a3803a0ec71227ed 100644 (file)
@@ -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