From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) by sourceware.org (Postfix) with ESMTPS id 94BC43887032 for ; Thu, 9 Apr 2020 00:57:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 94BC43887032 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=gmx.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=n54@gmx.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1586393843; bh=DAvaeeYFdFtceSGD/uoX4XMoOTFsgr8UcJPSwUtf0tM=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=Om+JNZt6KmxG2avwMvrFzxPlI2q+SyJg62FLu2FyWR7SSqLevmfYyJvk5Y4WPGrgJ uawXYjoDDpKYX75uAwX35TC5BG3DiQOHVOns5QQ8lvfdxRRcMqyyrYAsDalaXvz+As 9G0EadE60HwMKg0hdotWUKodZ/ZXGVlo/ICDi3A4= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([89.79.191.25]) by mail.gmx.com (mrgmx004 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MEFzr-1jUI7T3zDZ-00AFGl; Thu, 09 Apr 2020 02:57:23 +0200 From: Kamil Rytarowski To: gdb-patches@sourceware.org Cc: tom@tromey.com, jhb@FreeBSD.org, simark@simark.ca, Kamil Rytarowski Subject: [PATCH v3] Add SVR4 psABI specific parser for AUXV entries Date: Thu, 9 Apr 2020 02:56:30 +0200 Message-Id: <20200409005630.25839-1-n54@gmx.com> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200408145832.24243-1-n54@gmx.com> References: <20200408145832.24243-1-n54@gmx.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:XZzft6eIhMKxzG5ukB1rNTsa/u4HMsj8SAUcPrVQVXGhci9FWOf ZkxzYUak1N8ohEhJvE9WjEk0hKqneAz8VldhpcTiPSAHVDp8rSkj2RMcYWQt6VMBDS3dw5t LkJEG2OPwFlRFmQqlsu8YeU0fZduQEot8+p3T5RPynj6QUC2rHvy6VMGG/bC5MLljSerx2J iitutxZQcoQb55q+P2AZg== X-UI-Out-Filterresults: notjunk:1;V03:K0:rO4onVaG9w0=:2cOoOAx2jd6yI8/LZN6s0F 2Z+8NOMXnZPZfXZW+6oNnaQVEduvAiFuyY6rucmw7Mz3td04dvEwlxUDuCa9nd7GdHuDH+v7t DwmZrxcH1uge+YZyr5fnZhkjeCYil3RUOS2LXHolTHUNizOAar63NP18gt3YHUp0XeNnXVZPT YcLpSeHU82neGmZ6BVmNqCcvBObCWWehaJfR6+d4GdlkQ808DPm8aSsW57h3zNYx7aLkwZNVW /WaQQj7l3i1DOeXiZXWqE2T6azqKp3Gp67FWVY8FCTGqtbyG0oiwNaVrC4px1E+l+gJ5CjWbz GnMKu5U5kI20BDZ6qCdHr4/9BTHDhynYASu8mBtDMvex5be5f5kAidUjtzlSx89/VjUId6kaV +NsaFtynAYTqwIdAA9UQzqiOoVeSrPbCZtTZ3A+Ru/iVReagCeOBs6DLAyjpM1RwTZNF+Krvh rRQopxEaCANkKGIS8rWxhbzVd/g0Gb7ay3FQ3HGn+j7FJiDnao18Ai5RICRFv4VHhlddLjEty LWHzDO86/bA/9P8baaKwQEcjnxYbbzSoV3mT33v/t0M1Rj7sWqPgjU/v6I2FFx07NwIGPYAz4 TDEUtw4VcISjLfJVflxJoyxh+uaEJd04B+kComv3df7D/saCN2VnV0L+PHvxLj/j4+gzULTAP hTssz8dt2SvHYEYfZZkoT0MZ0QVHfFB/ipFeWcu3S7up38fR18Zg8jrof5ubqOKkDdyvpyM9j E0nSlV+e8OWe1rGtNq68ddI0RLXxLwK/HIldaC11k4+Yz2IeWhlh82raJfmOzRT97ziC+MSs4 dRluiPj8xGcqSpv/KBCrormkcPO/V4geE8hMreI5CQHMW41NEnhAFfUB5tASL7qXbSz29uv3b iBd0K5mjj5rG9sDDiS3glbX368+hspO3l2PpbDtxyPZMkFR9s5sDtKfascoWItHgaLou25rPd /7LDp0a33R3foX5E9AzYlCmWqwgrp4UqRnm4+o8fI2C+b3XllVwqb8sSYOc7mXCqZVUS34hJH lnQrpvgDirWtOahhM7xt9dBwa85psi5tkcr0IsYFv/81CTLAizjbieZg+mAaSnehjtmBQUWjh tcnj8C9OJ2xzBkfrjs3BEGJGN/Rth4FiOZxWZtHois+HSUy0tl526o/gFAWw6aagat7IoydK9 DFDYdIcQyDgi/xaLeq3kTlzSsVmDA/IUifZdYnz+VU3QwagkvSP/E1XteAioObT0Wfekc= X-Spam-Status: No, score=-28.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, 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:57:45 -0000 NetBSD and OpenBSD always use an int to store the type as defined in the SVR4 psABI specifications rather than long as assumed by the default parser. Define svr4_auxv_parse() that shares code with default_auxv_parse(). Remove obsd_auxv_parse() and switch OpenBSD to svr4_auxv_parse(). Remove not fully accurate comment from obsd-tdep.c. Use svr4_auxv_parse() on NetBSD. gdb/ChangeLog: * auxv.h (svr4_auxv_parse): New. * auxv.c (default_auxv_parse): Split into default_auxv_parse and generic_auxv_parse. (svr4_auxv_parse): Add. * obsd-tdep.c: Include "auxv.h". (obsd_auxv_parse): Remove. (obsd_init_abi): Remove comment. (obsd_init_abi): Change set_gdbarch_auxv_parse passed argument from `obsd_auxv_parse' to `svr4_auxv_parse'. * nbsd-tdep.c: Include "auxv.h". (nbsd_init_abi): Call set_gdbarch_auxv_parse. =2D-- gdb/ChangeLog | 14 ++++++++++++ gdb/auxv.c | 61 +++++++++++++++++++++++++++++++++++++------------ gdb/auxv.h | 17 +++++++++++++- gdb/nbsd-tdep.c | 2 ++ gdb/obsd-tdep.c | 30 ++---------------------- 5 files changed, 80 insertions(+), 44 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 255262a2f27..1bb3c0892f2 100644 =2D-- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2020-04-07 Kamil Rytarowski + + * auxv.h (svr4_auxv_parse): New. + * auxv.c (default_auxv_parse): Split into default_auxv_parse + and generic_auxv_parse. + (svr4_auxv_parse): Add. + * obsd-tdep.c: Include "auxv.h". + (obsd_auxv_parse): Remove. + (obsd_init_abi): Remove comment. + (obsd_init_abi): Change set_gdbarch_auxv_parse passed argument + from `obsd_auxv_parse' to `svr4_auxv_parse'. + * nbsd-tdep.c: Include "auxv.h". + (nbsd_init_abi): Call set_gdbarch_auxv_parse. + 2020-04-07 Kamil Rytarowski * nbsd-tdep.c: Include "objfiles.h". diff --git a/gdb/auxv.c b/gdb/auxv.c index c13d7a22eb9..2ffcd73b988 100644 =2D-- 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 >=3D 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 siz= e 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 =3D gdbarch_ptr_bit (target_gdbarch ()) - / TARGET_CHAR_BIT; - const enum bfd_endian byte_order =3D gdbarch_byte_order (target_gdbarch= ()); + struct type *ptr_type =3D builtin_type (gdbarch)->builtin_data_ptr; + const int sizeof_auxv_val =3D TYPE_LENGTH (ptr_type); + enum bfd_endian byte_order =3D gdbarch_byte_order (gdbarch); gdb_byte *ptr =3D *readptr; if (endptr =3D=3D ptr) return 0; - if (endptr - ptr < sizeof_auxv_field * 2) + if (endptr - ptr < 2 * sizeof_auxv_val) return -1; - *typep =3D extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order= ); - ptr +=3D sizeof_auxv_field; - *valp =3D extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order)= ; - ptr +=3D sizeof_auxv_field; + *typep =3D 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`). */ + ptr +=3D sizeof_auxv_val; + *valp =3D extract_unsigned_integer (ptr, sizeof_auxv_val, byte_order); + ptr +=3D sizeof_auxv_val; *readptr =3D ptr; return 1; } +/* See auxv.h. */ + +int +default_auxv_parse (struct target_ops *ops, gdb_byte **readptr, + gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) +{ + struct gdbarch *gdbarch =3D target_gdbarch (); + struct type *ptr_type =3D builtin_type (gdbarch)->builtin_data_ptr; + const int sizeof_auxv_type =3D TYPE_LENGTH (ptr_type); + + return generic_auxv_parse (gdbarch, readptr, endptr, typep, valp, + sizeof_auxv_type); +} + +/* See auxv.h. */ + +int +svr4_auxv_parse (struct gdbarch *gdbarch, gdb_byte **readptr, + gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) +{ + struct type *int_type =3D builtin_type (gdbarch)->builtin_int; + const int sizeof_auxv_type =3D TYPE_LENGTH (int_type); + + return generic_auxv_parse (gdbarch, readptr, endptr, typep, valp, + sizeof_auxv_type); +} + /* Read one auxv entry from *READPTR, not reading locations >=3D ENDPTR. Return 0 if *READPTR is already at the end of the buffer. Return -1 if there is insufficient buffer for a whole entry. diff --git a/gdb/auxv.h b/gdb/auxv.h index a5a932ec80e..9525801e37d 100644 =2D-- 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 >=3D 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 >=3D 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); + /* Read one auxv entry from *READPTR, not reading locations >=3D ENDPTR. Return 0 if *READPTR is already at the end of the buffer. Return -1 if there is insufficient buffer for a whole entry. diff --git a/gdb/nbsd-tdep.c b/gdb/nbsd-tdep.c index 1d7230feef8..158a43bebaa 100644 =2D-- a/gdb/nbsd-tdep.c +++ b/gdb/nbsd-tdep.c @@ -20,6 +20,7 @@ along with this program. If not, see . = */ #include "defs.h" +#include "auxv.h" #include "solib-svr4.h" #include "nbsd-tdep.h" #include "gdbarch.h" @@ -362,4 +363,5 @@ nbsd_init_abi (struct gdbarch_info info, struct gdbarc= h *gdbarch) set_gdbarch_gdb_signal_from_target (gdbarch, nbsd_gdb_signal_from_targe= t); set_gdbarch_gdb_signal_to_target (gdbarch, nbsd_gdb_signal_to_target); set_gdbarch_skip_solib_resolver (gdbarch, nbsd_skip_solib_resolver); + set_gdbarch_auxv_parse (gdbarch, svr4_auxv_parse); } diff --git a/gdb/obsd-tdep.c b/gdb/obsd-tdep.c index 1c1f574ef19..f2c4d298851 100644 =2D-- a/gdb/obsd-tdep.c +++ b/gdb/obsd-tdep.c @@ -18,6 +18,7 @@ along with this program. If not, see . = */ #include "defs.h" +#include "auxv.h" #include "frame.h" #include "symtab.h" #include "objfiles.h" @@ -289,32 +290,6 @@ obsd_gdb_signal_to_target (struct gdbarch *gdbarch, return -1; } -static int -obsd_auxv_parse (struct gdbarch *gdbarch, gdb_byte **readptr, - gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) -{ - struct type *int_type =3D builtin_type (gdbarch)->builtin_int; - struct type *ptr_type =3D builtin_type (gdbarch)->builtin_data_ptr; - const int sizeof_auxv_type =3D TYPE_LENGTH (int_type); - const int sizeof_auxv_val =3D TYPE_LENGTH (ptr_type); - enum bfd_endian byte_order =3D gdbarch_byte_order (gdbarch); - gdb_byte *ptr =3D *readptr; - - if (endptr =3D=3D ptr) - return 0; - - if (endptr - ptr < 2 * sizeof_auxv_val) - return -1; - - *typep =3D extract_unsigned_integer (ptr, sizeof_auxv_type, byte_order)= ; - ptr +=3D sizeof_auxv_val; /* Alignment. */ - *valp =3D extract_unsigned_integer (ptr, sizeof_auxv_val, byte_order); - ptr +=3D sizeof_auxv_val; - - *readptr =3D ptr; - return 1; -} - void obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { @@ -323,6 +298,5 @@ obsd_init_abi (struct gdbarch_info info, struct gdbarc= h *gdbarch) set_gdbarch_gdb_signal_to_target (gdbarch, obsd_gdb_signal_to_target); - /* Unlike Linux, OpenBSD actually follows the ELF standard. */ - set_gdbarch_auxv_parse (gdbarch, obsd_auxv_parse); + set_gdbarch_auxv_parse (gdbarch, svr4_auxv_parse); } =2D- 2.25.0