[RFC][PATCH 1/7] Add addr argument to infcall_mmap

paul-naert paul_naert@hotmail.fr
Thu May 14 14:08:43 GMT 2020


The addr argument of mmap was always set to 0 in infcall_mmap.
This allows setting it to another value, making it possible to
map specific pages in memory. This is useful when we need to jump
from the code to the page using a 32bit jump offset for instance,
as we can ask for a page within range.
---
 gdb/arch-utils.c                  | 2 +-
 gdb/arch-utils.h                  | 2 +-
 gdb/compile/compile-object-load.c | 6 +++---
 gdb/gdbarch.c                     | 4 ++--
 gdb/gdbarch.h                     | 4 ++--
 gdb/gdbarch.sh                    | 3 ++-
 gdb/linux-tdep.c                  | 4 ++--
 7 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c
index 2129c3b..5c95ce0 100644
--- a/gdb/arch-utils.c
+++ b/gdb/arch-utils.c
@@ -889,7 +889,7 @@ default_skip_permanent_breakpoint (struct regcache *regcache)
 }
 
 CORE_ADDR
-default_infcall_mmap (CORE_ADDR size, unsigned prot)
+default_infcall_mmap (CORE_ADDR addr, CORE_ADDR size, unsigned prot)
 {
   error (_("This target does not support inferior memory allocation by mmap."));
 }
diff --git a/gdb/arch-utils.h b/gdb/arch-utils.h
index 48ff3bb..bd9d943 100644
--- a/gdb/arch-utils.h
+++ b/gdb/arch-utils.h
@@ -245,7 +245,7 @@ extern void default_skip_permanent_breakpoint (struct regcache *regcache);
 #define GDB_MMAP_PROT_WRITE	0x2	/* Page can be written.  */
 #define GDB_MMAP_PROT_EXEC	0x4	/* Page can be executed.  */
 
-extern CORE_ADDR default_infcall_mmap (CORE_ADDR size, unsigned prot);
+extern CORE_ADDR default_infcall_mmap (CORE_ADDR addr, CORE_ADDR size, unsigned prot);
 extern void default_infcall_munmap (CORE_ADDR addr, CORE_ADDR size);
 extern std::string default_gcc_target_options (struct gdbarch *gdbarch);
 extern const char *default_gnu_triplet_regexp (struct gdbarch *gdbarch);
diff --git a/gdb/compile/compile-object-load.c b/gdb/compile/compile-object-load.c
index a30c557..3078973 100644
--- a/gdb/compile/compile-object-load.c
+++ b/gdb/compile/compile-object-load.c
@@ -129,7 +129,7 @@ setup_sections (bfd *abfd, asection *sect, void *data_voidp)
 
       if (data->last_size != 0)
 	{
-	  addr = gdbarch_infcall_mmap (target_gdbarch (), data->last_size,
+	  addr = gdbarch_infcall_mmap (target_gdbarch (), 0, data->last_size,
 				       data->last_prot);
 	  data->munmap_list->add (addr, data->last_size);
 	  if (compile_debug)
@@ -753,7 +753,7 @@ compile_object_load (const compile_file_names &file_names,
   else
     {
       /* Use read-only non-executable memory protection.  */
-      regs_addr = gdbarch_infcall_mmap (target_gdbarch (),
+      regs_addr = gdbarch_infcall_mmap (target_gdbarch (), 0,
 					TYPE_LENGTH (regs_type),
 					GDB_MMAP_PROT_READ);
       gdb_assert (regs_addr != 0);
@@ -774,7 +774,7 @@ compile_object_load (const compile_file_names &file_names,
       if (out_value_type == NULL)
 	return NULL;
       check_typedef (out_value_type);
-      out_value_addr = gdbarch_infcall_mmap (target_gdbarch (),
+      out_value_addr = gdbarch_infcall_mmap (target_gdbarch (), 0,
 					     TYPE_LENGTH (out_value_type),
 					     (GDB_MMAP_PROT_READ
 					      | GDB_MMAP_PROT_WRITE));
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c
index fa6be50..d049771 100644
--- a/gdb/gdbarch.c
+++ b/gdb/gdbarch.c
@@ -5010,13 +5010,13 @@ set_gdbarch_vsyscall_range (struct gdbarch *gdbarch,
 }
 
 CORE_ADDR
-gdbarch_infcall_mmap (struct gdbarch *gdbarch, CORE_ADDR size, unsigned prot)
+gdbarch_infcall_mmap (struct gdbarch *gdbarch, CORE_ADDR addr, CORE_ADDR size, unsigned prot)
 {
   gdb_assert (gdbarch != NULL);
   gdb_assert (gdbarch->infcall_mmap != NULL);
   if (gdbarch_debug >= 2)
     fprintf_unfiltered (gdb_stdlog, "gdbarch_infcall_mmap called\n");
-  return gdbarch->infcall_mmap (size, prot);
+  return gdbarch->infcall_mmap (addr, size, prot);
 }
 
 void
diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h
index 01b5aef..054a077 100644
--- a/gdb/gdbarch.h
+++ b/gdb/gdbarch.h
@@ -1582,8 +1582,8 @@ extern void set_gdbarch_vsyscall_range (struct gdbarch *gdbarch, gdbarch_vsyscal
    PROT has GDB_MMAP_PROT_* bitmask format.
    Throw an error if it is not possible.  Returned address is always valid. */
 
-typedef CORE_ADDR (gdbarch_infcall_mmap_ftype) (CORE_ADDR size, unsigned prot);
-extern CORE_ADDR gdbarch_infcall_mmap (struct gdbarch *gdbarch, CORE_ADDR size, unsigned prot);
+typedef CORE_ADDR (gdbarch_infcall_mmap_ftype) (CORE_ADDR addr, CORE_ADDR size, unsigned prot);
+extern CORE_ADDR gdbarch_infcall_mmap (struct gdbarch *gdbarch, CORE_ADDR addr, CORE_ADDR size, unsigned prot);
 extern void set_gdbarch_infcall_mmap (struct gdbarch *gdbarch, gdbarch_infcall_mmap_ftype *infcall_mmap);
 
 /* Deallocate SIZE bytes of memory at ADDR in inferior from gdbarch_infcall_mmap.
diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh
index 62f68dc..9030e30 100755
--- a/gdb/gdbarch.sh
+++ b/gdb/gdbarch.sh
@@ -1174,8 +1174,9 @@ m;int;vsyscall_range;struct mem_range *range;range;;default_vsyscall_range;;0
 
 # Allocate SIZE bytes of PROT protected page aligned memory in inferior.
 # PROT has GDB_MMAP_PROT_* bitmask format.
+# mmap uses the addr argument as a hint of where to allocate the page.
 # Throw an error if it is not possible.  Returned address is always valid.
-f;CORE_ADDR;infcall_mmap;CORE_ADDR size, unsigned prot;size, prot;;default_infcall_mmap;;0
+f;CORE_ADDR;infcall_mmap;CORE_ADDR addr, CORE_ADDR size, unsigned prot;addr, size, prot;;default_infcall_mmap;;0
 
 # Deallocate SIZE bytes of memory at ADDR in inferior from gdbarch_infcall_mmap.
 # Print a warning if it is not possible.
diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c
index 567b01c..83f4b6e 100644
--- a/gdb/linux-tdep.c
+++ b/gdb/linux-tdep.c
@@ -2317,7 +2317,7 @@ linux_vsyscall_range (struct gdbarch *gdbarch, struct mem_range *range)
 /* See gdbarch.sh 'infcall_mmap'.  */
 
 static CORE_ADDR
-linux_infcall_mmap (CORE_ADDR size, unsigned prot)
+linux_infcall_mmap (CORE_ADDR addr, CORE_ADDR size, unsigned prot)
 {
   struct objfile *objf;
   /* Do there still exist any Linux systems without "mmap64"?
@@ -2333,7 +2333,7 @@ linux_infcall_mmap (CORE_ADDR size, unsigned prot)
   struct value *arg[ARG_LAST];
 
   arg[ARG_ADDR] = value_from_pointer (builtin_type (gdbarch)->builtin_data_ptr,
-				      0);
+				      addr);
   /* Assuming sizeof (unsigned long) == sizeof (size_t).  */
   arg[ARG_LENGTH] = value_from_ulongest
 		    (builtin_type (gdbarch)->builtin_unsigned_long, size);
-- 
2.7.4



More information about the Gdb-patches mailing list