From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1091 invoked by alias); 11 May 2012 20:55:45 -0000 Received: (qmail 1078 invoked by uid 22791); 11 May 2012 20:55:44 -0000 X-SWARE-Spam-Status: No, hits=-4.9 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE X-Spam-Check-By: sourceware.org Received: from mail-qa0-f41.google.com (HELO mail-qa0-f41.google.com) (209.85.216.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 11 May 2012 20:55:31 +0000 Received: by qabg27 with SMTP id g27so1926782qab.0 for ; Fri, 11 May 2012 13:55:30 -0700 (PDT) MIME-Version: 1.0 Received: by 10.229.135.210 with SMTP id o18mr4858520qct.109.1336769729751; Fri, 11 May 2012 13:55:29 -0700 (PDT) Received: by 10.229.169.130 with HTTP; Fri, 11 May 2012 13:55:29 -0700 (PDT) In-Reply-To: <201205112011.q4BKB5Mi012054@glazunov.sibelius.xs4all.nl> References: <20120511192133.GA4947@intel.com> <201205112011.q4BKB5Mi012054@glazunov.sibelius.xs4all.nl> Date: Fri, 11 May 2012 20:55:00 -0000 Message-ID: Subject: Re: PATCH: Support x32 siginfo_t conversion From: "H.J. Lu" To: Mark Kettenis Cc: gdb-patches@sourceware.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes 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: 2012-05/txt/msg00454.txt.bz2 On Fri, May 11, 2012 at 1:11 PM, Mark Kettenis wr= ote: >> Date: Fri, 11 May 2012 12:21:33 -0700 >> From: "H.J. Lu" >> >> Hi, >> >> This patch implements x32 siginfo_t conversion. =A0Tested on Linux/x86-6= 4. >> OK to install? >> >> Thanks. >> >> >> H.J. >> -- >> =A0 =A0 =A0 * amd64-linux-nat.c (compat_x32_clock_t): New. >> =A0 =A0 =A0 (compat_x32_siginfo_t): Likewise. >> =A0 =A0 =A0 (compat_x32_siginfo_from_siginfo): Likewise. >> =A0 =A0 =A0 (siginfo_from_compat_x32_siginfo): Likewise. >> =A0 =A0 =A0 (amd64_linux_siginfo_fixup): Call compat_x32_siginfo_from_si= ginfo >> =A0 =A0 =A0 and siginfo_from_compat_x32_siginfo for x32. >> >> diff --git a/gdb/amd64-linux-nat.c b/gdb/amd64-linux-nat.c >> index 3be8404..97c9a49 100644 >> --- a/gdb/amd64-linux-nat.c >> +++ b/gdb/amd64-linux-nat.c >> @@ -591,6 +591,67 @@ typedef struct compat_siginfo >> =A0 =A0} _sifields; >> =A0} compat_siginfo_t; >> >> +/* For x32, clock_t in _sigchld is 64bit aligned at 4 bytes. =A0*/ >> +typedef long __attribute__ ((__aligned__ (4))) compat_x32_clock_t; > > Sorry, but that isn't acceptable. > > Is your X32 ABI really that broken? > >> +typedef struct compat_x32_siginfo >> +{ >> + =A0int si_signo; >> + =A0int si_errno; >> + =A0int si_code; >> + >> + =A0union >> + =A0{ >> + =A0 =A0int _pad[((128 / sizeof (int)) - 3)]; >> + >> + =A0 =A0/* kill() */ >> + =A0 =A0struct >> + =A0 =A0{ >> + =A0 =A0 =A0unsigned int _pid; >> + =A0 =A0 =A0unsigned int _uid; >> + =A0 =A0} _kill; >> + >> + =A0 =A0/* POSIX.1b timers */ >> + =A0 =A0struct >> + =A0 =A0{ >> + =A0 =A0 =A0compat_timer_t _tid; >> + =A0 =A0 =A0int _overrun; >> + =A0 =A0 =A0compat_sigval_t _sigval; >> + =A0 =A0} _timer; >> + >> + =A0 =A0/* POSIX.1b signals */ >> + =A0 =A0struct >> + =A0 =A0{ >> + =A0 =A0 =A0unsigned int _pid; >> + =A0 =A0 =A0unsigned int _uid; >> + =A0 =A0 =A0compat_sigval_t _sigval; >> + =A0 =A0} _rt; >> + >> + =A0 =A0/* SIGCHLD */ >> + =A0 =A0struct >> + =A0 =A0{ >> + =A0 =A0 =A0unsigned int _pid; >> + =A0 =A0 =A0unsigned int _uid; >> + =A0 =A0 =A0int _status; >> + =A0 =A0 =A0compat_x32_clock_t _utime; >> + =A0 =A0 =A0compat_x32_clock_t _stime; >> + =A0 =A0} _sigchld; >> + >> + =A0 =A0/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ >> + =A0 =A0struct >> + =A0 =A0{ >> + =A0 =A0 =A0unsigned int _addr; >> + =A0 =A0} _sigfault; >> + >> + =A0 =A0/* SIGPOLL */ >> + =A0 =A0struct >> + =A0 =A0{ >> + =A0 =A0 =A0int _band; >> + =A0 =A0 =A0int _fd; >> + =A0 =A0} _sigpoll; >> + =A0} _sifields; >> +} compat_x32_siginfo_t __attribute__ ((__aligned__ (8))); > > Same here. =A0I don't think you need alignment here, even with the broken= ABI. > > If it really is too late to fix the X32 ABI, you'll have to write this > portably by splitting _utime and _stime into two 32-bit variables and > write code that correctly sets the upper and lower 32-bits. > > X32 ABI choice is done on purpose. X32 siginfo_t has typedef long __attribute__ ((__aligned__ (4))) compat_x32_clock_t; typedef struct compat_x32_siginfo { int si_signo; int si_errno; int si_code; union { ... /* SIGCHLD */ struct { unsigned int _pid; unsigned int _uid; int _status; compat_x32_clock_t _utime; compat_x32_clock_t _stime; } _sigchld; ... } compat_x32_siginfo_t __attribute__ ((__aligned__ (8))); struct info is aligned at 8 bytes and type of _utime/_stime is aligned at 4 bytes. However, _utime offset is 3 * 4 + 3 * 4 =3D=3D 24 bytes. So in reality, the addresses of _utime/_stime are 8 bytes aligned. There are no needs to split _utime and _stime into two 32-bit variables since their addresses are 64bits aligned. Thanks. --=20 H.J.