grub-devel
[Top][All Lists]
Advanced

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

[PATCH v3 06/15] gdb: Do not run load_module if module has already been


From: Glenn Washburn
Subject: [PATCH v3 06/15] gdb: Do not run load_module if module has already been loaded
Date: Thu, 15 Dec 2022 01:07:41 -0600

Fix an issue where the command load_module is being run multiple times.
This happens because grub_dl_add can get called multiple times by GRUB
(eg. a user runs "insmod <module>" multple times). This causes the
symbols to get added multiple times. Instead, first check if the modules
has already been loaded, and not run load_module in the automatic runtime
module symbols loader command, runtime_load_module, if it has. This is
done using the new GDB command get_module which traverses the loaded
module list checking if a given string matches the each module name. It
returns the address of the module if found in the $ret GDB variable,
otherwise NULL.

Also add new GDB command num_modules that sets the variable $ret to the
number of modules loaded.

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

diff --git a/grub-core/gdb_grub.in b/grub-core/gdb_grub.in
index 78219ea36e..521e3ae6ce 100644
--- a/grub-core/gdb_grub.in
+++ b/grub-core/gdb_grub.in
@@ -82,7 +82,10 @@ define runtime_load_module
                commands
                        silent
                        fr 1
-                       load_module mod
+                       get_module mod->name
+                       if ($ret == 0)
+                               load_module mod
+                       end
                        cont
                end
                cont
@@ -92,6 +95,30 @@ document runtime_load_module
        Load module symbols at runtime as they are loaded.
 end
 
+define get_module
+       set $this = grub_dl_head
+       while ($this != 0 && grub_strcmp($this->name, $arg0))
+               set $this = $this->next
+       end
+       set $ret = $this
+end
+document get_module
+       Given a module name print its address or NULL if not loaded.
+end
+
+define num_modules
+       set $this = grub_dl_head
+       set $i = 0
+       while ($this != 0)
+               set $i = $i + 1
+               set $this = $this->next
+       end
+       set $ret = $this
+end
+document num_modules
+       Given a module name print its address or NULL if not loaded.
+end
+
 ###
 
 set confirm off
-- 
2.34.1




reply via email to

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