From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26374 invoked by alias); 13 Mar 2002 22:11:00 -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 26284 invoked from network); 13 Mar 2002 22:10:52 -0000 Received: from unknown (HELO perdition.linnaean.org) (65.96.132.240) by sources.redhat.com with SMTP; 13 Mar 2002 22:10:52 -0000 Received: by perdition.linnaean.org (Postfix, from userid 5281) id 754AF1B9C4; Wed, 13 Mar 2002 17:10:51 -0500 (EST) From: Roland McGrath To: gdb-patches@sources.redhat.com Subject: gdb core file support for GNU/Hurd X-Shopping-List: (1) Scanty elliptical deception (2) Deep-fried scenarios (3) Inconsistent circumlocution robbers (4) Unforgivable delirious companions Message-Id: <20020313221051.754AF1B9C4@perdition.linnaean.org> Date: Wed, 13 Mar 2002 14:11:00 -0000 X-SW-Source: 2002-03/txt/msg00208.txt.bz2 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 * 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