You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
8.1 KiB
181 lines
8.1 KiB
4 years ago
|
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||
|
From: Keith Seitz <keiths@redhat.com>
|
||
|
Date: Mon, 27 Jul 2020 18:01:32 -0400
|
||
|
Subject: gdb-rhbz1842691-corefile-mem-access-7of15.patch
|
||
|
|
||
|
;; Add new gdbarch method, read_core_file_mappings
|
||
|
;; Kevin Buettner, RH BZ 1842961
|
||
|
|
||
|
Author: Kevin Buettner <kevinb@redhat.com>
|
||
|
Date: Fri Jul 3 13:32:08 2020 -0700
|
||
|
|
||
|
Add new gdbarch method, read_core_file_mappings
|
||
|
|
||
|
The new gdbarch method, read_core_file_mappings, will be used for
|
||
|
reading file-backed mappings from a core file. It'll be used
|
||
|
for two purposes: 1) to construct a table of file-backed mappings
|
||
|
in corelow.c, and 2) for display of core file mappings.
|
||
|
|
||
|
For Linux, I tried a different approach in which knowledge of the note
|
||
|
format was placed directly in corelow.c. This seemed okay at first;
|
||
|
it was only one note format and the note format was fairly simple.
|
||
|
After looking at FreeBSD's note/mapping reading code, I concluded
|
||
|
that it's best to leave architecture specific details for decoding
|
||
|
the note in (architecture specific) tdep files.
|
||
|
|
||
|
With regard to display of core file mappings, I experimented with
|
||
|
placing the mappings display code in corelow.c. It has access to the
|
||
|
file-backed mappings which were read in when the core file was loaded.
|
||
|
And, better, still common code could be used for all architectures.
|
||
|
But, again, the FreeBSD mapping code convinced me that this was not
|
||
|
the best approach since it has even more mapping info than Linux.
|
||
|
Display code which would work well for Linux will leave out mappings
|
||
|
as well as protection info for mappings.
|
||
|
|
||
|
So, for these reasons, I'm introducing a new gdbarch method for
|
||
|
reading core file mappings.
|
||
|
|
||
|
gdb/ChangeLog:
|
||
|
|
||
|
* arch-utils.c (default_read_core_file_mappings): New function.
|
||
|
* arch-utils.c (default_read_core_file_mappings): Declare.
|
||
|
* gdbarch.sh (read_core_file_mappings): New gdbarch method.
|
||
|
* gdbarch.h, gdbarch.c: Regenerate.
|
||
|
|
||
|
diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c
|
||
|
--- a/gdb/arch-utils.c
|
||
|
+++ b/gdb/arch-utils.c
|
||
|
@@ -1004,6 +1004,22 @@ default_get_pc_address_flags (frame_info *frame, CORE_ADDR pc)
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
+/* See arch-utils.h. */
|
||
|
+void
|
||
|
+default_read_core_file_mappings (struct gdbarch *gdbarch,
|
||
|
+ struct bfd *cbfd,
|
||
|
+ gdb::function_view<void (ULONGEST count)>
|
||
|
+ pre_loop_cb,
|
||
|
+ gdb::function_view<void (int num,
|
||
|
+ ULONGEST start,
|
||
|
+ ULONGEST end,
|
||
|
+ ULONGEST file_ofs,
|
||
|
+ const char *filename,
|
||
|
+ const void *other)>
|
||
|
+ loop_cb)
|
||
|
+{
|
||
|
+}
|
||
|
+
|
||
|
void
|
||
|
_initialize_gdbarch_utils (void)
|
||
|
{
|
||
|
diff --git a/gdb/arch-utils.h b/gdb/arch-utils.h
|
||
|
--- a/gdb/arch-utils.h
|
||
|
+++ b/gdb/arch-utils.h
|
||
|
@@ -276,4 +276,16 @@ extern ULONGEST default_type_align (struct gdbarch *gdbarch,
|
||
|
extern std::string default_get_pc_address_flags (frame_info *frame,
|
||
|
CORE_ADDR pc);
|
||
|
|
||
|
+/* Default implementation of gdbarch read_core_file_mappings method. */
|
||
|
+extern void default_read_core_file_mappings (struct gdbarch *gdbarch,
|
||
|
+ struct bfd *cbfd,
|
||
|
+ gdb::function_view<void (ULONGEST count)>
|
||
|
+ pre_loop_cb,
|
||
|
+ gdb::function_view<void (int num,
|
||
|
+ ULONGEST start,
|
||
|
+ ULONGEST end,
|
||
|
+ ULONGEST file_ofs,
|
||
|
+ const char *filename,
|
||
|
+ const void *other)>
|
||
|
+ loop_cb);
|
||
|
#endif /* ARCH_UTILS_H */
|
||
|
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c
|
||
|
--- a/gdb/gdbarch.c
|
||
|
+++ b/gdb/gdbarch.c
|
||
|
@@ -358,6 +358,7 @@ struct gdbarch
|
||
|
const disasm_options_and_args_t * valid_disassembler_options;
|
||
|
gdbarch_type_align_ftype *type_align;
|
||
|
gdbarch_get_pc_address_flags_ftype *get_pc_address_flags;
|
||
|
+ gdbarch_read_core_file_mappings_ftype *read_core_file_mappings;
|
||
|
};
|
||
|
|
||
|
/* Create a new ``struct gdbarch'' based on information provided by
|
||
|
@@ -473,6 +474,7 @@ gdbarch_alloc (const struct gdbarch_info *info,
|
||
|
gdbarch->addressable_memory_unit_size = default_addressable_memory_unit_size;
|
||
|
gdbarch->type_align = default_type_align;
|
||
|
gdbarch->get_pc_address_flags = default_get_pc_address_flags;
|
||
|
+ gdbarch->read_core_file_mappings = default_read_core_file_mappings;
|
||
|
/* gdbarch_alloc() */
|
||
|
|
||
|
return gdbarch;
|
||
|
@@ -721,6 +723,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
|
||
|
/* Skip verify of valid_disassembler_options, invalid_p == 0 */
|
||
|
/* Skip verify of type_align, invalid_p == 0 */
|
||
|
/* Skip verify of get_pc_address_flags, invalid_p == 0 */
|
||
|
+ /* Skip verify of read_core_file_mappings, invalid_p == 0 */
|
||
|
if (!log.empty ())
|
||
|
internal_error (__FILE__, __LINE__,
|
||
|
_("verify_gdbarch: the following are invalid ...%s"),
|
||
|
@@ -1287,6 +1290,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
|
||
|
fprintf_unfiltered (file,
|
||
|
"gdbarch_dump: ravenscar_ops = %s\n",
|
||
|
host_address_to_string (gdbarch->ravenscar_ops));
|
||
|
+ fprintf_unfiltered (file,
|
||
|
+ "gdbarch_dump: read_core_file_mappings = <%s>\n",
|
||
|
+ host_address_to_string (gdbarch->read_core_file_mappings));
|
||
|
fprintf_unfiltered (file,
|
||
|
"gdbarch_dump: gdbarch_read_pc_p() = %d\n",
|
||
|
gdbarch_read_pc_p (gdbarch));
|
||
|
@@ -5156,6 +5162,23 @@ set_gdbarch_get_pc_address_flags (struct gdbarch *gdbarch,
|
||
|
gdbarch->get_pc_address_flags = get_pc_address_flags;
|
||
|
}
|
||
|
|
||
|
+void
|
||
|
+gdbarch_read_core_file_mappings (struct gdbarch *gdbarch, struct bfd *cbfd,gdb::function_view<void (ULONGEST count)> pre_loop_cb,gdb::function_view<void (int num, ULONGEST start, ULONGEST end, ULONGEST file_ofs, const char *filename, const void *other)> loop_cb)
|
||
|
+{
|
||
|
+ gdb_assert (gdbarch != NULL);
|
||
|
+ gdb_assert (gdbarch->read_core_file_mappings != NULL);
|
||
|
+ if (gdbarch_debug >= 2)
|
||
|
+ fprintf_unfiltered (gdb_stdlog, "gdbarch_read_core_file_mappings called\n");
|
||
|
+ gdbarch->read_core_file_mappings (gdbarch, cbfd, pre_loop_cb, loop_cb);
|
||
|
+}
|
||
|
+
|
||
|
+void
|
||
|
+set_gdbarch_read_core_file_mappings (struct gdbarch *gdbarch,
|
||
|
+ gdbarch_read_core_file_mappings_ftype read_core_file_mappings)
|
||
|
+{
|
||
|
+ gdbarch->read_core_file_mappings = read_core_file_mappings;
|
||
|
+}
|
||
|
+
|
||
|
|
||
|
/* Keep a registry of per-architecture data-pointers required by GDB
|
||
|
modules. */
|
||
|
diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h
|
||
|
--- a/gdb/gdbarch.h
|
||
|
+++ b/gdb/gdbarch.h
|
||
|
@@ -1640,6 +1640,12 @@ typedef std::string (gdbarch_get_pc_address_flags_ftype) (frame_info *frame, COR
|
||
|
extern std::string gdbarch_get_pc_address_flags (struct gdbarch *gdbarch, frame_info *frame, CORE_ADDR pc);
|
||
|
extern void set_gdbarch_get_pc_address_flags (struct gdbarch *gdbarch, gdbarch_get_pc_address_flags_ftype *get_pc_address_flags);
|
||
|
|
||
|
+/* Read core file mappings */
|
||
|
+
|
||
|
+typedef void (gdbarch_read_core_file_mappings_ftype) (struct gdbarch *gdbarch, struct bfd *cbfd,gdb::function_view<void (ULONGEST count)> pre_loop_cb,gdb::function_view<void (int num, ULONGEST start, ULONGEST end, ULONGEST file_ofs, const char *filename, const void *other)> loop_cb);
|
||
|
+extern void gdbarch_read_core_file_mappings (struct gdbarch *gdbarch, struct bfd *cbfd,gdb::function_view<void (ULONGEST count)> pre_loop_cb,gdb::function_view<void (int num, ULONGEST start, ULONGEST end, ULONGEST file_ofs, const char *filename, const void *other)> loop_cb);
|
||
|
+extern void set_gdbarch_read_core_file_mappings (struct gdbarch *gdbarch, gdbarch_read_core_file_mappings_ftype *read_core_file_mappings);
|
||
|
+
|
||
|
extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
|
||
|
|
||
|
|
||
|
diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh
|
||
|
--- a/gdb/gdbarch.sh
|
||
|
+++ b/gdb/gdbarch.sh
|
||
|
@@ -1209,6 +1209,9 @@ m;ULONGEST;type_align;struct type *type;type;;default_type_align;;0
|
||
|
# Return a string containing any flags for the given PC in the given FRAME.
|
||
|
f;std::string;get_pc_address_flags;frame_info *frame, CORE_ADDR pc;frame, pc;;default_get_pc_address_flags;;0
|
||
|
|
||
|
+# Read core file mappings
|
||
|
+m;void;read_core_file_mappings;struct bfd *cbfd,gdb::function_view<void (ULONGEST count)> pre_loop_cb,gdb::function_view<void (int num, ULONGEST start, ULONGEST end, ULONGEST file_ofs, const char *filename, const void *other)> loop_cb;cbfd, pre_loop_cb, loop_cb;;default_read_core_file_mappings;;0
|
||
|
+
|
||
|
EOF
|
||
|
}
|
||
|
|