From: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
To: Ulrich Weigand <uweigand@de.ibm.com>
Cc: Alan Hayward <Alan.Hayward@arm.com>,
Simon Marchi <simark@simark.ca>,
"gdb-patches\@sourceware.org" <gdb-patches@sourceware.org>,
nd <nd@arm.com>,
anton@linux.ibm.com
Subject: Re: [PATCH 2/2] gdbserver: Add linux_get_hwcap
Date: Fri, 05 Apr 2019 16:26:00 -0000 [thread overview]
Message-ID: <875zrsctal.fsf@linux.vnet.ibm.com> (raw)
In-Reply-To: <20190404134915.95BF1D802CA@oc3748833570.ibm.com>
Hi,
I've copied the patch below.
Note that there is a difference in the interface between linux_get_auxv
and linux_get_hwcap(2), the latter still return both the status and the
entry value, but I didn't want to change all their users.
Also, contrary to the gdb client version (target_auxv_search
gdb/auxv.c), this one doesn't differentiate between an error and the
entry not being found.
Is that ok?
Thanks!
From 0af6ec5fdbe9e696e10e22b530c52e3c926c5e9c Mon Sep 17 00:00:00 2001
From: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
Date: Thu, 4 Apr 2019 14:49:37 -0300
Subject: [PATCH] Use linux_get_auxv to get AT_PHDR in the PPC stub
This patch fixes a build error due to a call to ppc_get_auxv that was
left over after linux_get_hwcap and linux_get_hwcap2 were introduced
in:
974c89e0882ddb03e294eca76a9e3d3bef90eacf gdbserver: Add
linux_get_hwcap
Because the missing call fetched AT_PHDR and not AT_HWCAP,
linux_get_auxv is now visible.
This use also required ppc_get_auxv to return a status variable
indicating that the AT_PHDR entry was not found separately from the
actual value of of the auxv entry. Therefore, the new linux_get_auxv
function is changed to return a status variable and write the entry
value to a pointer passed as an argument.
Note that linux_get_hwcap and linux_get_hwcap2 still use the return
value as both an indicator of that the entry wasn't found and as the
actual value of the entry.
gdb/gdbserver/ChangeLog:
2019-04-DD Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
* linux-low.c (linux_get_auxv): Remove static. Return auxv entry
value in argument pointer, return 1 if the entry is found and 0
otherwise. Move comment.
(linux_get_hwcap, linux_get_hwcap2): Use modified linux_get_auxv.
* linux-low.h (linux_get_auxv): Declare.
* linux-ppc-low.c (is_elfv2_inferior): Use linux_get_auxv.
---
gdb/gdbserver/linux-low.c | 29 +++++++++++++++++++----------
gdb/gdbserver/linux-low.h | 8 ++++++++
gdb/gdbserver/linux-ppc-low.c | 7 +++++--
3 files changed, 32 insertions(+), 12 deletions(-)
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 265043f97e..65919c3262 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -7427,11 +7427,10 @@ linux_get_pc_64bit (struct regcache *regcache)
return pc;
}
-/* Fetch the entry MATCH from the auxv vector, where entries are length
- WORDSIZE. If no entry was found, return zero. */
+/* See linux-low.h. */
-static CORE_ADDR
-linux_get_auxv (int wordsize, CORE_ADDR match)
+int
+linux_get_auxv (int wordsize, CORE_ADDR match, CORE_ADDR *valp)
{
gdb_byte *data = (gdb_byte *) alloca (2 * wordsize);
int offset = 0;
@@ -7442,15 +7441,21 @@ linux_get_auxv (int wordsize, CORE_ADDR match)
{
if (wordsize == 4)
{
- uint32_t *data_p = (uint32_t *)data;
+ uint32_t *data_p = (uint32_t *) data;
if (data_p[0] == match)
- return data_p[1];
+ {
+ *valp = data_p[1];
+ return 1;
+ }
}
else
{
- uint64_t *data_p = (uint64_t *)data;
+ uint64_t *data_p = (uint64_t *) data;
if (data_p[0] == match)
- return data_p[1];
+ {
+ *valp = data_p[1];
+ return 1;
+ }
}
offset += 2 * wordsize;
@@ -7464,7 +7469,9 @@ linux_get_auxv (int wordsize, CORE_ADDR match)
CORE_ADDR
linux_get_hwcap (int wordsize)
{
- return linux_get_auxv (wordsize, AT_HWCAP);
+ CORE_ADDR hwcap = 0;
+ linux_get_auxv (wordsize, AT_HWCAP, &hwcap);
+ return hwcap;
}
/* See linux-low.h. */
@@ -7472,7 +7479,9 @@ linux_get_hwcap (int wordsize)
CORE_ADDR
linux_get_hwcap2 (int wordsize)
{
- return linux_get_auxv (wordsize, AT_HWCAP2);
+ CORE_ADDR hwcap2 = 0;
+ linux_get_auxv (wordsize, AT_HWCAP2, &hwcap2);
+ return hwcap2;
}
static struct target_ops linux_target_ops = {
diff --git a/gdb/gdbserver/linux-low.h b/gdb/gdbserver/linux-low.h
index d825184835..d5d074efc5 100644
--- a/gdb/gdbserver/linux-low.h
+++ b/gdb/gdbserver/linux-low.h
@@ -435,6 +435,14 @@ bool thread_db_thread_handle (ptid_t ptid, gdb_byte **handle, int *handle_len);
extern int have_ptrace_getregset;
+/* Search for the value with type MATCH in the auxv vector with
+ entries of length WORDSIZE bytes. If found, store the value in
+ *VALP and return 1. If not found or if there is an error, return
+ 0. */
+
+int linux_get_auxv (int wordsize, CORE_ADDR match,
+ CORE_ADDR *valp);
+
/* Fetch the AT_HWCAP entry from the auxv vector, where entries are length
WORDSIZE. If no entry was found, return zero. */
diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c
index 8deb0ce068..f17f05a0a3 100644
--- a/gdb/gdbserver/linux-ppc-low.c
+++ b/gdb/gdbserver/linux-ppc-low.c
@@ -1107,10 +1107,13 @@ is_elfv2_inferior (void)
#else
const int def_res = 0;
#endif
- unsigned long phdr;
+ CORE_ADDR phdr;
Elf64_Ehdr ehdr;
- if (!ppc_get_auxv (AT_PHDR, &phdr))
+ const struct target_desc *tdesc = current_process ()->tdesc;
+ int wordsize = register_size (tdesc, 0);
+
+ if (!linux_get_auxv (wordsize, AT_PHDR, &phdr))
return def_res;
/* Assume ELF header is at the beginning of the page where program headers
--
2.13.6
next prev parent reply other threads:[~2019-04-05 16:26 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-25 12:05 [PATCH 1/2] " Alan Hayward
2019-03-25 12:05 ` [PATCH 2/2] gdbserver: " Alan Hayward
2019-03-25 15:41 ` Simon Marchi
2019-03-26 13:17 ` Alan Hayward
[not found] ` <353e83d9-efb3-c485-9ae6-6fc0a1f54553@simark.ca>
[not found] ` <57CEBD0C-44A5-48D1-8CEB-54584E1A1A21@arm.com>
[not found] ` <59A457A2-F464-4A05-A471-700F066114AD@arm.com>
2019-03-26 14:34 ` FW: " Alan Hayward
2019-03-28 9:50 ` Ulrich Weigand
2019-03-28 11:35 ` Alan Hayward
2019-03-29 23:12 ` Ulrich Weigand
2019-04-03 19:13 ` Pedro Franco de Carvalho
2019-04-04 13:49 ` Ulrich Weigand
2019-04-05 16:26 ` Pedro Franco de Carvalho [this message]
2019-04-05 16:39 ` Ulrich Weigand
2019-04-05 17:23 ` Pedro Franco de Carvalho
2019-04-08 9:38 ` Alan Hayward
2019-04-11 14:12 ` Pedro Franco de Carvalho
2019-03-26 14:56 ` FW: " Simon Marchi
2019-04-02 22:00 ` Peter Bergner
2019-04-04 21:22 ` Pedro Franco de Carvalho
2019-03-25 15:18 ` [PATCH 1/2] " Simon Marchi
2019-03-25 16:51 ` Alan Hayward
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=875zrsctal.fsf@linux.vnet.ibm.com \
--to=pedromfc@linux.ibm.com \
--cc=Alan.Hayward@arm.com \
--cc=anton@linux.ibm.com \
--cc=gdb-patches@sourceware.org \
--cc=nd@arm.com \
--cc=simark@simark.ca \
--cc=uweigand@de.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox