KGDB: Notify GDB of machine halt, reboot or power off
authorDavid Howells <dhowells@redhat.com>
Fri, 18 Mar 2011 16:54:31 +0000 (16:54 +0000)
committerDavid Howells <dhowells@redhat.com>
Fri, 18 Mar 2011 16:54:31 +0000 (16:54 +0000)
Notify GDB of the machine halting, rebooting or powering off by sending it an
exited command (remote protocol command 'W').  This is done by calling:

void gdbstub_exit(int status)

from the arch's machine_{halt,restart,power_off}() functions with an
appropriate exit status to be reported to GDB.

Signed-off-by: David Howells <dhowells@redhat.com>
include/linux/kgdb.h
kernel/debug/gdbstub.c

index 092e425..10ca03d 100644 (file)
@@ -297,6 +297,7 @@ extern int
 kgdb_handle_exception(int ex_vector, int signo, int err_code,
                      struct pt_regs *regs);
 extern int kgdb_nmicallback(int cpu, void *regs);
+extern void gdbstub_exit(int status);
 
 extern int                     kgdb_single_step;
 extern atomic_t                        kgdb_active;
index 481a7bd..a11db95 100644 (file)
@@ -1093,3 +1093,33 @@ int gdbstub_state(struct kgdb_state *ks, char *cmd)
        put_packet(remcom_out_buffer);
        return 0;
 }
+
+/**
+ * gdbstub_exit - Send an exit message to GDB
+ * @status: The exit code to report.
+ */
+void gdbstub_exit(int status)
+{
+       unsigned char checksum, ch, buffer[3];
+       int loop;
+
+       buffer[0] = 'W';
+       buffer[1] = hex_asc_hi(status);
+       buffer[2] = hex_asc_lo(status);
+
+       dbg_io_ops->write_char('$');
+       checksum = 0;
+
+       for (loop = 0; loop < 3; loop++) {
+               ch = buffer[loop];
+               checksum += ch;
+               dbg_io_ops->write_char(ch);
+       }
+
+       dbg_io_ops->write_char('#');
+       dbg_io_ops->write_char(hex_asc_hi(checksum));
+       dbg_io_ops->write_char(hex_asc_lo(checksum));
+
+       /* make sure the output is flushed, lest the bootloader clobber it */
+       dbg_io_ops->flush();
+}