[POWERPC] Fix xmon=off and cleanup xmon initialisation
authorMichael Ellerman <michael@ellerman.id.au>
Tue, 3 Oct 2006 04:12:08 +0000 (14:12 +1000)
committerPaul Mackerras <paulus@samba.org>
Wed, 4 Oct 2006 04:52:22 +0000 (14:52 +1000)
My patch to make the early xmon logic work with earlier early param
parsing (480f6f35a149802a94ad5c1a2673ed6ec8d2c158) breaks xmon=off.

No one does this obviously as xmon rocks, but it should really work
as documented.

While fixing that it struck me that we could move the xmon param
handling into xmon.c, and also consolidate the
xmon_init()/do_early_xmon logic into xmon_setup(). This means
xmon=early drops into xmon a little earlier on 32-bit, but it
seems to work just fine.

Tested on PSERIES and CLASSIC32.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/kernel/setup-common.c
arch/powerpc/kernel/setup_32.c
arch/powerpc/kernel/setup_64.c
arch/powerpc/xmon/xmon.c
include/asm-powerpc/xmon.h

index 0af3fc1bdcc929fd37a457d6c05ef1521bf5ab0d..89cfaf49d3de8aa3ae8b53cd878ee574929d0be1 100644 (file)
@@ -442,31 +442,6 @@ void __init smp_setup_cpu_maps(void)
 }
 #endif /* CONFIG_SMP */
 
-int __initdata do_early_xmon;
-#ifdef CONFIG_XMON
-extern int xmon_no_auto_backtrace;
-
-static int __init early_xmon(char *p)
-{
-       /* ensure xmon is enabled */
-       if (p) {
-               if (strncmp(p, "on", 2) == 0)
-                       xmon_init(1);
-               if (strncmp(p, "off", 3) == 0)
-                       xmon_init(0);
-               if (strncmp(p, "nobt", 4) == 0)
-                       xmon_no_auto_backtrace = 1;
-               if (strncmp(p, "early", 5) != 0)
-                       return 0;
-       }
-       xmon_init(1);
-       do_early_xmon = 1;
-
-       return 0;
-}
-early_param("xmon", early_xmon);
-#endif
-
 static __init int add_pcspkr(void)
 {
        struct device_node *np;
index 79a17795d17bd5bfba19c61da9bf2a61bddef2d1..191d0ab0922227908db8dc6fc3b0fefa53ed876d 100644 (file)
@@ -238,12 +238,11 @@ void __init setup_arch(char **cmdline_p)
 
        smp_setup_cpu_maps();
 
-#ifdef CONFIG_XMON_DEFAULT
-       xmon_init(1);
-#endif
        /* Register early console */
        register_early_udbg_console();
 
+       xmon_setup();
+
 #if defined(CONFIG_KGDB)
        if (ppc_md.kgdb_map_scc)
                ppc_md.kgdb_map_scc();
@@ -280,9 +279,6 @@ void __init setup_arch(char **cmdline_p)
        init_mm.end_data = (unsigned long) _edata;
        init_mm.brk = klimit;
 
-       if (do_early_xmon)
-               debugger(NULL);
-
        /* set up the bootmem stuff with available memory */
        do_init_bootmem();
        if ( ppc_md.progress ) ppc_md.progress("setup_arch: bootmem", 0x3eab);
index cda2dbe70a7656ce520d593ef57b5c3a9bf167f4..4b2e32eab9dc3e6b50bea7ffdf52fcdcb229492d 100644 (file)
@@ -390,19 +390,15 @@ void __init setup_system(void)
         */
        find_legacy_serial_ports();
 
-       /*
-        * Initialize xmon
-        */
-#ifdef CONFIG_XMON_DEFAULT
-       xmon_init(1);
-#endif
        /*
         * Register early console
         */
        register_early_udbg_console();
 
-       if (do_early_xmon)
-               debugger(NULL);
+       /*
+        * Initialize xmon
+        */
+       xmon_setup();
 
        check_smt_enabled();
        smp_setup_cpu_maps();
index 8adad1444a51f3fca949bc4d0e7ec3ead0f3d93e..b54ff980ecd4237ccbeaa1164cccf428bb16224e 100644 (file)
@@ -2,6 +2,8 @@
  * Routines providing a simple monitor for use on the PowerMac.
  *
  * Copyright (C) 1996-2005 Paul Mackerras.
+ * Copyright (C) 2001 PPC64 Team, IBM Corp
+ * Copyrignt (C) 2006 Michael Ellerman, IBM Corp
  *
  *      This program is free software; you can redistribute it and/or
  *      modify it under the terms of the GNU General Public License
@@ -2597,3 +2599,34 @@ static int __init setup_xmon_sysrq(void)
 }
 __initcall(setup_xmon_sysrq);
 #endif /* CONFIG_MAGIC_SYSRQ */
+
+int __initdata xmon_early, xmon_off;
+
+static int __init early_parse_xmon(char *p)
+{
+       if (!p || strncmp(p, "early", 5) == 0) {
+               /* just "xmon" is equivalent to "xmon=early" */
+               xmon_init(1);
+               xmon_early = 1;
+       } else if (strncmp(p, "on", 2) == 0)
+               xmon_init(1);
+       else if (strncmp(p, "off", 3) == 0)
+               xmon_off = 1;
+       else if (strncmp(p, "nobt", 4) == 0)
+               xmon_no_auto_backtrace = 1;
+       else
+               return 1;
+
+       return 0;
+}
+early_param("xmon", early_parse_xmon);
+
+void __init xmon_setup(void)
+{
+#ifdef CONFIG_XMON_DEFAULT
+       if (!xmon_off)
+               xmon_init(1);
+#endif
+       if (xmon_early)
+               debugger(NULL);
+}
index c02dd0ce13acae2682a1bdca180f20732531b38b..f1d337ed68d5bfdaf16ee9eaf6823ffa2ead81d7 100644 (file)
 
 #ifdef __KERNEL__
 
-extern void xmon_init(int);
+#ifdef CONFIG_XMON
+extern void xmon_setup(void);
+#else
+static inline void xmon_setup(void) { };
+#endif
 
 #endif /* __KERNEL __ */
 #endif /* __ASM_POWERPC_XMON_H */