From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by sourceware.org (Postfix) with ESMTPS id 07B6E3887023 for ; Wed, 8 Apr 2020 14:59:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 07B6E3887023 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=1586357971; bh=xAv29Z3GSyP6VOUQ5OhG6qjI0Oo9seFYwbHeZ4C0Jhc=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=JgrOfsVwYp9WAEGa6Kkp/mK+vNfADu5ca/JfrIUazHEU9jfhlNJ6vGO/z8GwmLR54 W3NE7QQ7dcwKLHQUEDZhFPooDsP3qDFjjvV/Letg2g2SvH3cqe4XS7CUGWXXNgAsjq pygJo9x9kAeGxI1KBt96Hf5JXFVQQAkURSwoiZK0= 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 1MatVh-1ikwTx2ejL-00cSsZ; Wed, 08 Apr 2020 16:59:30 +0200 From: Kamil Rytarowski To: gdb-patches@sourceware.org Cc: tom@tromey.com, jhb@FreeBSD.org, simark@simark.ca, Kamil Rytarowski Subject: [PATCH v2] Add SVR4 psABI specific parser for AUXV entries Date: Wed, 8 Apr 2020 16:58:32 +0200 Message-Id: <20200408145832.24243-1-n54@gmx.com> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200408021426.28406-1-n54@gmx.com> References: <20200408021426.28406-1-n54@gmx.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:q9oqLhvkGyYSvMrHruVIjUYWIIv7ePJJiWM6Ah8lH7zKxz6vv9S YXguLsCBcD288W4hI0WoXh0HDWr+PiPpcOWYBOM7X5irsTkQYnuEYT3awECeXaKXihzIITe sY0xCVtzyWTa+60rGXa1mbJXZrPWqiw/HePq7/zt7Y3w5FdFJWNYAWeg+hmXyNLb1bgP0n0 PnUWCBJuCnt8WF5M4hC4A== X-UI-Out-Filterresults: notjunk:1;V03:K0:vHoDk0v5RVY=:y/MnuWyDDifL8i5SIinOVs ATmr8SIFc9ULWXllgpRYzxLafB4LQ670Kjsz1YdbAJ1BZj30qk8jrb591Ye5cSOw6cLzqMZRj l4OVeWFmcCQkNpGSgD0vL3uv4fKnyEJMJCvqsLP6dePuDzhxD8zG3OqYVMuohoJCQXTPIV/CY TqRpgK1nr+fIw6gQsA0HDziYbGAHPZtyaX+zSKbIFxpiNiapSrPRW1eqgVZJnY/s5UGu1Flqa WEX2ZZo/33rfLEUh5B6Z7e1w8873Go4ZAEXImKqB4zu653VQuLrUUNxw7zHG4amxv9y5LvbYP k06Qfs4K9ISWbrdikO9d0aTEU6cZxbNmoK/mixQTFuA9ihVW1fmeie/evOwzTPFFvkqGWjAcO npx0n0LSX+QTBn17exRteFjYa+Zzf7LaHCruIzkCpipd7GyEXoxACqhQi7L5DMIwl0WT2yb4Y n+zPgHdaYrjd2zTmHOaQorGZxm4TK9D2Yqg2qFSnM4Cgw48uDMbMlvZNyS/VZVyrK6koPCBKY yiMyuubkYUHV4mv5sRZj/WcKPwhCTGwfdXXvv/7g0ieQgBnrezVBtlVCYMIt9DgpT9UY+54AA xW7R6l55eF4aB0ospMg0JI3DxNegXVVGY8WwN4IAwlJPl2BT3z30MkS6fcoK7TGss1+IneAhP W095RTATIIw/kpuF8kPcjjz+vh490yP6B8haHWoDFE3ILiBoW5JHYo0Owwf6LDE2pZBHjMbyf 2O2n78lUtLFy1B0CU4Kq1UdgYLZ6hLRkOh0PC8A4TLRrsxwuwjGIvx37xs6biLnRnNpBTxgIJ URqKjYzR/YnmEjoAYiwE4DVJxN+rYOFbdk5u0rF61XsVJF0uFCTJcq5cTbZOAQZMBzj+k+z1Q Gi4lvw+EirF90rmf/PuqjaemnIAxrAsNj7ZO31hUp/cZvNjlvNUPKJhrdriHy0nVhcR02fJf3 nJHzlTEeGb55iOeNXt9P4DSabVbl0QhsliiIXfejvpKyGSCxN36YzuJgZMRDbW8AoB5sTYtU5 1wIC1vzu/ZYuP+7sobtIDegYfPl8Y1D3MY7CarcCLdIanIuGACeqHYVN2xVmfIQ2MOoLLR3wB F5y1ENM69w0rIbE1W538Axn7hZKJgI2DsKtQuBlZtYyg145jUyM2wam2wGhDzL2orQ3c23aqi NlvtIjA9t2stOc6CN1kryPVQh5gcA4ujQmFS3mVqNmQhAW0uLuMC8KtD9opgyAb9fGEE0= 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: Wed, 08 Apr 2020 14:59:55 -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..28e8d2f704d 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..c1d11ea2c7b 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