From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) by sourceware.org (Postfix) with ESMTPS id 952D7385DC3E for ; Wed, 8 Apr 2020 02:16:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 952D7385DC3E 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=1586312174; bh=Tp2OXq6QPxUnaYoiZrKlTVlrp9mIlvq7KCSrMzGTnLw=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date; b=AroH/Co66V6OUhzZ/ov9ipvdMxqCrunuFJQfoTaWVsypE2faVfcfaW19Nc/opJzhX NInJx3jBP2FkOxxegEcWQG8eYolS45nFHPGoj7L8hp7KwayiisGwdX7xS4Nq8bSE+B p2waZ+PyNrxlEMfJV28eKgiJ/W9jFhr2n04C8Nqs= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([89.79.191.25]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1MfpOT-1iorEi3zJZ-00gIc6; Wed, 08 Apr 2020 04:16:14 +0200 From: Kamil Rytarowski To: gdb-patches@sourceware.org Cc: tom@tromey.com, jhb@FreeBSD.org, simark@simark.ca, Kamil Rytarowski Subject: [PATCH] Add SVR4 psABI specific parser for AUXV entries Date: Wed, 8 Apr 2020 04:14:26 +0200 Message-Id: <20200408021426.28406-1-n54@gmx.com> X-Mailer: git-send-email 2.25.0 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:GNyGwvIDzP5oEBcp3C47lDX4vTiifloO3zpJ58WYg4wqz3Xf+Lv lZr3syusOF6VgeTQQyWmhu1VTfFEqk3THi0xZ982i+/tpQKBlKHzrksE8jRcgI8J0ZHAX1o jCYRGFHeqlYUpr4mOY+3twmxk6OxNKJVJ3JFY1PIAabokSr6ks4apJmzP6t4+OtXZh7xi34 7jMdTSyfZaIu3+Oak4x+g== X-UI-Out-Filterresults: notjunk:1;V03:K0:y8DvvRIr1EQ=:0Ov1t3k56jGcbbFrQdbOqk GmKxfV4yIm5z4GyhlL96jSUAQ8F1IgYIdWW0x0fjLUdhIHmoLdBn6pkARvA0XlxJzhpJecaZs SLz15n7ge0ki3GR9eJzPY8FvrxGNVcxdKpyul/0sjuvIVjfkXRZgeT3TjbL9crjoWLkn2MM1l B0bMy3SAGWSt7oxXenseQNfd5GhKe+eh15kmnbxFE1Hxzb/P0CBY3NRvnnjBk+wpkJ6vV15gZ y65oNEsiX8R4+Zv1Vixfhz8O87KoU1hB3zfGmhmFI51K7ZcaIA8StyjPgRUqdHU7+h5HvfDpT avinVL1OP1UREUqKXTpEta1s6jzO1eQs93SwFR9BUEN/K3QBNbDiDwp+CBu5t1Kmm2gfna2I4 e++Rg3FhwZbtNIhnl6sQ7y5SXAmb7Sh7g0m537FdP5rZNNC6u9+e6Su0Gv/VGagmf6q66CqRx 0n2ks7TBwaxNExLws8TxHeqs1jWOYjwQZ3rjhGKbDOOykMh3kMry+tWtNeeuFgvQy3y1crbRg 8iRyDQvlh0rqxQqf83rsiHYGPRp4Qt48YzHAeXNWtyTaJ7VSFlZUxNcFD6Z3PZmCoEUw1uVpu umcv0MhMPpH/fQacFb0b0yUJydvsOwLWUTdhV54Bt4xqHTmzPGoeqsj8z0IGUAAa63TXKw22I zG2QgnEryCB9nW1BaFI/krSiobuZNZxOyPmAJw9s6mUju2FWZrPYvV+ZzXR14LT3XDSqr1nqm XPVgymp9iGDzJBI/ySengiEDOTEERcZWk3nFfZ+lTTuu2QfAf6hz4NXDa1JvLsHq/JV9tEMTo dNBMP1lMEIP+EonoBRulo6GN4RMe07ZtMC9dh+oL9ldC5I8nLyYvtE3DUljdDKpbfvWvTbtcQ xFhZgoV+SpqzrADAz64aEmDvrXzQTb/R+ARCMwYg5Th0rQ26qei239iOrcHE7qcePjGZlw0fD GjDuj9lU5KrLFg3HZPBEVL4qqqmmIQSAbjBIrrycvUQvtDEtio9EA0l9XVHCxrgNHW3KmI8LD QAg3pWXibVRvrSClbCL77OwP6o7RwhwW+baj3dBmnoM6BwJplcaqHm1ijsbOnw/wL9WzvSpOM +P23eMz60akYTJMdfX6tTIvucLyBnD2Nn703MX3IeMyMND7d56PwuYxCJMyOyXD+mF7wWV1XW GqnC+xB9i3syOADhyHsbpqDBSDzKjCbx4xrbqFaArzwH+h+i04RPp/57NtEqfIPWyASJY= 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 02:16:38 -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 | 60 ++++++++++++++++++++++++++++++++++++------------- gdb/auxv.h | 7 ++++++ gdb/nbsd-tdep.c | 2 ++ gdb/obsd-tdep.c | 30 ++----------------------- 5 files changed, 70 insertions(+), 43 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..240f32236b3 100644 =2D-- a/gdb/auxv.c +++ b/gdb/auxv.c @@ -248,34 +248,64 @@ 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) +/* Generic auxv_parse body shared with default_auxv_parse() and + svr4_auxv_parse(). */ + +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)= ; + 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; } +/* 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) +{ + struct type *ptr_type =3D builtin_type (target_gdbarch ())->builtin_dat= a_ptr; + const int sizeof_auxv_type =3D TYPE_LENGTH (ptr_type); + + return generic_auxv_parse (target_gdbarch (), readptr, endptr, typep, v= alp, + 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. + Return 1 if an entry was read into *TYPEP and *VALP. */ +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..0056d39955c 100644 =2D-- a/gdb/auxv.h +++ b/gdb/auxv.h @@ -31,6 +31,13 @@ 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. */ + +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