From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id 05C5A385BF81 for ; Thu, 9 Apr 2020 00:04:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 05C5A385BF81 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=simark.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=simark@simark.ca Received: from [10.0.0.11] (unknown [192.222.164.54]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id D94001E827; Wed, 8 Apr 2020 20:04:25 -0400 (EDT) Subject: Re: [PATCH v2] Add SVR4 psABI specific parser for AUXV entries To: Kamil Rytarowski , gdb-patches@sourceware.org Cc: tom@tromey.com, jhb@FreeBSD.org References: <20200408021426.28406-1-n54@gmx.com> <20200408145832.24243-1-n54@gmx.com> From: Simon Marchi Message-ID: <46801343-faf4-7db0-5dbe-35bd23b14603@simark.ca> Date: Wed, 8 Apr 2020 20:04:25 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.6.0 MIME-Version: 1.0 In-Reply-To: <20200408145832.24243-1-n54@gmx.com> Content-Type: text/plain; charset=utf-8 Content-Language: fr Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-24.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 09 Apr 2020 00:04:28 -0000 > diff --git a/gdb/auxv.c b/gdb/auxv.c > index c13d7a22eb9..28e8d2f704d 100644 > --- a/gdb/auxv.c > +++ b/gdb/auxv.c > @@ -248,34 +248,65 @@ memory_xfer_auxv (struct target_ops *ops, > return procfs_xfer_auxv (readbuf, writebuf, offset, len, xfered_len); > } > > -/* Read one auxv entry from *READPTR, not reading locations >= ENDPTR. > - Return 0 if *READPTR is already at the end of the buffer. > - Return -1 if there is insufficient buffer for a whole entry. > - Return 1 if an entry was read into *TYPEP and *VALP. */ > -int > -default_auxv_parse (struct target_ops *ops, gdb_byte **readptr, > - gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) > +/* This function compared to other auxv_parse functions: it takes the size of > + the auxv type field as a parameter. */ > + > +static int > +generic_auxv_parse (struct gdbarch *gdbarch, gdb_byte **readptr, > + gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp, > + int sizeof_auxv_type) > { > - const int sizeof_auxv_field = gdbarch_ptr_bit (target_gdbarch ()) > - / TARGET_CHAR_BIT; > - const enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); > + struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr; > + const int sizeof_auxv_val = TYPE_LENGTH (ptr_type); > + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); > gdb_byte *ptr = *readptr; > > if (endptr == ptr) > return 0; > > - if (endptr - ptr < sizeof_auxv_field * 2) > + if (endptr - ptr < 2 * sizeof_auxv_val) > return -1; > > - *typep = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order); > - ptr += sizeof_auxv_field; > - *valp = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order); > - ptr += sizeof_auxv_field; > + *typep = extract_unsigned_integer (ptr, sizeof_auxv_type, byte_order); > + /* Even if the auxv type takes less space than an auxv value, there is > + padding after the type such that the value is aligned on a multiple of > + its size (and this is why we advance by `sizeof_auxv_val` and not > + `sizeof_auxv_type`. */ The parenthesis in the comment is not closed. > diff --git a/gdb/auxv.h b/gdb/auxv.h > index a5a932ec80e..c1d11ea2c7b 100644 > --- a/gdb/auxv.h > +++ b/gdb/auxv.h > @@ -25,12 +25,27 @@ > /* See "include/elf/common.h" for the definition of valid AT_* values. */ > > /* The default implementation of to_auxv_parse, used by the target > - stack. */ > + stack. > > + Read one auxv entry from *READPTR, not reading locations >= ENDPTR. > + Return 0 if *READPTR is already at the end of the buffer. > + Return -1 if there is insufficient buffer for a whole entry. > + Return 1 if an entry was read into *TYPEP and *VALP. */ > extern int default_auxv_parse (struct target_ops *ops, gdb_byte **readptr, > gdb_byte *endptr, CORE_ADDR *typep, > CORE_ADDR *valp); > > +/* The SVR4 psABI implementation of to_auxv_parse, that uses an int to > + store the type rather than long as assumed by the default parser. > + > + Read one auxv entry from *READPTR, not reading locations >= ENDPTR. > + Return 0 if *READPTR is already at the end of the buffer. > + Return -1 if there is insufficient buffer for a whole entry. > + Return 1 if an entry was read into *TYPEP and *VALP. */ > +extern int svr4_auxv_parse (struct gdbarch *gdbarch, gdb_byte **readptr, > + gdb_byte *endptr, CORE_ADDR *typep, > + CORE_ADDR *valp); The last two lines are not properly aligned on the parenthesis. Simon