From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16874 invoked by alias); 13 Aug 2002 00:40:35 -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 16867 invoked from network); 13 Aug 2002 00:40:35 -0000 Received: from unknown (HELO cygnus.com) (205.180.83.203) by sources.redhat.com with SMTP; 13 Aug 2002 00:40:35 -0000 Received: from redhat.com (reddwarf.sfbay.redhat.com [172.16.24.50]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id RAA15694; Mon, 12 Aug 2002 17:37:10 -0700 (PDT) Message-ID: <3D585101.CA20A2E2@redhat.com> Date: Mon, 12 Aug 2002 17:40:00 -0000 From: Michael Snyder Organization: Red Hat, Inc. X-Accept-Language: en MIME-Version: 1.0 To: Kevin Buettner CC: gdb-patches@sources.redhat.com Subject: Re: [RFA] procfs.c: TARGET_CAN_USE_HARDWARE_WATCHPOINT via target vector References: <1020812213802.ZM1237@localhost.localdomain> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2002-08/txt/msg00280.txt.bz2 Kevin Buettner wrote: > > On Irix, it's possible to debug processes using the o32, n32, and n64 > ABIs from a single gdb. Unfortunately, due to some limitations with > the watchpoint support in procfs.c, it is not possible to use hardware > watchpoints in all cases. (See patch comments for details.) > > My first cut at a patch simply changed the macro in > config/mips/nm-irix5.h. However, since this same solution will be > required for each platform requiring procfs.c, I decided to use the > newly added hardware breakpoint facilities in the target vector. > > Okay to commit? Sure -- but don't you think it should default to zero? Or is being able to do it the norm? (I don't remember). > > Kevin > > * procfs.c (procfs_can_use_hw_breakpoint): New function. > (init_procfs_ops): Define ``to_can_use_hw_breakpoint'' for procfs > target vector. > * config/mips/nm-irix5.h (TARGET_CAN_USE_HARDWARE_WATCHPOINT): > Delete. Add comment regarding this now-deleted target method. > > Index: procfs.c > =================================================================== > RCS file: /cvs/src/src/gdb/procfs.c,v > retrieving revision 1.38 > diff -u -p -r1.38 procfs.c > --- procfs.c 11 Jul 2002 13:50:49 -0000 1.38 > +++ procfs.c 12 Aug 2002 21:18:34 -0000 > @@ -136,6 +136,8 @@ static int proc_find_memory_regions (int > > static char * procfs_make_note_section (bfd *, int *); > > +static int procfs_can_use_hw_breakpoint (int, int, int); > + > struct target_ops procfs_ops; /* the target vector */ > > static void > @@ -183,6 +185,7 @@ init_procfs_ops (void) > procfs_ops.to_has_thread_control = tc_schedlock; > procfs_ops.to_find_memory_regions = proc_find_memory_regions; > procfs_ops.to_make_corefile_notes = procfs_make_note_section; > + procfs_ops.to_can_use_hw_breakpoint = procfs_can_use_hw_breakpoint; > procfs_ops.to_magic = OPS_MAGIC; > } > > @@ -5136,6 +5139,37 @@ procfs_set_watchpoint (ptid_t ptid, CORE > #endif /* AIX5 */ > #endif /* UNIXWARE */ > return 0; > +} > + > +/* Return non-zero if we can set a hardware watchpoint of type TYPE. TYPE > + is one of bp_hardware_watchpoint, bp_read_watchpoint, bp_write_watchpoint, > + or bp_hardware_watchpoint. CNT is the number of watchpoints used so > + far. > + > + Note: procfs_can_use_hw_breakpoint() is not yet used by all > + procfs.c targets due to the fact that some of them still define > + TARGET_CAN_USE_HARDWARE_WATCHPOINT. */ > + > +static int > +procfs_can_use_hw_breakpoint (int type, int cnt, int othertype) > +{ > +#ifndef TARGET_HAS_HARDWARE_WATCHPOINTS > + return 0; > +#else > + /* Due to the way that proc_set_watchpoint() is implemented, host > + and target pointers must be of the same size. If they are not, > + we can't use hardware watchpoints. This limitation is due to the > + fact that proc_set_watchpoint() calls address_to_host_pointer(); > + a close inspection of address_to_host_pointer will reveal that > + an internal error will be generated when the host and target > + pointer sizes are different. */ > + if (sizeof (void *) != TYPE_LENGTH (builtin_type_void_data_ptr)) > + return 0; > + > + /* Other tests here??? */ > + > + return 1; > +#endif > } > > /* > Index: config/mips/nm-irix5.h > =================================================================== > RCS file: /cvs/src/src/gdb/config/mips/nm-irix5.h,v > retrieving revision 1.5 > diff -u -p -r1.5 nm-irix5.h > --- config/mips/nm-irix5.h 5 Jun 2002 19:18:24 -0000 1.5 > +++ config/mips/nm-irix5.h 12 Aug 2002 21:18:34 -0000 > @@ -24,7 +24,9 @@ > > #define TARGET_HAS_HARDWARE_WATCHPOINTS > > -#define TARGET_CAN_USE_HARDWARE_WATCHPOINT(type, cnt, ot) 1 > +/* TARGET_CAN_USE_HARDWARE_WATCHPOINT is now defined to go through > + the target vector. For Irix5, procfs_can_use_hw_watchpoint() > + should be invoked. */ > > /* When a hardware watchpoint fires off the PC will be left at the > instruction which caused the watchpoint. It will be necessary for