From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 56464 invoked by alias); 27 Aug 2015 16:44:34 -0000 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 Received: (qmail 56455 invoked by uid 89); 27 Aug 2015 16:44:33 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL,BAYES_00,KAM_ASCII_DIVIDERS,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=no version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 27 Aug 2015 16:44:32 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id C26528CF65; Thu, 27 Aug 2015 16:44:31 +0000 (UTC) Received: from [127.0.0.1] (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t7RGiUCi030166; Thu, 27 Aug 2015 12:44:30 -0400 Message-ID: <55DF3E6D.20706@redhat.com> Date: Thu, 27 Aug 2015 16:44:00 -0000 From: Pedro Alves User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Ulrich Weigand CC: gdb-patches@sourceware.org Subject: Re: [RFC] Fix SW breakpoint handling for Cell multi-arch References: <20150827162324.33ACF39FA@oc7340732750.ibm.com> In-Reply-To: <20150827162324.33ACF39FA@oc7340732750.ibm.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-SW-Source: 2015-08/txt/msg00798.txt.bz2 On 08/27/2015 05:23 PM, Ulrich Weigand wrote: > Pedro Alves wrote: >> On 08/27/2015 12:54 PM, Ulrich Weigand wrote: >>> Hi Pedro, >>> >>> a second major issue with Cell multi-arch debugging right now is related >>> to the new target-side SW breakpoint handling. Cell uses linux-nat as >>> primary target for the PowerPC side, which now returns true from the >>> to_supports_stopped_by_sw_breakpoint hook. >>> >>> This works fine for the PowerPC side. However, when a breakpoint on the >>> SPU side is hit, the kernel does *not* provide a siginfo with TRAP_BRKPT, >>> but instead simply delivers a SIGTRAP without siginfo. >> >> Does si_code indicate that it was a kernel-generated SIGTRAP (that is, >> SI_KERNEL)? Wondering whether that would still be distinguishable >> from trace/single-step traps and user sent SIGTRAPs. See comment and >> table about x86's si_code in nat/linux-nat.h. I don't know whether >> the SPU has to care about all the cases there, but I suspect >> not (e.g., I'd assume SPU code can't exec?). > > That's an interesting idea. Indeed the kernel uses SI_KERNEL for > SIGTRAPs indicating SW breakpoints on SPU, but nowhere else in all > of PowerPC code. This means simply accepting either TRAP_BRKPT or > SI_KERNEL should work. And indeed the patch appended below works > just as well as the original patch for me. Excellent! > Index: binutils-gdb/gdb/gdbserver/linux-low.c > =================================================================== > --- binutils-gdb.orig/gdb/gdbserver/linux-low.c > +++ binutils-gdb/gdb/gdbserver/linux-low.c > @@ -651,7 +651,7 @@ check_stopped_by_breakpoint (struct lwp_ > { > if (siginfo.si_signo == SIGTRAP) > { > - if (siginfo.si_code == GDB_ARCH_TRAP_BRKPT) > + if (GDB_ARCH_IS_TRAP_BRKPT (siginfo.si_code)) > { > if (debug_threads) > { > Index: binutils-gdb/gdb/linux-nat.c > =================================================================== > --- binutils-gdb.orig/gdb/linux-nat.c > +++ binutils-gdb/gdb/linux-nat.c > @@ -2801,7 +2801,7 @@ check_stopped_by_breakpoint (struct lwp_ > { > if (siginfo.si_signo == SIGTRAP) > { > - if (siginfo.si_code == GDB_ARCH_TRAP_BRKPT) > + if (GDB_ARCH_IS_TRAP_BRKPT (siginfo.si_code)) > { > if (debug_linux_nat) > fprintf_unfiltered (gdb_stdlog, > Index: binutils-gdb/gdb/nat/linux-ptrace.h > =================================================================== > --- binutils-gdb.orig/gdb/nat/linux-ptrace.h > +++ binutils-gdb/gdb/nat/linux-ptrace.h > @@ -135,12 +135,19 @@ struct buffer; > running to a breakpoint and checking what comes out of > siginfo->si_code. > > - The generic Linux target code should use GDB_ARCH_TRAP_BRKPT > - instead of TRAP_BRKPT to abstract out this x86 peculiarity. */ > + The ppc kernel does use TRAP_BRKPT for software breakpoints > + in PowerPC code, but it uses SI_KERNEL for software breakpoints > + in SPU code on a Cell/B.E. However, SI_KERNEL is never seen > + on a SIGTRAP for any other reason. > + > + The generic Linux target code should use GDB_ARCH_IS_TRAP_BRKPT > + instead of TRAP_BRKPT to abstract out these peculiarities. */ > #if defined __i386__ || defined __x86_64__ > -# define GDB_ARCH_TRAP_BRKPT SI_KERNEL > +# define GDB_ARCH_IS_TRAP_BRKPT(X) ((X) == SI_KERNEL) > +#elif defined __powerpc__ > +# define GDB_ARCH_IS_TRAP_BRKPT(X) ((X) == SI_KERNEL || (X) == TRAP_BRKPT) > #else > -# define GDB_ARCH_TRAP_BRKPT TRAP_BRKPT > +# define GDB_ARCH_IS_TRAP_BRKPT(X) ((X) == TRAP_BRKPT) > #endif > > #ifndef TRAP_HWBKPT > LGTM. Thanks, Pedro Alves