]> err.no Git - linux-2.6/blobdiff - arch/sh/kernel/kgdb_stub.c
Merge branch 'sa1100'
[linux-2.6] / arch / sh / kernel / kgdb_stub.c
index a5323364cbca7c7c884d9c407ce02d7c777d9511..d453c3a1c79f485377a870456cef74488d601e27 100644 (file)
@@ -2,7 +2,7 @@
  * May be copied or modified under the terms of the GNU General Public
  * License.  See linux/COPYING for more information.
  *
- * Containes extracts from code by Glenn Engel, Jim Kingdon,
+ * Contains extracts from code by Glenn Engel, Jim Kingdon,
  * David Grothe <dave@gcom.com>, Tigran Aivazian <tigran@sco.com>,
  * Amit S. Kale <akale@veritas.com>,  William Gatliff <bgat@open-widgets.com>,
  * Ben Lee, Steve Chamberlain and Benoit Miller <fulg@iname.com>.
@@ -85,7 +85,7 @@
  *
  * Responses can be run-length encoded to save space.  A '*' means that
  * the next character is an ASCII encoding giving a repeat count which
- * stands for that many repititions of the character preceding the '*'.
+ * stands for that many repetitions of the character preceding the '*'.
  * The encoding is n+29, yielding a printable character where n >=3
  * (which is where RLE starts to win).  Don't use an n > 126.
  *
 #include <linux/init.h>
 #include <linux/console.h>
 #include <linux/sysrq.h>
+#include <linux/module.h>
 #include <asm/system.h>
 #include <asm/cacheflush.h>
 #include <asm/current.h>
@@ -116,7 +117,9 @@ kgdb_debug_hook_t *kgdb_debug_hook;
 kgdb_bus_error_hook_t *kgdb_bus_err_hook;
 
 int (*kgdb_getchar)(void);
+EXPORT_SYMBOL_GPL(kgdb_getchar);
 void (*kgdb_putchar)(int);
+EXPORT_SYMBOL_GPL(kgdb_putchar);
 
 static void put_debug_char(int c)
 {
@@ -136,7 +139,7 @@ static int get_debug_char(void)
 #define NUMREGBYTES (MAXREG*4)
 #define OUTBUFMAX (NUMREGBYTES*2+512)
 
-enum regs {
+enum {
        R0 = 0, R1,  R2,  R3,   R4,   R5,  R6, R7,
        R8, R9, R10, R11, R12,  R13,  R14, R15,
        PC, PR, GBR, VBR, MACH, MACL, SR,
@@ -150,13 +153,6 @@ struct kgdb_regs trap_registers;
 char kgdb_in_gdb_mode;
 char in_nmi;                   /* Set during NMI to prevent reentry */
 int kgdb_nofault;              /* Boolean to ignore bus errs (i.e. in GDB) */
-int kgdb_enabled = 1;          /* Default to enabled, cmdline can disable */
-
-/* Exposed for user access */
-struct task_struct *kgdb_current;
-unsigned int kgdb_g_imask;
-int kgdb_trapa_val;
-int kgdb_excode;
 
 /* Default values for SCI (can override via kernel args in setup.c) */
 #ifndef CONFIG_KGDB_DEFPORT
@@ -183,9 +179,13 @@ int kgdb_excode;
 
 /* SCI/UART settings, used in kgdb_console_setup() */
 int  kgdb_portnum = CONFIG_KGDB_DEFPORT;
+EXPORT_SYMBOL_GPL(kgdb_portnum);
 int  kgdb_baud = CONFIG_KGDB_DEFBAUD;
+EXPORT_SYMBOL_GPL(kgdb_baud);
 char kgdb_parity = CONFIG_KGDB_DEFPARITY;
+EXPORT_SYMBOL_GPL(kgdb_parity);
 char kgdb_bits = CONFIG_KGDB_DEFBITS;
+EXPORT_SYMBOL_GPL(kgdb_bits);
 
 /* Jump buffer for setjmp/longjmp */
 static jmp_buf rem_com_env;
@@ -616,7 +616,7 @@ static short *get_step_address(void)
        else
                addr = trap_registers.pc + 2;
 
-       kgdb_flush_icache_range(addr, addr + 2);
+       flush_icache_range(addr, addr + 2);
        return (short *) addr;
 }
 
@@ -639,8 +639,7 @@ static void do_single_step(void)
        *addr = STEP_OPCODE;
 
        /* Flush and return */
-       kgdb_flush_icache_range((long) addr, (long) addr + 2);
-       return;
+       flush_icache_range((long) addr, (long) addr + 2);
 }
 
 /* Undo a single step */
@@ -650,7 +649,7 @@ static void undo_single_step(void)
        /* Use stepped_address in case we stopped elsewhere */
        if (stepped_opcode != 0) {
                *(short*)stepped_address = stepped_opcode;
-               kgdb_flush_icache_range(stepped_address, stepped_address + 2);
+               flush_icache_range(stepped_address, stepped_address + 2);
        }
        stepped_opcode = 0;
 }
@@ -736,7 +735,7 @@ static void write_mem_msg(int binary)
                                        ebin_to_mem(ptr, (char*)addr, length);
                                else
                                        hex_to_mem(ptr, (char*)addr, length);
-                               kgdb_flush_icache_range(addr, addr + length);
+                               flush_icache_range(addr, addr + length);
                                ptr = 0;
                                send_ok_msg();
                        }
@@ -815,14 +814,10 @@ static void set_regs_msg(void)
 /*
  * Bring up the ports..
  */
-static int kgdb_serial_setup(void)
+static int __init kgdb_serial_setup(void)
 {
-       extern int kgdb_console_setup(struct console *co, char *options);
        struct console dummy;
-
-       kgdb_console_setup(&dummy, 0);
-
-       return 0;
+       return kgdb_console_setup(&dummy, 0);
 }
 #else
 #define kgdb_serial_setup()    0
@@ -833,22 +828,6 @@ static void kgdb_command_loop(const int excep_code, const int trapa_value)
 {
        int sigval;
 
-       if (excep_code == NMI_VEC) {
-#ifndef CONFIG_KGDB_NMI
-               printk(KERN_NOTICE "KGDB: Ignoring unexpected NMI?\n");
-               return;
-#else /* CONFIG_KGDB_NMI */
-               if (!kgdb_enabled) {
-                       kgdb_enabled = 1;
-                       kgdb_init();
-               }
-#endif /* CONFIG_KGDB_NMI */
-       }
-
-       /* Ignore if we're disabled */
-       if (!kgdb_enabled)
-               return;
-
        /* Enter GDB mode (e.g. after detach) */
        if (!kgdb_in_gdb_mode) {
                /* Do serial setup, notify user, issue preemptive ack */
@@ -959,18 +938,10 @@ static void handle_exception(struct pt_regs *regs)
 
        /* Get excode for command loop call, user access */
        asm("stc r2_bank, %0":"=r"(excep_code));
-       kgdb_excode = excep_code;
-
-       /* Other interesting environment items for reference */
-       asm("stc r6_bank, %0":"=r"(kgdb_g_imask));
-       kgdb_current = current;
-       kgdb_trapa_val = trapa_value;
 
        /* Act on the exception */
        kgdb_command_loop(excep_code, trapa_value);
 
-       kgdb_current = NULL;
-
        /* Copy back the (maybe modified) registers */
        for (count = 0; count < 16; count++)
                regs->regs[count] = trap_registers.regs[count];
@@ -994,11 +965,8 @@ asmlinkage void kgdb_handle_exception(unsigned long r4, unsigned long r5,
 }
 
 /* Initialise the KGDB data structures and serial configuration */
-int kgdb_init(void)
+int __init kgdb_init(void)
 {
-       if (!kgdb_enabled)
-               return 1;
-
        in_nmi = 0;
        kgdb_nofault = 0;
        stepped_opcode = 0;