From patchwork Sat Mar 5 19:10:51 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 85548 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 52168B7043 for ; Sun, 6 Mar 2011 06:11:01 +1100 (EST) Received: (qmail 4363 invoked by alias); 5 Mar 2011 19:10:59 -0000 Received: (qmail 4352 invoked by uid 22791); 5 Mar 2011 19:10:59 -0000 X-SWARE-Spam-Status: No, hits=-4.4 required=5.0 tests=AWL, BAYES_00, NO_DNS_FOR_FROM, RCVD_IN_DNSWL_HI, TW_OV, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mga11.intel.com (HELO mga11.intel.com) (192.55.52.93) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 05 Mar 2011 19:10:53 +0000 Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 05 Mar 2011 11:10:52 -0800 X-ExtLoop1: 1 Received: from gnu-6.sc.intel.com ([10.3.194.135]) by fmsmga002.fm.intel.com with ESMTP; 05 Mar 2011 11:10:52 -0800 Received: by gnu-6.sc.intel.com (Postfix, from userid 500) id E49FD180B25; Sat, 5 Mar 2011 11:10:51 -0800 (PST) Date: Sat, 5 Mar 2011 11:10:51 -0800 From: "H.J. Lu" To: gcc-patches@gcc.gnu.org Subject: Re: [x32] PATCH: Use long long to check rt_sigreturn syscall Message-ID: <20110305191051.GA4614@intel.com> Reply-To: "H.J. Lu" References: <20110304235006.GA5161@intel.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20110304235006.GA5161@intel.com> User-Agent: Mutt/1.5.21 (2010-09-15) Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org On Fri, Mar 04, 2011 at 03:50:07PM -0800, H.J. Lu wrote: > Hi, > > I checked this patch into x32 branch. > > > H.J. > --- > commit f8dd1a34cd51d52589cac5833dbf60e99e258504 > Author: H.J. Lu > Date: Fri Mar 4 15:22:45 2011 -0800 > > Use long long to check rt_sigreturn syscall. > > diff --git a/gcc/ChangeLog.x32 b/gcc/ChangeLog.x32 > index a3b7364..1bee1d9 100644 > --- a/gcc/ChangeLog.x32 > +++ b/gcc/ChangeLog.x32 > @@ -1,3 +1,8 @@ > +2011-03-04 H.J. Lu > + > + * config/i386/linux-unwind.h (x86_64_fallback_frame_state): Use > + long long to check rt_sigreturn syscall. > + > 2011-03-02 H.J. Lu > > PR rtl-optimization/47958 > diff --git a/gcc/config/i386/linux-unwind.h b/gcc/config/i386/linux-unwind.h > index c5f7ea0..11afd86 100644 > --- a/gcc/config/i386/linux-unwind.h > +++ b/gcc/config/i386/linux-unwind.h > @@ -45,7 +45,7 @@ x86_64_fallback_frame_state (struct _Unwind_Context *context, > > /* movq __NR_rt_sigreturn, %rax ; syscall */ > if (*(unsigned char *)(pc+0) == 0x48 > - && *(unsigned long *)(pc+1) == 0x050f0000000fc0c7) > + && *(unsigned long long *)(pc+1) == 0x050f0000000fc0c7ULL) > { > struct ucontext *uc_ = context->cfa; > /* The void * cast is necessary to avoid an aliasing warning. This isn't right since x32 has a different system call number. I checked in this patch. H.J. diff --git a/gcc/ChangeLog.x32 b/gcc/ChangeLog.x32 index 1bee1d9..5389f19 100644 --- a/gcc/ChangeLog.x32 +++ b/gcc/ChangeLog.x32 @@ -1,3 +1,8 @@ +2011-03-05 H.J. Lu + + * config/i386/linux-unwind.h (x86_64_fallback_frame_state): + Support x32 system call. + 2011-03-04 H.J. Lu * config/i386/linux-unwind.h (x86_64_fallback_frame_state): Use diff --git a/gcc/config/i386/linux-unwind.h b/gcc/config/i386/linux-unwind.h index 11afd86..a9ddb7e 100644 --- a/gcc/config/i386/linux-unwind.h +++ b/gcc/config/i386/linux-unwind.h @@ -43,9 +43,15 @@ x86_64_fallback_frame_state (struct _Unwind_Context *context, struct sigcontext *sc; long new_cfa; - /* movq __NR_rt_sigreturn, %rax ; syscall */ + /* movq __NR_rt_sigreturn, %rax ; syscall. FIXME: x32 system call + number may change. */ +#ifdef __LP64__ +#define RT_SIGRETURN_SYSCALL 0x050f0000000fc0c7ULL +#else +#define RT_SIGRETURN_SYSCALL 0x050f0000100fc0c7ULL +#endif if (*(unsigned char *)(pc+0) == 0x48 - && *(unsigned long long *)(pc+1) == 0x050f0000000fc0c7ULL) + && *(unsigned long long *)(pc+1) == RT_SIGRETURN_SYSCALL) { struct ucontext *uc_ = context->cfa; /* The void * cast is necessary to avoid an aliasing warning.