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 1BFE83840C0C for ; Tue, 28 Jul 2020 15:59:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 1BFE83840C0C 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=1595951969; bh=Tul6nB3paZdSA2YZPWOAx7bPn9OsbPRdrpQ4nUgO3v4=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=MvZ6N1BkCsH4BuyCY3LlL1VBT204JkO/0UoLVZrZg9sZ4yJ9xwKEXTa47yHiT/RuJ Iho6wiP4CLT7a8xzRukPt9IAeesb924b9uetPO4FZWceO7MZOPyw/TnlZ+LVbGOVXB rD3UwsT6IknM5bcgB1H13eqma8bTEcudhBYQkbio= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([89.79.191.25]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1M89Gj-1k5goM2Pul-005Fwz; Tue, 28 Jul 2020 17:59:29 +0200 From: Kamil Rytarowski To: gdb-patches@sourceware.org, jhb@FreeBSD.org, simark@simark.ca Subject: [PATCH v3] Implement xfer_partial TARGET_OBJECT_SIGNAL_INFO for NetBSD Date: Tue, 28 Jul 2020 17:58:44 +0200 Message-Id: <20200728155844.6609-1-n54@gmx.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200728150418.19720-1-n54@gmx.com> References: <20200728150418.19720-1-n54@gmx.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:SQB7Y0ug1domirUYTVrHfFyCxwGoG7nZtAs2zbjKstE0JeTaDiP 6aik6T9fwmafiloUT11jq5DKsu4PVeYvRwdVZzdzkR3puiAglHx9N+8t/If3ik7fQrKv4KH i89Phcg7pWO7H3yYtG4whh6uNwu/tiL/r87qC47lBXZEcsuc4ajSeYIH5VBEA259l9NR7qi 74qyOCJhC+bvouiP863wQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:1G8JMqqv3xE=:TS7xqVzscltBW87U6BHmZB Kic8L65yFfXz1Kt43V4G495kHNNVa6BJJ1QoPk8lds33ug5Yrz6Y4myLMR1f6TCVKrqLrXlQs N2RqNM5plYDpk2Zo9jNq1mEvIyr55nuh9iF4Zjp3l1AMNU4R/fyuX6m9ZDwmenAYnpNEf4aqM TjOLFXRiEr+D5mGLIB42dstXiDh8UR3tgLwLGuBKfB/ClUnh9Mbdcyfk0dM+UBOackHo7mKnW ASprl8XvQB0wc6LiD8V2DII0ShFTrf2SsuYzxGWcuMUp5CtlXuOD3wPphFCYvjgs/J+AP4FK9 VbFEidTamhT8SS6wXXWKGxflv7tWtmkbplFM7Ly76n9s/bM5rTPZeiyLHSExT9QCU7VZ6dI7V DWmJZOwr2jpJlSupPMgPT7SARvHMBcFL5lS/rbEfZdeg6avGzv/lgiHvYAZo+DGQQhuL8duYh ACpPUU7BoCrzgURg4ubWYvmY+/GByehXh4TeWwrMS8yrQf7Cnp9G93DiADc9dZJHWpmP6WAZQ tuHYcrcaBVsnUs6kmw8lECfNbUFB/gGN7mdZzUXZjRDqR0/qSfcP3Ir5CZ67qqp9GNA7dT51w 8YgBqKRgo28i92c3GPaxATokBgBWPINhUE11qPR4p840tflHqOHORl36t/X0wWlq1cdUOe1hI kU8H31SaatUrdSethQ4BtxSwPMrKZvx6kPfFyVfGPwK0rrcrhdcPMYmQcjsbvlJ3f4BcXSL9b KUHYcwEpvX6JI1Uq7JTMH/C5eGv3MJ+waLkRHJAPIapeuxQ4L+Ap1EELhW6G1sa+pAXKz2XjD b2SnzKFANiyDEpY+nDl9MYW0tzW9UoxumZm6OFChl1PlLg49kg3ZdgGhUvhZjAGU5Y1M3MT/o xWqiwaxmaCajNonihtTjS8/ejT6BAWrW2jtAKPNC7+ak4bTs6At7XE2NHuvf8mR0qR527E9Nh GnFQxAu4IM4+Bq4wIeIBkYWIVQwLVT6VqJmhjZhdLm4yJuzKkHjWilZKqaAHuUjU1ZtJQczzH DoNYxitJi+MoS5meFV3x+Vq7UJql/ZFuetm4fCQcQtZw+UcZBJ2olemPLFm3fYzSwf85jI1/I jUoe5RD8Q3LFMJDSBLH5SbB6SvQAXh7S+mbYoN4KqIipc8LF6aI00/BnYBr7dF6CSqoulNvj7 CBJMzz903LJ3UWMXlcC/WK74/fMrYtsYAs5iIMYnQsPGjOQvc7Ps623wp6sWk0XYYSBO3wA1c CVSfgz3qlz24uHxRG X-Spam-Status: No, score=-18.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, 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: Tue, 28 Jul 2020 15:59:39 -0000 NetBSD implements reading and overwriting siginfo_t received by the tracee. With TARGET_OBJECT_SIGNAL_INFO signal information can be examined and modified through the special variable $_siginfo. Implement the "get_siginfo_type" gdbarch method for NetBSD architectures. As with Linux architectures, cache the created type in the gdbarch when it is first created. Currently NetBSD uses an identical siginfo type on all architectures, so there is no support for architecture-specific fields= . gdb/ChangeLog: * nbsd-nat.h (nbsd_nat_target::xfer_partial): New declaration. * nbsd-nat.c (nbsd_nat_target::xfer_partial): New function. * nbsd-tdep.c (nbsd_gdbarch_data_handle, struct nbsd_gdbarch_data) (init_nbsd_gdbarch_data, get_nbsd_gdbarch_data) (nbsd_get_siginfo_type): New. (nbsd_init_abi): Install gdbarch "get_siginfo_type" method. (_initialize_nbsd_tdep): New =2D-- gdb/ChangeLog | 10 ++++ gdb/nbsd-nat.c | 45 ++++++++++++++ gdb/nbsd-nat.h | 6 ++ gdb/nbsd-tdep.c | 156 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 217 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index defca83c263..c12eda04285 100644 =2D-- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2020-07-28 Kamil Rytarowski + + * nbsd-nat.h (nbsd_nat_target::xfer_partial): New declaration. + * nbsd-nat.c (nbsd_nat_target::xfer_partial): New function. + * nbsd-tdep.c (nbsd_gdbarch_data_handle, struct nbsd_gdbarch_data) + (init_nbsd_gdbarch_data, get_nbsd_gdbarch_data) + (nbsd_get_siginfo_type): New. + (nbsd_init_abi): Install gdbarch "get_siginfo_type" method. + (_initialize_nbsd_tdep): New. + 2020-07-28 H.J. Lu PR binutils/26301 diff --git a/gdb/nbsd-nat.c b/gdb/nbsd-nat.c index a9405ebf862..5b59f2130d7 100644 =2D-- a/gdb/nbsd-nat.c +++ b/gdb/nbsd-nat.c @@ -845,3 +845,48 @@ nbsd_nat_target::supports_multi_process () { return true; } + +/* Implement the "xfer_partial" target_ops method. */ + +enum target_xfer_status +nbsd_nat_target::xfer_partial (enum target_object object, + const char *annex, gdb_byte *readbuf, + const gdb_byte *writebuf, + ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) +{ + pid_t pid =3D inferior_ptid.pid (); + + switch (object) + { + case TARGET_OBJECT_SIGNAL_INFO: + { + ptrace_siginfo_t psi; + + if (offset > sizeof (siginfo_t)) + return TARGET_XFER_E_IO; + + if (ptrace (PT_GET_SIGINFO, pid, &psi, sizeof (psi)) =3D=3D -1) + return TARGET_XFER_E_IO; + + if (offset + len > sizeof (siginfo_t)) + len =3D sizeof (siginfo_t) - offset; + + if (readbuf !=3D NULL) + memcpy (readbuf, ((gdb_byte *) &psi.psi_siginfo) + offset, len); + else + { + memcpy (((gdb_byte *) &psi.psi_siginfo) + offset, writebuf, len); + + if (ptrace (PT_SET_SIGINFO, pid, &psi, sizeof (psi)) =3D=3D -1) + return TARGET_XFER_E_IO; + } + *xfered_len =3D len; + return TARGET_XFER_OK; + } + default: + return inf_ptrace_target::xfer_partial (object, annex, + readbuf, writebuf, offset, + len, xfered_len); + } +} diff --git a/gdb/nbsd-nat.h b/gdb/nbsd-nat.h index 0a7048ecf35..665a71a0f78 100644 =2D-- a/gdb/nbsd-nat.h +++ b/gdb/nbsd-nat.h @@ -49,6 +49,12 @@ struct nbsd_nat_target : public inf_ptrace_target override; bool supports_multi_process () override; + enum target_xfer_status xfer_partial (enum target_object object, + const char *annex, + gdb_byte *readbuf, + const gdb_byte *writebuf, + ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) override; }; #endif /* nbsd-nat.h */ diff --git a/gdb/nbsd-tdep.c b/gdb/nbsd-tdep.c index 4fdfe476b59..2db994af218 100644 =2D-- a/gdb/nbsd-tdep.c +++ b/gdb/nbsd-tdep.c @@ -373,6 +373,153 @@ nbsd_skip_solib_resolver (struct gdbarch *gdbarch, C= ORE_ADDR pc) return find_solib_trampoline_target (get_current_frame (), pc); } +static struct gdbarch_data *nbsd_gdbarch_data_handle; + +struct nbsd_gdbarch_data +{ + struct type *siginfo_type; +}; + +static void * +init_nbsd_gdbarch_data (struct gdbarch *gdbarch) +{ + return GDBARCH_OBSTACK_ZALLOC (gdbarch, struct nbsd_gdbarch_data); +} + +static struct nbsd_gdbarch_data * +get_nbsd_gdbarch_data (struct gdbarch *gdbarch) +{ + return ((struct nbsd_gdbarch_data *) + gdbarch_data (gdbarch, nbsd_gdbarch_data_handle)); +} + +/* Implement the "get_siginfo_type" gdbarch method. */ + +static struct type * +nbsd_get_siginfo_type (struct gdbarch *gdbarch) +{ + nbsd_gdbarch_data *nbsd_gdbarch_data =3D get_nbsd_gdbarch_data (gdbarch= ); + if (nbsd_gdbarch_data->siginfo_type !=3D NULL) + return nbsd_gdbarch_data->siginfo_type; + + type *char_type =3D builtin_type (gdbarch)->builtin_char; + type *int_type =3D builtin_type (gdbarch)->builtin_int; + type *long_type =3D builtin_type (gdbarch)->builtin_long; + + type *void_ptr_type + =3D lookup_pointer_type (builtin_type (gdbarch)->builtin_void); + + type *int32_type =3D builtin_type (gdbarch)->builtin_int32; + type *uint32_type =3D builtin_type (gdbarch)->builtin_uint32; + type *uint64_type =3D builtin_type (gdbarch)->builtin_uint64; + + bool lp64 =3D TYPE_LENGTH (void_ptr_type) =3D=3D 8; + size_t char_bits =3D gdbarch_addressable_memory_unit_size (gdbarch) * 8= ; + + /* pid_t */ + type *pid_type =3D arch_type (gdbarch, TYPE_CODE_TYPEDEF, + TYPE_LENGTH (int32_type) * char_bits, "pid_t"); + TYPE_TARGET_TYPE (pid_type) =3D int32_type; + + /* uid_t */ + type *uid_type =3D arch_type (gdbarch, TYPE_CODE_TYPEDEF, + TYPE_LENGTH (uint32_type) * char_bits, "uid_t"); + TYPE_TARGET_TYPE (uid_type) =3D uint32_type; + + /* clock_t */ + type *clock_type =3D arch_type (gdbarch, TYPE_CODE_TYPEDEF, + TYPE_LENGTH (int_type) * char_bits, "clock_t"); + TYPE_TARGET_TYPE (clock_type) =3D int_type; + + /* lwpid_t */ + type *lwpid_type =3D arch_type (gdbarch, TYPE_CODE_TYPEDEF, + TYPE_LENGTH (int32_type) * char_bits, + "lwpid_t"); + TYPE_TARGET_TYPE (lwpid_type) =3D int32_type; + + /* union sigval */ + type *sigval_type =3D arch_composite_type (gdbarch, NULL, TYPE_CODE_UNI= ON); + sigval_type->set_name (gdbarch_obstack_strdup (gdbarch, "sigval")); + append_composite_type_field (sigval_type, "sival_int", int_type); + append_composite_type_field (sigval_type, "sival_ptr", void_ptr_type); + + /* union _option */ + type *option_type =3D arch_composite_type (gdbarch, NULL, TYPE_CODE_UNI= ON); + option_type->set_name (gdbarch_obstack_strdup (gdbarch, "_option")); + append_composite_type_field (option_type, "_pe_other_pid", pid_type); + append_composite_type_field (option_type, "_pe_lwp", lwpid_type); + + /* union _reason */ + type *reason_type =3D arch_composite_type (gdbarch, NULL, TYPE_CODE_UNI= ON); + + /* _rt */ + type *t =3D arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); + append_composite_type_field (t, "_pid", pid_type); + append_composite_type_field (t, "_uid", uid_type); + append_composite_type_field (t, "_value", sigval_type); + append_composite_type_field (reason_type, "_rt", t); + + /* _child */ + t =3D arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); + append_composite_type_field (t, "_pid", pid_type); + append_composite_type_field (t, "_uid", uid_type); + append_composite_type_field (t, "_status", int_type); + append_composite_type_field (t, "_utime", clock_type); + append_composite_type_field (t, "_stime", clock_type); + append_composite_type_field (reason_type, "_child", t); + + /* _fault */ + t =3D arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); + append_composite_type_field (t, "_addr", void_ptr_type); + append_composite_type_field (t, "_trap", int_type); + append_composite_type_field (t, "_trap2", int_type); + append_composite_type_field (t, "_trap3", int_type); + append_composite_type_field (reason_type, "_fault", t); + + /* _poll */ + t =3D arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); + append_composite_type_field (t, "_band", long_type); + append_composite_type_field (t, "_fd", int_type); + append_composite_type_field (reason_type, "_poll", t); + + /* _syscall */ + t =3D arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); + append_composite_type_field (t, "_sysnum", int_type); + append_composite_type_field (t, "_retval", + init_vector_type (int_type, 2)); + append_composite_type_field (t, "_error", int_type); + append_composite_type_field (t, "_args", + init_vector_type (uint64_type, 8)); + append_composite_type_field (reason_type, "_syscall", t); + + /* _ptrace_state */ + t =3D arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); + append_composite_type_field (t, "_pe_report_event", int_type); + append_composite_type_field (t, "_option", option_type); + append_composite_type_field (reason_type, "_ptrace_state", t); + + /* struct _ksiginfo */ + type *ksiginfo_type =3D arch_composite_type (gdbarch, NULL, TYPE_CODE_S= TRUCT); + ksiginfo_type->set_name (gdbarch_obstack_strdup (gdbarch, "_ksiginfo"))= ; + append_composite_type_field (ksiginfo_type, "_signo", int_type); + append_composite_type_field (ksiginfo_type, "_code", int_type); + append_composite_type_field (ksiginfo_type, "_errno", int_type); + if (lp64) + append_composite_type_field (ksiginfo_type, "_pad", int_type); + append_composite_type_field (ksiginfo_type, "_reason", reason_type); + + /* union siginfo */ + type *siginfo_type =3D arch_composite_type (gdbarch, NULL, TYPE_CODE_UN= ION); + siginfo_type->set_name (gdbarch_obstack_strdup (gdbarch, "siginfo")); + append_composite_type_field (siginfo_type, "si_pad", + init_vector_type (char_type, 128)); + append_composite_type_field (siginfo_type, "_info", ksiginfo_type); + + nbsd_gdbarch_data->siginfo_type =3D siginfo_type; + + return siginfo_type; +} + /* See nbsd-tdep.h. */ void @@ -469,8 +616,17 @@ nbsd_init_abi (struct gdbarch_info info, struct gdbar= ch *gdbarch) 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); + set_gdbarch_get_siginfo_type (gdbarch, nbsd_get_siginfo_type); /* `catch syscall' */ set_xml_syscall_file_name (gdbarch, "syscalls/netbsd.xml"); set_gdbarch_get_syscall_number (gdbarch, nbsd_get_syscall_number); } + +void _initialize_nbsd_tdep (); +void +_initialize_nbsd_tdep () +{ + nbsd_gdbarch_data_handle + =3D gdbarch_data_register_post_init (init_nbsd_gdbarch_data); +} =2D- 2.26.2