From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1py1Qr-0006YP-BB for mharc-grub-devel@gnu.org; Sat, 13 May 2023 22:25:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1py1Qp-0006YG-Vq for grub-devel@gnu.org; Sat, 13 May 2023 22:25:56 -0400 Received: from mail-qt1-x82c.google.com ([2607:f8b0:4864:20::82c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1py1Qn-0007bk-Ll for grub-devel@gnu.org; Sat, 13 May 2023 22:25:55 -0400 Received: by mail-qt1-x82c.google.com with SMTP id d75a77b69052e-3f507edcaaaso14382601cf.2 for ; Sat, 13 May 2023 19:25:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=efficientek-com.20221208.gappssmtp.com; s=20221208; t=1684031152; x=1686623152; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=y/s2DJnFV480STAZ3T4eSyr8t3RdGSYPJ5XyBO7Ca84=; b=XNZlVMHBvzTtXbEgcJ2RWTLCOSUVGiJzOcPdZwKj8IKv89u6AakhpUMq0NoPSWPCP0 ARkI0ul+pl1D35G8q1Iben398LaLb06NzUCE5ygiI2ICYYEsgs8+WT2iagVARCRy7CkF r65MzJyWJv97PVz2WIj2DYphlibuRQn+maiMS+mcJu4TVzZpBEY7A5JmeTupcJXSP5bw Pfi1mtJnePz0zue/b9sQjs7JQ9pForTlKvfwYLjPT2J0MNAM6jIdpyzuSGYm7k55mwtP Jt4+5ypi0ojkb7rP01mau7yy72zyOfs/9dU2rHeJIVQ0ymoJaQq47Z3zt+TY3Po8C3yo Jieg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684031152; x=1686623152; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=y/s2DJnFV480STAZ3T4eSyr8t3RdGSYPJ5XyBO7Ca84=; b=eyc9CYZIa/WIcaKzUPdddTs+Sux4Ds/kxqDLX1yhzDB6Eu01eTxDmBlII8BGz3u+NW /XBUaaoOCU27WWPHrtMkS42a0Yq86kafwE7cIPfNHj6Nr8wUxBb9Bkp29I2OnRddIHWJ RbfAUreNVKcxZMp38Q1FZ74wYFzYPskDu2VsO73xNFIqIHyJwwVvgXQlw67WFFqsnXta PhHGBX2TcofYESwxQn2ZQOiWi4anJ0DPvKCK9h//m6bI+OJyo/7uVc9D447tBgLXAMMR C/8zvIeOjhirLcVvI/YUZf5ycD1CmNexwd5lO75/x3p9yfvQRh2DQpT4pLwqaVMEUofS qR0A== X-Gm-Message-State: AC+VfDwA5uwkRnS2SE5MZ6qm3Z5kXzSIA814P2P2XiIj6DIMrKe7nnMv LCLqG5A0fpvv51sfo2fWj/9Lvn3cusv3hGMgBwI= X-Google-Smtp-Source: ACHHUZ7AgqZTV7M5/yDOn6oSbFpd0m5F63MteUKJJdFtxNx7akH8QxaE6UY1k6nFwrZU0m152ANRKA== X-Received: by 2002:a05:622a:1708:b0:3f5:14fc:923a with SMTP id h8-20020a05622a170800b003f514fc923amr4707097qtk.58.1684031151906; Sat, 13 May 2023 19:25:51 -0700 (PDT) Received: from localhost.localdomain ([199.58.83.10]) by smtp.gmail.com with ESMTPSA id j15-20020a05620a000f00b0074e077c9317sm3984360qki.99.2023.05.13.19.25.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 May 2023 19:25:51 -0700 (PDT) From: Glenn Washburn To: grub-devel@gnu.org, Daniel Kiper Cc: Glenn Washburn , Peter Jones Subject: [PATCH] gdb: Add gdbinfo command for printing the load address of the EFI application Date: Sat, 13 May 2023 21:25:38 -0500 Message-Id: <20230514022538.227110-1-development@efficientek.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=2607:f8b0:4864:20::82c; envelope-from=development@efficientek.com; helo=mail-qt1-x82c.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 14 May 2023 02:25:56 -0000 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 Signed-off-by: Peter Jones Signed-off-by: Glenn Washburn --- 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 9d4adf0b8ab6..8669f76d176e 100644 --- a/docs/grub.texi +++ b/docs/grub.texi @@ -4319,6 +4319,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 @@ -4851,6 +4852,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 fb4cc066c526..3344f15bd5d1 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -206,6 +206,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 . + */ +/* debug.c - aides for debugging the EFI application */ + +#include +#include +#include + +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 33b95bd7fb67..37ec5bac40be 100644 --- a/grub-core/kern/efi/efi.c +++ b/grub-core/kern/efi/efi.c @@ -301,7 +301,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; @@ -330,7 +330,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 b67bc73a1b01..3645b2bfdcbe 100644 --- a/grub-core/kern/efi/init.c +++ b/grub-core/kern/efi/init.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -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 (); @@ -128,6 +129,8 @@ grub_efi_init (void) 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 . + */ +/* debug.h - declare variables and functions for EFI debugging support */ + +#ifndef GRUB_EFI_DEBUG_HEADER +#define GRUB_EFI_DEBUG_HEADER 1 + +#include +#include + + +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 1971e1a94865..fcfcd40aaae9 100644 --- a/include/grub/efi/efi.h +++ b/include/grub/efi/efi.h @@ -127,7 +127,7 @@ 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); void grub_efi_mm_init (void); void grub_efi_mm_fini (void); -- 2.34.1