From: Glenn Washburn <development@efficientek.com>
To: grub-devel@gnu.org, Daniel Kiper <dkiper@net-space.pl>
Cc: Peter Jones <pjones@redhat.com>,
Glenn Washburn <development@efficientek.com>
Subject: [PATCH v2] gdb: Add gdbinfo command for printing the load address of the EFI application
Date: Wed, 31 May 2023 21:15:28 -0500 [thread overview]
Message-ID: <20230601021528.115675-1-development@efficientek.com> (raw)
EFI firmware determines where to load the GRUB EFI at runtime, and so the
addresses of debug symbols are not known ahead of time. There is a command
defined in the gdb_grub script which will load the debug symbols at the
appropriate addresses, if given given the application load address for GRUB.
So add a command named "gdbinfo" to allow the user to print this GDB command
string with the application load address on-demand. For the outputted GDB
command to have any effect when entered into a GDB session, GDB should have
been started with the script as an argument to the -x option or sourced into
an active GDB session before running the outputted command.
Documentation for the gdbinfo command is also added.
Co-developed-by: Peter Jones <pjones@redhat.com>
Signed-off-by: Peter Jones <pjones@redhat.com>
Signed-off-by: Glenn Washburn <development@efficientek.com>
---
Range-diff against v1:
1: 1d438175061f ! 1: 24106a4ff806 gdb: Add gdbinfo command for printing the load address of the EFI application
@@ grub-core/kern/efi/init.c: grub_addr_t grub_modbase;
messages. */
grub_console_init ();
@@ grub-core/kern/efi/init.c: grub_efi_init (void)
- 0, 0, 0, NULL);
+ grub_efi_system_table->boot_services->set_watchdog_timer (0, 0, 0, NULL);
grub_efidisk_init ();
+
@@ include/grub/efi/debug.h (new)
+#endif /* ! GRUB_EFI_DEBUG_HEADER */
## include/grub/efi/efi.h ##
-@@ include/grub/efi/efi.h: grub_err_t grub_arch_efi_linux_boot_image(grub_addr_t addr, grub_size_t size,
+@@ include/grub/efi/efi.h: grub_err_t grub_arch_efi_linux_load_image_header(grub_file_t file,
+ grub_err_t grub_arch_efi_linux_boot_image(grub_addr_t addr, grub_size_t size,
char *args);
- #endif
-grub_addr_t grub_efi_modules_addr (void);
+grub_addr_t grub_efi_section_addr (const char *section);
docs/grub.texi | 13 ++++++++++++
grub-core/Makefile.core.def | 1 +
grub-core/kern/efi/debug.c | 38 ++++++++++++++++++++++++++++++++++
grub-core/kern/efi/efi.c | 4 ++--
grub-core/kern/efi/init.c | 5 ++++-
include/grub/efi/debug.h | 41 +++++++++++++++++++++++++++++++++++++
include/grub/efi/efi.h | 2 +-
7 files changed, 100 insertions(+), 4 deletions(-)
create mode 100644 grub-core/kern/efi/debug.c
create mode 100644 include/grub/efi/debug.h
diff --git a/docs/grub.texi b/docs/grub.texi
index 7ab1e0ab40ef..5fb074f66869 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -4301,6 +4301,7 @@ you forget a command, you can run the command @command{help}
* export:: Export an environment variable
* false:: Do nothing, unsuccessfully
* fwsetup:: Reboot into the firmware setup menu
+* gdbinfo:: Provide info for debugging with GDB
* gettext:: Translate a string
* gptsync:: Fill an MBR based on GPT entries
* halt:: Shut down your computer
@@ -4833,6 +4834,18 @@ exit successfully if so.
@end deffn
+@node gdbinfo
+@subsection gdbinfo
+
+@deffn Command gdbinfo
+Output text to be used as a GDB command for a GDB session using the gdb_grub
+script and attached to a running GRUB instance. The GDB command that is
+output will tell GDB how to load debugging symbols to their proper runtime
+address. Currently this is only available for EFI platforms. See the Debugging
+in the developer documentation for more information.
+@end deffn
+
+
@node gettext
@subsection gettext
diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
index 04549e868591..784f0a2136c2 100644
--- a/grub-core/Makefile.core.def
+++ b/grub-core/Makefile.core.def
@@ -211,6 +211,7 @@ kernel = {
efi = disk/efi/efidisk.c;
efi = kern/efi/efi.c;
+ efi = kern/efi/debug.c;
efi = kern/efi/init.c;
efi = kern/efi/mm.c;
efi = term/efi/console.c;
diff --git a/grub-core/kern/efi/debug.c b/grub-core/kern/efi/debug.c
new file mode 100644
index 000000000000..506ad90dca06
--- /dev/null
+++ b/grub-core/kern/efi/debug.c
@@ -0,0 +1,38 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2022 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/>.
+ */
+/* debug.c - aides for debugging the EFI application */
+
+#include <grub/efi/debug.h>
+#include <grub/command.h>
+#include <grub/i18n.h>
+
+static grub_err_t
+grub_cmd_gdbinfo (struct grub_command *cmd __attribute__ ((unused)),
+ int argc __attribute__ ((unused)),
+ char **args __attribute__ ((unused)))
+{
+ grub_efi_print_gdb_info ();
+ return 0;
+}
+
+void
+grub_efi_register_debug_commands (void)
+{
+ grub_register_command_lockdown ("gdbinfo", grub_cmd_gdbinfo, 0,
+ N_("Print infomation useful for GDB debugging"));
+}
diff --git a/grub-core/kern/efi/efi.c b/grub-core/kern/efi/efi.c
index 0e1ccf65ad2e..974fed8cb55c 100644
--- a/grub-core/kern/efi/efi.c
+++ b/grub-core/kern/efi/efi.c
@@ -303,7 +303,7 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid,
/* Search the mods section from the PE32/PE32+ image. This code uses
a PE32 header, but should work with PE32+ as well. */
grub_addr_t
-grub_efi_modules_addr (void)
+grub_efi_section_addr (const char *section_name)
{
grub_efi_loaded_image_t *image;
struct grub_msdos_image_header *header;
@@ -332,7 +332,7 @@ grub_efi_modules_addr (void)
i < coff_header->num_sections;
i++, section++)
{
- if (grub_strcmp (section->name, "mods") == 0)
+ if (grub_strcmp (section->name, section_name) == 0)
break;
}
diff --git a/grub-core/kern/efi/init.c b/grub-core/kern/efi/init.c
index e873ef5298ff..ae8c2e1e499b 100644
--- a/grub-core/kern/efi/init.c
+++ b/grub-core/kern/efi/init.c
@@ -19,6 +19,7 @@
#include <grub/efi/efi.h>
#include <grub/efi/console.h>
+#include <grub/efi/debug.h>
#include <grub/efi/disk.h>
#include <grub/efi/sb.h>
#include <grub/lockdown.h>
@@ -104,7 +105,7 @@ grub_addr_t grub_modbase;
void
grub_efi_init (void)
{
- grub_modbase = grub_efi_modules_addr ();
+ grub_modbase = grub_efi_section_addr ("mods");
/* First of all, initialize the console so that GRUB can display
messages. */
grub_console_init ();
@@ -127,6 +128,8 @@ grub_efi_init (void)
grub_efi_system_table->boot_services->set_watchdog_timer (0, 0, 0, NULL);
grub_efidisk_init ();
+
+ grub_efi_register_debug_commands ();
}
void (*grub_efi_net_config) (grub_efi_handle_t hnd,
diff --git a/include/grub/efi/debug.h b/include/grub/efi/debug.h
new file mode 100644
index 000000000000..c2d2a03b06f1
--- /dev/null
+++ b/include/grub/efi/debug.h
@@ -0,0 +1,41 @@
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2022 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/>.
+ */
+/* debug.h - declare variables and functions for EFI debugging support */
+
+#ifndef GRUB_EFI_DEBUG_HEADER
+#define GRUB_EFI_DEBUG_HEADER 1
+
+#include <grub/efi/efi.h>
+#include <grub/misc.h>
+
+
+void grub_efi_register_debug_commands (void);
+
+static inline void
+grub_efi_print_gdb_info (void)
+{
+ grub_addr_t text;
+
+ text = grub_efi_section_addr (".text");
+ if (!text)
+ return;
+
+ grub_printf ("dynamic_load_symbols %p\n", (void *)text);
+}
+
+#endif /* ! GRUB_EFI_DEBUG_HEADER */
diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h
index 7071b8dc9783..5ec5af71eeb6 100644
--- a/include/grub/efi/efi.h
+++ b/include/grub/efi/efi.h
@@ -127,7 +127,7 @@ grub_err_t grub_arch_efi_linux_load_image_header(grub_file_t file,
grub_err_t grub_arch_efi_linux_boot_image(grub_addr_t addr, grub_size_t size,
char *args);
-grub_addr_t grub_efi_modules_addr (void);
+grub_addr_t grub_efi_section_addr (const char *section);
void grub_efi_mm_init (void);
void grub_efi_mm_fini (void);
--
2.34.1
reply other threads:[~2023-06-01 2:16 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230601021528.115675-1-development@efficientek.com \
--to=development@efficientek.com \
--cc=dkiper@net-space.pl \
--cc=grub-devel@gnu.org \
--cc=pjones@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.