]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
GDB serial and backtrace support.
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 26 Feb 2012 19:31:03 +0000 (20:31 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 26 Feb 2012 19:31:03 +0000 (20:31 +0100)
* grub-core/kern/i386/realmode.S (real_to_prot): Reload IDT.
(prot_to_real): Likewise.
* grub-core/kern/i386/int.S (grub_bios_interrupt): Remove IDT reload.
* grub-core/Makefile.core.def (backtrace): New module.
(gdb): Likewise.
* grub-core/gdb/cstub.c: New file.
* grub-core/gdb/gdb.c: Likewise.
* grub-core/gdb/i386/idt.c: Likewise.
* grub-core/gdb/i386/machdep.S: Likewise.
* grub-core/gdb/i386/signal.c: Likewise.
* grub-core/lib/i386/backtrace.c: Likewise.
* grub-core/lib/backtrace.c: Likewise.
* include/grub/backtrace.h: Likewise.
* include/grub/gdb.h: Likewise.
* include/grub/i386/gdb.h: Likewise.

ChangeLog
grub-core/lib/backtrace.c [new file with mode: 0644]

index 6b4cc4de819196fa96664b5086f4e5ded3b8cb89..64c5c5e8bc99cb0b187b0b3e591a0eabb2a86b2b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -14,6 +14,7 @@
        * grub-core/gdb/i386/machdep.S: Likewise.
        * grub-core/gdb/i386/signal.c: Likewise.
        * grub-core/lib/i386/backtrace.c: Likewise.
+       * grub-core/lib/backtrace.c: Likewise.
        * include/grub/backtrace.h: Likewise.
        * include/grub/gdb.h: Likewise.
        * include/grub/i386/gdb.h: Likewise.
diff --git a/grub-core/lib/backtrace.c b/grub-core/lib/backtrace.c
new file mode 100644 (file)
index 0000000..bf2f7aa
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2009  Free Software Foundation, Inc.
+ *
+ *  GRUB is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  GRUB is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <grub/misc.h>
+#include <grub/command.h>
+#include <grub/err.h>
+#include <grub/dl.h>
+#include <grub/mm.h>
+#include <grub/term.h>
+#include <grub/backtrace.h>
+
+GRUB_MOD_LICENSE ("GPLv3+");
+
+void
+grub_backtrace_print_address (void *addr)
+{
+  grub_dl_t mod;
+
+  FOR_DL_MODULES (mod)
+  {
+    grub_dl_segment_t segment;
+    for (segment = mod->segment; segment; segment = segment->next)
+      if (segment->addr <= addr && (grub_uint8_t *) segment->addr
+         + segment->size > (grub_uint8_t *) addr)
+       {
+         grub_printf ("%s.%x+%" PRIxGRUB_SIZE, mod->name, segment->section,
+                      (grub_uint8_t *) addr - (grub_uint8_t *) segment->addr);
+         return;
+       }
+  }
+
+  grub_printf ("%p", addr);
+}