This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: gdb core file support for GNU/Hurd


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,
> +                      &region_address,
> +                      &region_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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]