grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v3 13/15] gdb: Allow running user-defined commands at GRUB start


From: Glenn Washburn
Subject: [PATCH v3 13/15] gdb: Allow running user-defined commands at GRUB start
Date: Thu, 15 Dec 2022 01:07:48 -0600

A new command, run_on_start, is created which handles some complexities
of the EFI platform when breaking on GRUB start. If GRUB start is hooked,
run "onstart" command if it is defned.

Signed-off-by: Glenn Washburn <development@efficientek.com>
---
 grub-core/gdb_grub.in | 44 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/grub-core/gdb_grub.in b/grub-core/gdb_grub.in
index 57152b718f..021d830b43 100644
--- a/grub-core/gdb_grub.in
+++ b/grub-core/gdb_grub.in
@@ -36,6 +36,8 @@ end
 define dynamic_load_symbols
        dynamic_load_kernel_exec_symbols $arg0
 
+       run_on_start
+
        # We may have been very late to loading the kernel.exec symbols and
        # and modules may already be loaded. So load symbols for any already
        # loaded.
@@ -170,6 +172,41 @@ document num_modules
        Given a module name print its address or NULL if not loaded.
 end
 
+define run_on_start
+       # TODO: Add check to see if _start symbol is defined, if not, then
+       # the symbols have not yet been loaded and this command will not work.
+       watch *_start
+       set $break_efi_start_bpnum = $bpnum
+       commands
+               silent
+               delete $break_efi_start_bpnum
+               break _start
+               commands
+                       silent
+                       delete $break_efi_start_bpnum
+                       set $onstart_name = "onstart"
+                       is_user_command $onstart_name
+                       if $ret
+                               onstart
+                       end
+                       continue
+               end
+               set $break_efi_start_bpnum = $bpnum
+               continue
+       end
+end
+document run_on_start
+       On some targets, such as x86_64-efi, even if you know where the
+       firmware will load the grub image, you can not simply set a break
+       point before the image is loaded because loading the image
+       overwrites the break point in memory. So setup a hardware watch
+       point, which does not have that problem, and if that gets triggered,
+       then reset the break point. If a user-defined command named
+       "onstart" exists it will be run after the start is hit.
+       NOTE: This assumes symbols have already been correctly loaded for
+       the EFI application.
+end
+
 ###
 
 set confirm off
@@ -180,13 +217,20 @@ set confirm off
 # fail.
 
 set $platform_efi = $_streq("@platform@", "efi")
+set $target = "@target_cpu@-@platform@"
 
 if ! $runonce
        if $platform_efi
                # Only load the executable file, not the symbols
                exec-file kernel.exec
        else
+               if $_streq($target, "i386-pc")
+                       add-symbol-file boot.image
+                       add-symbol-file diskboot.image
+                       add-symbol-file lzma_decompress.image
+               end
                file kernel.exec
+               run_on_start
                runtime_load_module
        end
 
-- 
2.34.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]