From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13052 invoked by alias); 13 Mar 2002 22:38:44 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 12915 invoked from network); 13 Mar 2002 22:38:41 -0000 Received: from unknown (HELO cygnus.com) (205.180.230.5) by sources.redhat.com with SMTP; 13 Mar 2002 22:38:41 -0000 Received: from redhat.com (notinuse.cygnus.com [205.180.231.12]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id OAA15202; Wed, 13 Mar 2002 14:38:13 -0800 (PST) Message-ID: <3C8FD289.F17F3D49@redhat.com> Date: Wed, 13 Mar 2002 14:38:00 -0000 From: Michael Snyder Organization: Red Hat, Inc. X-Mailer: Mozilla 4.76 [en] (X11; U; Linux 2.4.2-2smp i686) X-Accept-Language: en MIME-Version: 1.0 To: Roland McGrath CC: gdb-patches@sources.redhat.com Subject: Re: gdb core file support for GNU/Hurd References: <20020313221051.754AF1B9C4@perdition.linnaean.org> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2002-03/txt/msg00209.txt.bz2 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 > > * 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 > + > + * 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 > > * 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 > +# 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