From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6004 invoked by alias); 22 Apr 2010 23:35:27 -0000 Received: (qmail 5993 invoked by uid 22791); 22 Apr 2010 23:35:26 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=BAYES_00,MSGID_MULTIPLE_AT,TW_EG X-Spam-Check-By: sourceware.org Received: from mailhost.u-strasbg.fr (HELO mailhost.u-strasbg.fr) (130.79.200.155) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 22 Apr 2010 23:35:16 +0000 Received: from baal.u-strasbg.fr (baal.u-strasbg.fr [IPv6:2001:660:2402::41]) by mailhost.u-strasbg.fr (8.14.3/jtpda-5.5pre1) with ESMTP id o3MNXj4b027830 ; Fri, 23 Apr 2010 01:33:46 +0200 (CEST) (envelope-from pierre.muller@ics-cnrs.unistra.fr) Received: from mailserver.u-strasbg.fr (ms2.u-strasbg.fr [IPv6:2001:660:2402:d::11]) by baal.u-strasbg.fr (8.14.0/jtpda-5.5pre1) with ESMTP id o3MNXjrj042133 ; Fri, 23 Apr 2010 01:33:45 +0200 (CEST) (envelope-from pierre.muller@ics-cnrs.unistra.fr) Received: from d620muller (lec67-4-82-230-53-140.fbx.proxad.net [82.230.53.140]) (user=mullerp mech=LOGIN) by mailserver.u-strasbg.fr (8.14.3/jtpda-5.5pre1) with ESMTP id o3MNXhtc050271 (version=TLSv1/SSLv3 cipher=RC4-MD5 bits=128 verify=NO) ; Fri, 23 Apr 2010 01:33:44 +0200 (CEST) (envelope-from pierre.muller@ics-cnrs.unistra.fr) From: "Pierre Muller" To: "'Pedro Alves'" , Cc: , "'Joel Brobecker'" References: <001501cad7ff$3950cf30$abf26d90$@muller@ics-cnrs.unistra.fr> <201004091713.19282.pedro@codesourcery.com> <000001cad814$9ae9a770$d0bcf650$@muller@ics-cnrs.unistra.fr> <201004092042.05112.pedro@codesourcery.com> In-Reply-To: <201004092042.05112.pedro@codesourcery.com> Subject: [RFC-v2] ARI fixes: Remove NAT_FILE for solaris Date: Thu, 22 Apr 2010 23:35:00 -0000 Message-ID: <000001cae274$41cfedb0$c56fc910$@muller@ics-cnrs.unistra.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-04/txt/msg00774.txt.bz2 Thanks to Peter's answer to gdb mailing list, http://sourceware.org/ml/gdb/2010-04/msg00082.html I was able to write a new patch. The main idea is to add a to_cannot_step_hw_watchpoints filed to target_ops, create a macro called target_cannot_step_hw_watchpoints and you that inside infrun.c instead of the CANNOT_STEP_HW_WATCHPOINTS macro. The macro still gets defined for solaris 2.6 and 2.7 versions and triggers solaris_cannot_step_hw_watchpoints to return 1 instead of zero. The reason for using a function rather than an integer field was to be able later (once Solaris has a gdbserver) to also set this for remote targets. Comments? Pierre 2010-04-23 Pierre Muller * configure.ac (Solaris): Set CANNOT_STEP_HW_WATCHPOINTS macro for i386 cpu family and OS version <= 2.7. * config.in: Regenerate. * configure: Idem. * i386-sol2-nat.c (solaris_cannot_step_hw_watchpoints): New function. (_initialize_amd64_sol2_nat): Set target to_cannot_step_hw_watchpoints to solaris_cannot_step_hw_watchpoints. * infrun.c (show_debug_infrun): Remove redefinition of CANNOT_STEP_HW_WATCHPOINTS macro. (resume): Replace CANNOT_STEP_HW_WATCHPOINTS macro with target_cannot_step_hw_watchpoints macro. * target.h (target_ops): Add to_cannot_step_hw_watchpoints field. (target_cannot_step_hw_watchpoints): New macro. * target.c (update_current_target): Inherited to_cannot_step_hw_watchpoints. Set default to return_zero function. * config/i386/nm-i386sol2.h: Delete. * config/i386/i386sol2.mh: Remove NAT_FILE. * config/i386/sol2-64.mh: Idem. Index: src/gdb/config.in =================================================================== RCS file: /cvs/src/src/gdb/config.in,v retrieving revision 1.116 diff -u -p -r1.116 config.in --- src/gdb/config.in 10 Mar 2010 18:37:22 -0000 1.116 +++ src/gdb/config.in 22 Apr 2010 23:08:24 -0000 @@ -18,6 +18,9 @@ /* Define to the number of bits in type 'wint_t'. */ #undef BITSIZEOF_WINT_T +/* Define for Solaris Kernel bug. */ +#undef CANNOT_STEP_HW_WATCHPOINTS + /* Define to 1 if the compiler supports long long. */ #undef CC_HAS_LONG_LONG Index: src/gdb/configure =================================================================== RCS file: /cvs/src/src/gdb/configure,v retrieving revision 1.301 diff -u -p -r1.301 configure --- src/gdb/configure 15 Mar 2010 17:03:01 -0000 1.301 +++ src/gdb/configure 22 Apr 2010 23:08:29 -0000 @@ -11882,6 +11882,15 @@ $as_echo "#define NEW_PROC_API 1" >>conf $as_echo "#define NEW_PROC_API 1" >>confdefs.h +# This bug might have been solved, but for which version of solaris system? + if test "${gdb_host_cpu}" = "i386"; then + case "${host}" in + *-*-solaris2.[67] ) + +$as_echo "#define CANNOT_STEP_HW_WATCHPOINTS 1" >>confdefs.h + + esac + fi ;; mips-sgi-irix5*) # Work around needing _KMEMUSER problem on IRIX 5. Index: src/gdb/configure.ac =================================================================== RCS file: /cvs/src/src/gdb/configure.ac,v retrieving revision 1.116 diff -u -p -r1.116 configure.ac --- src/gdb/configure.ac 15 Mar 2010 17:03:00 -0000 1.116 +++ src/gdb/configure.ac 22 Apr 2010 23:08:30 -0000 @@ -1035,6 +1035,14 @@ if test "${target}" = "${host}"; then AC_DEFINE(NEW_PROC_API, 1, [Define if you want to use new multi-fd /proc interface (replaces HAVE_MULTIPLE_PROC_FDS as well as other macros).]) +# This bug might have been solved, but for which version of solaris system? + if test "${gdb_host_cpu}" = "i386"; then + case "${host}" in + *-*-solaris2.[[67]] ) + AC_DEFINE(CANNOT_STEP_HW_WATCHPOINTS, 1, + [Define for Solaris Kernel bug.]) + esac + fi ;; mips-sgi-irix5*) # Work around needing _KMEMUSER problem on IRIX 5. Index: src/gdb/i386-sol2-nat.c =================================================================== RCS file: /cvs/src/src/gdb/i386-sol2-nat.c,v retrieving revision 1.11 diff -u -p -r1.11 i386-sol2-nat.c --- src/gdb/i386-sol2-nat.c 1 Jan 2010 07:31:34 -0000 1.11 +++ src/gdb/i386-sol2-nat.c 22 Apr 2010 23:08:30 -0000 @@ -130,6 +130,16 @@ fill_fpregset (const struct regcache *re #endif +static int +solaris_cannot_step_hw_watchpoints (void) +{ +#ifdef CANNOT_STEP_HW_WATCHPOINTS + return 1; +#else + return 0; +#endif +} + /* Provide a prototype to silence -Wmissing-prototypes. */ extern void _initialize_amd64_sol2_nat (void); @@ -145,6 +155,8 @@ _initialize_amd64_sol2_nat (void) procfs_use_watchpoints (t); #endif + t->to_cannot_step_hw_watchpoints = solaris_cannot_step_hw_watchpoints; + #if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64) amd64_native_gregset32_reg_offset = amd64_sol2_gregset32_reg_offset; amd64_native_gregset32_num_regs = Index: src/gdb/infrun.c =================================================================== RCS file: /cvs/src/src/gdb/infrun.c,v retrieving revision 1.435 diff -u -p -r1.435 infrun.c --- src/gdb/infrun.c 25 Mar 2010 20:48:53 -0000 1.435 +++ src/gdb/infrun.c 22 Apr 2010 23:08:32 -0000 @@ -179,16 +179,6 @@ show_debug_infrun (struct ui_file *file, #endif -/* Convert the #defines into values. This is temporary until wfi control - flow is completely sorted out. */ - -#ifndef CANNOT_STEP_HW_WATCHPOINTS -#define CANNOT_STEP_HW_WATCHPOINTS 0 -#else -#undef CANNOT_STEP_HW_WATCHPOINTS -#define CANNOT_STEP_HW_WATCHPOINTS 1 -#endif - /* Tables of how to react to signals; the user sets them. */ static unsigned char *signal_stop; @@ -1492,7 +1482,7 @@ resume (int step, enum target_signal sig Work around the problem by removing hardware watchpoints if a step is requested, GDB will check for a hardware watchpoint trigger after the step anyway. */ - if (CANNOT_STEP_HW_WATCHPOINTS && step) + if (target_cannot_step_hw_watchpoints () && step) remove_hw_watchpoints (); Index: src/gdb/target.c =================================================================== RCS file: /cvs/src/src/gdb/target.c,v retrieving revision 1.247 diff -u -p -r1.247 target.c --- src/gdb/target.c 19 Apr 2010 22:06:17 -0000 1.247 +++ src/gdb/target.c 22 Apr 2010 23:08:33 -0000 @@ -661,6 +661,7 @@ update_current_target (void) INHERIT (to_set_disconnected_tracing, t); INHERIT (to_set_circular_trace_buffer, t); INHERIT (to_get_tib_address, t); + INHERIT (to_cannot_step_hw_watchpoints, t); INHERIT (to_magic, t); /* Do not inherit to_memory_map. */ /* Do not inherit to_flash_erase. */ @@ -857,6 +858,9 @@ update_current_target (void) de_fault (to_get_tib_address, (int (*) (ptid_t, CORE_ADDR *)) tcomplain); + de_fault (to_cannot_step_hw_watchpoints, + (int (*) (void)) + return_zero); #undef de_fault /* Finally, position the target-stack beneath the squashed Index: src/gdb/target.h =================================================================== RCS file: /cvs/src/src/gdb/target.h,v retrieving revision 1.178 diff -u -p -r1.178 target.h --- src/gdb/target.h 16 Apr 2010 07:49:35 -0000 1.178 +++ src/gdb/target.h 22 Apr 2010 23:08:35 -0000 @@ -686,6 +686,9 @@ struct target_ops a Windows OS specific feature. */ int (*to_get_tib_address) (ptid_t ptid, CORE_ADDR *addr); + /* Returns 1 if target needs to disable watchpoints before stepping. */ + int (*to_cannot_step_hw_watchpoints) (void); + int to_magic; /* Need sub-structure for target machine related rather than comm related? */ @@ -1378,6 +1381,9 @@ extern int target_search_memory (CORE_AD #define target_get_tib_address(ptid, addr) \ (*current_target.to_get_tib_address) ((ptid), (addr)) +#define target_cannot_step_hw_watchpoints() \ + (*current_target.to_cannot_step_hw_watchpoints) () + /* Command logging facility. */ #define target_log_command(p) \ Index: src/gdb/config/i386/i386sol2.mh =================================================================== RCS file: /cvs/src/src/gdb/config/i386/i386sol2.mh,v retrieving revision 1.12 diff -u -p -r1.12 i386sol2.mh --- src/gdb/config/i386/i386sol2.mh 26 Oct 2009 18:28:13 -0000 1.12 +++ src/gdb/config/i386/i386sol2.mh 22 Apr 2010 23:08:36 -0000 @@ -1,4 +1,3 @@ # Host: Solaris x86 NATDEPFILES= fork-child.o i386v4-nat.o i386-sol2-nat.o \ procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o -NAT_FILE= nm-i386sol2.h Index: src/gdb/config/i386/nm-i386sol2.h =================================================================== RCS file: /cvs/src/src/gdb/config/i386/nm-i386sol2.h,v retrieving revision 1.19 diff -u -p -r1.19 nm-i386sol2.h --- src/gdb/config/i386/nm-i386sol2.h 1 Jan 2010 07:31:48 -0000 1.19 +++ src/gdb/config/i386/nm-i386sol2.h 22 Apr 2010 23:08:36 -0000 @@ -1,32 +0,0 @@ -/* Native support for i386 running Solaris 2. - Copyright 1998, 1999, 2000, 2007, 2008, 2009, 2010 - Free Software Foundation, Inc. - - This file is part of GDB. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -#ifdef NEW_PROC_API /* Solaris 6 and above can do HW watchpoints */ - -/* Solaris x86 2.6 and 2.7 targets have a kernel bug when stepping - over an instruction that causes a page fault without triggering - a hardware watchpoint. The kernel properly notices that it shouldn't - stop, because the hardware watchpoint is not triggered, but it forgets - the step request and continues the program normally. - Work around the problem by removing hardware watchpoints if a step is - requested, GDB will check for a hardware watchpoint trigger after the - step anyway. */ -#define CANNOT_STEP_HW_WATCHPOINTS - -#endif /* NEW_PROC_API */ Index: src/gdb/config/i386/sol2-64.mh =================================================================== RCS file: /cvs/src/src/gdb/config/i386/sol2-64.mh,v retrieving revision 1.2 diff -u -p -r1.2 sol2-64.mh --- src/gdb/config/i386/sol2-64.mh 26 Oct 2009 18:28:13 -0000 1.2 +++ src/gdb/config/i386/sol2-64.mh 22 Apr 2010 23:08:36 -0000 @@ -1,4 +1,3 @@ # Host: Solaris x86_64 NATDEPFILES= fork-child.o amd64-nat.o i386v4-nat.o i386-sol2-nat.o \ procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o -NAT_FILE= nm-i386sol2.h