* gdb core file support for GNU/Hurd
@ 2002-03-13 14:11 Roland McGrath
2002-03-13 14:38 ` Michael Snyder
2002-03-13 22:21 ` Eli Zaretskii
0 siblings, 2 replies; 6+ messages in thread
From: Roland McGrath @ 2002-03-13 14:11 UTC (permalink / raw)
To: gdb-patches
These patches vs the current gdb in cvs add ELF core file support to the
i386-*-gnu* native configuration. I have a report this has been tested on
a Hurd system. We'll have additional patches later to make the gcore
command fully work. This patch makes core file reading work where there
was none before.
Thanks,
Roland
2002-03-10 Roland McGrath <roland@frob.com>
* config/i386/i386gnu.mh (NATDEPFILES): Add core-regset.o here.
* i386gnu-nat.c [HAVE_SYS_PROCFS_H]
(supply_gregset, supply_fpregset): New functions.
* gnu-nat.c (gnu_find_memory_regions): New function.
(init_gnu_ops): Set `to_find_memory_regions' hook to that.
(gnu_xfer_memory): Add a cast.
Index: ChangeLog
===================================================================
RCS file: /cvs/src/src/gdb/ChangeLog,v
retrieving revision 1.2314
diff -b -p -u -r1.2314 ChangeLog
--- ChangeLog 2002/03/13 03:20:19 1.2314
+++ ChangeLog 2002/03/13 22:03:45
@@ -1,3 +1,13 @@
+2002-03-10 Roland McGrath <roland@frob.com>
+
+ * config/i386/i386gnu.mh (NATDEPFILES): Add core-regset.o here.
+ * i386gnu-nat.c [HAVE_SYS_PROCFS_H]
+ (supply_gregset, supply_fpregset): New functions.
+
+ * gnu-nat.c (gnu_find_memory_regions): New function.
+ (init_gnu_ops): Set `to_find_memory_regions' hook to that.
+ (gnu_xfer_memory): Add a cast.
+
2002-03-12 David O'Brien <obrien@FreeBSD.org>
* config/sparc/fbsd.mh: Fix copyright.
Index: gnu-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/gnu-nat.c,v
retrieving revision 1.18
diff -b -p -u -r1.18 gnu-nat.c
--- gnu-nat.c 2002/01/06 19:18:28 1.18
+++ gnu-nat.c 2002/03/13 22:03:47
@@ -2458,7 +2458,7 @@ gnu_xfer_memory (CORE_ADDR memaddr, char
else
{
inf_debug (current_inferior, "%s %p[%d] %s %p",
- write ? "writing" : "reading", memaddr, len,
+ write ? "writing" : "reading", (void *) memaddr, len,
write ? "<--" : "-->", myaddr);
if (write)
return gnu_write_inferior (task, memaddr, myaddr, len);
@@ -2467,6 +2467,86 @@ gnu_xfer_memory (CORE_ADDR memaddr, char
}
}
+/* Call FUNC on each memory region in the task. */
+static int
+gnu_find_memory_regions (int (*func) (CORE_ADDR,
+ unsigned long,
+ int, int, int,
+ void *),
+ void *data)
+{
+ error_t err;
+ task_t task;
+ vm_address_t region_address, last_region_address, last_region_end;
+ vm_prot_t last_protection;
+
+ if (current_inferior == 0 || current_inferior->task == 0)
+ return 0;
+ task = current_inferior->task->port;
+ if (task == MACH_PORT_NULL)
+ return 0;
+
+ region_address = last_region_address = last_region_end = VM_MIN_ADDRESS;
+ last_protection = VM_PROT_NONE;
+ while (region_address < VM_MAX_ADDRESS)
+ {
+ vm_prot_t protection;
+ vm_prot_t max_protection;
+ vm_inherit_t inheritance;
+ boolean_t shared;
+ mach_port_t object_name;
+ vm_offset_t offset;
+ vm_size_t region_length = VM_MAX_ADDRESS - region_address;
+ vm_address_t old_address = region_address;
+
+ err = vm_region (task,
+ ®ion_address,
+ ®ion_length,
+ &protection,
+ &max_protection,
+ &inheritance,
+ &shared,
+ &object_name,
+ &offset);
+ if (err == KERN_NO_SPACE)
+ break;
+ if (err != KERN_SUCCESS)
+ {
+ warning ("vm_region failed: %s", mach_error_string (err));
+ return -1;
+ }
+
+ if (protection == last_protection && region_address == last_region_end)
+ /* This region is contiguous with and indistinguishable from
+ the previous one, so we just extend that one. */
+ last_region_end = region_address += region_length;
+ else
+ {
+ /* This region is distinct from the last one we saw, so report
+ that previous one. */
+ if (last_protection != VM_PROT_NONE)
+ (*func) (last_region_address,
+ last_region_end - last_region_address,
+ last_protection & VM_PROT_READ,
+ last_protection & VM_PROT_WRITE,
+ last_protection & VM_PROT_EXECUTE,
+ data);
+ last_region_address = region_address;
+ last_region_end = region_address += region_length;
+ last_protection = protection;
+ }
+ }
+
+ /* Report the final region. */
+ if (last_region_end > last_region_address && last_protection != VM_PROT_NONE)
+ (*func) (last_region_address, last_region_end - last_region_address,
+ last_protection & VM_PROT_READ,
+ last_protection & VM_PROT_WRITE,
+ last_protection & VM_PROT_EXECUTE,
+ data);
+
+ return 0;
+}
\f
/* Return printable description of proc. */
char *
@@ -2524,6 +2604,7 @@ init_gnu_ops (void)
gnu_ops.to_store_registers = gnu_store_registers; /* to_store_registers */
gnu_ops.to_prepare_to_store = gnu_prepare_to_store; /* to_prepare_to_store */
gnu_ops.to_xfer_memory = gnu_xfer_memory; /* to_xfer_memory */
+ gnu_ops.to_find_memory_regions = gnu_find_memory_regions;
gnu_ops.to_files_info = 0; /* to_files_info */
gnu_ops.to_insert_breakpoint = memory_insert_breakpoint;
gnu_ops.to_remove_breakpoint = memory_remove_breakpoint;
Index: i386gnu-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386gnu-nat.c,v
retrieving revision 1.8
diff -b -p -u -r1.8 i386gnu-nat.c
--- i386gnu-nat.c 2002/01/19 12:51:04 1.8
+++ i386gnu-nat.c 2002/03/13 22:03:48
@@ -38,6 +38,10 @@
#include "gnu-nat.h"
#include "i387-nat.h"
+#ifdef HAVE_SYS_PROCFS_H
+# include <sys/procfs.h>
+# include "gregset.h"
+#endif
/* Offset to the thread_state_t location where REG is stored. */
#define REG_OFFSET(reg) offsetof (struct i386_thread_state, reg)
@@ -87,6 +91,24 @@ fetch_fpregs (struct proc *thread)
/* Supply the floating-point registers. */
i387_supply_fsave (state.hw_state);
}
+
+#ifdef HAVE_SYS_PROCFS_H
+/* These two calls are used by the core-regset.c code for
+ reading ELF core files. */
+void
+supply_gregset (gdb_gregset_t *gregs)
+{
+ int i;
+ for (i = 0; i < NUM_GREGS; i++)
+ supply_register (i, REG_ADDR (gregs, i));
+}
+
+void
+supply_fpregset (gdb_fpregset_t *fpregs)
+{
+ i387_supply_fsave ((char *) fpregs);
+}
+#endif
/* Fetch register REGNO, or all regs if REGNO is -1. */
void
Index: config/i386/i386gnu.mh
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/i386gnu.mh,v
retrieving revision 1.6
diff -b -p -u -r1.6 i386gnu.mh
--- i386gnu.mh 2002/01/18 04:50:59 1.6
+++ i386gnu.mh 2002/03/13 22:03:48
@@ -1,5 +1,8 @@
# Host: Intel 386 running the GNU Hurd
-NATDEPFILES= i386gnu-nat.o i387-nat.o gnu-nat.o fork-child.o solib.o solib-svr4.o solib-legacy.o corelow.o notify_S.o process_reply_S.o msg_reply_S.o msg_U.o exc_request_U.o exc_request_S.o
+NATDEPFILES= i386gnu-nat.o i387-nat.o gnu-nat.o corelow.o core-regset.o \
+ fork-child.o solib.o solib-svr4.o solib-legacy.o \
+ notify_S.o process_reply_S.o msg_reply_S.o \
+ msg_U.o exc_request_U.o exc_request_S.o
XM_FILE= xm-i386gnu.h
NAT_FILE= nm-gnu.h
MH_CFLAGS = -D_GNU_SOURCE
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: gdb core file support for GNU/Hurd
2002-03-13 14:11 gdb core file support for GNU/Hurd Roland McGrath
@ 2002-03-13 14:38 ` Michael Snyder
2002-03-13 15:09 ` Roland McGrath
2002-03-13 22:21 ` Eli Zaretskii
1 sibling, 1 reply; 6+ messages in thread
From: Michael Snyder @ 2002-03-13 14:38 UTC (permalink / raw)
To: Roland McGrath; +Cc: gdb-patches
Roland McGrath wrote:
>
> These patches vs the current gdb in cvs add ELF core file support to the
> i386-*-gnu* native configuration. I have a report this has been tested on
> a Hurd system. We'll have additional patches later to make the gcore
> command fully work. This patch makes core file reading work where there
> was none before.
>
> Thanks,
> Roland
Cool!
Do you have write access to the repository? Would you like
to commit these, or would you like one of us to?
Michael
>
> 2002-03-10 Roland McGrath <roland@frob.com>
>
> * config/i386/i386gnu.mh (NATDEPFILES): Add core-regset.o here.
> * i386gnu-nat.c [HAVE_SYS_PROCFS_H]
> (supply_gregset, supply_fpregset): New functions.
>
> * gnu-nat.c (gnu_find_memory_regions): New function.
> (init_gnu_ops): Set `to_find_memory_regions' hook to that.
> (gnu_xfer_memory): Add a cast.
>
> Index: ChangeLog
> ===================================================================
> RCS file: /cvs/src/src/gdb/ChangeLog,v
> retrieving revision 1.2314
> diff -b -p -u -r1.2314 ChangeLog
> --- ChangeLog 2002/03/13 03:20:19 1.2314
> +++ ChangeLog 2002/03/13 22:03:45
> @@ -1,3 +1,13 @@
> +2002-03-10 Roland McGrath <roland@frob.com>
> +
> + * config/i386/i386gnu.mh (NATDEPFILES): Add core-regset.o here.
> + * i386gnu-nat.c [HAVE_SYS_PROCFS_H]
> + (supply_gregset, supply_fpregset): New functions.
> +
> + * gnu-nat.c (gnu_find_memory_regions): New function.
> + (init_gnu_ops): Set `to_find_memory_regions' hook to that.
> + (gnu_xfer_memory): Add a cast.
> +
> 2002-03-12 David O'Brien <obrien@FreeBSD.org>
>
> * config/sparc/fbsd.mh: Fix copyright.
> Index: gnu-nat.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/gnu-nat.c,v
> retrieving revision 1.18
> diff -b -p -u -r1.18 gnu-nat.c
> --- gnu-nat.c 2002/01/06 19:18:28 1.18
> +++ gnu-nat.c 2002/03/13 22:03:47
> @@ -2458,7 +2458,7 @@ gnu_xfer_memory (CORE_ADDR memaddr, char
> else
> {
> inf_debug (current_inferior, "%s %p[%d] %s %p",
> - write ? "writing" : "reading", memaddr, len,
> + write ? "writing" : "reading", (void *) memaddr, len,
> write ? "<--" : "-->", myaddr);
> if (write)
> return gnu_write_inferior (task, memaddr, myaddr, len);
> @@ -2467,6 +2467,86 @@ gnu_xfer_memory (CORE_ADDR memaddr, char
> }
> }
>
> +/* Call FUNC on each memory region in the task. */
> +static int
> +gnu_find_memory_regions (int (*func) (CORE_ADDR,
> + unsigned long,
> + int, int, int,
> + void *),
> + void *data)
> +{
> + error_t err;
> + task_t task;
> + vm_address_t region_address, last_region_address, last_region_end;
> + vm_prot_t last_protection;
> +
> + if (current_inferior == 0 || current_inferior->task == 0)
> + return 0;
> + task = current_inferior->task->port;
> + if (task == MACH_PORT_NULL)
> + return 0;
> +
> + region_address = last_region_address = last_region_end = VM_MIN_ADDRESS;
> + last_protection = VM_PROT_NONE;
> + while (region_address < VM_MAX_ADDRESS)
> + {
> + vm_prot_t protection;
> + vm_prot_t max_protection;
> + vm_inherit_t inheritance;
> + boolean_t shared;
> + mach_port_t object_name;
> + vm_offset_t offset;
> + vm_size_t region_length = VM_MAX_ADDRESS - region_address;
> + vm_address_t old_address = region_address;
> +
> + err = vm_region (task,
> + ®ion_address,
> + ®ion_length,
> + &protection,
> + &max_protection,
> + &inheritance,
> + &shared,
> + &object_name,
> + &offset);
> + if (err == KERN_NO_SPACE)
> + break;
> + if (err != KERN_SUCCESS)
> + {
> + warning ("vm_region failed: %s", mach_error_string (err));
> + return -1;
> + }
> +
> + if (protection == last_protection && region_address == last_region_end)
> + /* This region is contiguous with and indistinguishable from
> + the previous one, so we just extend that one. */
> + last_region_end = region_address += region_length;
> + else
> + {
> + /* This region is distinct from the last one we saw, so report
> + that previous one. */
> + if (last_protection != VM_PROT_NONE)
> + (*func) (last_region_address,
> + last_region_end - last_region_address,
> + last_protection & VM_PROT_READ,
> + last_protection & VM_PROT_WRITE,
> + last_protection & VM_PROT_EXECUTE,
> + data);
> + last_region_address = region_address;
> + last_region_end = region_address += region_length;
> + last_protection = protection;
> + }
> + }
> +
> + /* Report the final region. */
> + if (last_region_end > last_region_address && last_protection != VM_PROT_NONE)
> + (*func) (last_region_address, last_region_end - last_region_address,
> + last_protection & VM_PROT_READ,
> + last_protection & VM_PROT_WRITE,
> + last_protection & VM_PROT_EXECUTE,
> + data);
> +
> + return 0;
> +}
>
> /* Return printable description of proc. */
> char *
> @@ -2524,6 +2604,7 @@ init_gnu_ops (void)
> gnu_ops.to_store_registers = gnu_store_registers; /* to_store_registers */
> gnu_ops.to_prepare_to_store = gnu_prepare_to_store; /* to_prepare_to_store */
> gnu_ops.to_xfer_memory = gnu_xfer_memory; /* to_xfer_memory */
> + gnu_ops.to_find_memory_regions = gnu_find_memory_regions;
> gnu_ops.to_files_info = 0; /* to_files_info */
> gnu_ops.to_insert_breakpoint = memory_insert_breakpoint;
> gnu_ops.to_remove_breakpoint = memory_remove_breakpoint;
> Index: i386gnu-nat.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/i386gnu-nat.c,v
> retrieving revision 1.8
> diff -b -p -u -r1.8 i386gnu-nat.c
> --- i386gnu-nat.c 2002/01/19 12:51:04 1.8
> +++ i386gnu-nat.c 2002/03/13 22:03:48
> @@ -38,6 +38,10 @@
> #include "gnu-nat.h"
> #include "i387-nat.h"
>
> +#ifdef HAVE_SYS_PROCFS_H
> +# include <sys/procfs.h>
> +# include "gregset.h"
> +#endif
>
> /* Offset to the thread_state_t location where REG is stored. */
> #define REG_OFFSET(reg) offsetof (struct i386_thread_state, reg)
> @@ -87,6 +91,24 @@ fetch_fpregs (struct proc *thread)
> /* Supply the floating-point registers. */
> i387_supply_fsave (state.hw_state);
> }
> +
> +#ifdef HAVE_SYS_PROCFS_H
> +/* These two calls are used by the core-regset.c code for
> + reading ELF core files. */
> +void
> +supply_gregset (gdb_gregset_t *gregs)
> +{
> + int i;
> + for (i = 0; i < NUM_GREGS; i++)
> + supply_register (i, REG_ADDR (gregs, i));
> +}
> +
> +void
> +supply_fpregset (gdb_fpregset_t *fpregs)
> +{
> + i387_supply_fsave ((char *) fpregs);
> +}
> +#endif
>
> /* Fetch register REGNO, or all regs if REGNO is -1. */
> void
> Index: config/i386/i386gnu.mh
> ===================================================================
> RCS file: /cvs/src/src/gdb/config/i386/i386gnu.mh,v
> retrieving revision 1.6
> diff -b -p -u -r1.6 i386gnu.mh
> --- i386gnu.mh 2002/01/18 04:50:59 1.6
> +++ i386gnu.mh 2002/03/13 22:03:48
> @@ -1,5 +1,8 @@
> # Host: Intel 386 running the GNU Hurd
> -NATDEPFILES= i386gnu-nat.o i387-nat.o gnu-nat.o fork-child.o solib.o solib-svr4.o solib-legacy.o corelow.o notify_S.o process_reply_S.o msg_reply_S.o msg_U.o exc_request_U.o exc_request_S.o
> +NATDEPFILES= i386gnu-nat.o i387-nat.o gnu-nat.o corelow.o core-regset.o \
> + fork-child.o solib.o solib-svr4.o solib-legacy.o \
> + notify_S.o process_reply_S.o msg_reply_S.o \
> + msg_U.o exc_request_U.o exc_request_S.o
> XM_FILE= xm-i386gnu.h
> NAT_FILE= nm-gnu.h
> MH_CFLAGS = -D_GNU_SOURCE
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: gdb core file support for GNU/Hurd
2002-03-13 14:11 gdb core file support for GNU/Hurd Roland McGrath
2002-03-13 14:38 ` Michael Snyder
@ 2002-03-13 22:21 ` Eli Zaretskii
1 sibling, 0 replies; 6+ messages in thread
From: Eli Zaretskii @ 2002-03-13 22:21 UTC (permalink / raw)
To: Roland McGrath; +Cc: gdb-patches
On Wed, 13 Mar 2002, Roland McGrath wrote:
> These patches vs the current gdb in cvs add ELF core file support to the
> i386-*-gnu* native configuration.
I think this should be mentioned in NEWS.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2002-04-24 21:48 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-03-13 14:11 gdb core file support for GNU/Hurd Roland McGrath
2002-03-13 14:38 ` Michael Snyder
2002-03-13 15:09 ` Roland McGrath
2002-03-13 18:15 ` Michael Snyder
2002-04-24 14:48 ` Michael Snyder
2002-03-13 22:21 ` Eli Zaretskii
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox