aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYao Qi <yao.qi@linaro.org>2015-06-01 12:13:02 +0100
committerYao Qi <yao.qi@linaro.org>2015-06-01 12:13:02 +0100
commit10766686b02fce9eedd6217ca76f457106a8142c (patch)
tree4362456310dd45aed69c8bcc325ad0f4c5a1f33a
parent7efe48d196f3fb6f55fc53b8021a410848c0a677 (diff)
downloadgdb-10766686b02fce9eedd6217ca76f457106a8142c.zip
gdb-10766686b02fce9eedd6217ca76f457106a8142c.tar.gz
gdb-10766686b02fce9eedd6217ca76f457106a8142c.tar.bz2
Fetch and store GP registers by PTRACE_{G,S}ETREGSET
If kernel supports PTRACE_GETREGSET, GDB uses PTRACE_{G,S}ETREGSET to fetch and store GP registers. gdb: 2015-06-01 Yao Qi <yao.qi@linaro.org> * arm-linux-nat.c (fetch_register): Use PTRACE_GETREGSET. (fetch_regs): Likewise. (store_regs): Use PTRACE_SETREGSET. (store_register): Likewise.
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/arm-linux-nat.c85
2 files changed, 82 insertions, 10 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 27b8438..84c3685 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
2015-06-01 Yao Qi <yao.qi@linaro.org>
+ * arm-linux-nat.c (fetch_register): Use PTRACE_GETREGSET.
+ (fetch_regs): Likewise.
+ (store_regs): Use PTRACE_SETREGSET.
+ (store_register): Likewise.
+
+2015-06-01 Yao Qi <yao.qi@linaro.org>
+
* arm-linux-nat.c (arm_linux_read_description): Check whether
kernel supports PTRACE_GETREGSET.
diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c
index 877559e..98d3557 100644
--- a/gdb/arm-linux-nat.c
+++ b/gdb/arm-linux-nat.c
@@ -224,8 +224,19 @@ fetch_register (struct regcache *regcache, int regno)
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
-
- ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
+
+ if (have_ptrace_getregset)
+ {
+ struct iovec iov;
+
+ iov.iov_base = &regs;
+ iov.iov_len = sizeof (regs);
+
+ ret = ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iov);
+ }
+ else
+ ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
+
if (ret < 0)
{
warning (_("Unable to fetch general register."));
@@ -266,8 +277,19 @@ fetch_regs (struct regcache *regcache)
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
-
- ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
+
+ if (have_ptrace_getregset)
+ {
+ struct iovec iov;
+
+ iov.iov_base = &regs;
+ iov.iov_len = sizeof (regs);
+
+ ret = ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iov);
+ }
+ else
+ ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
+
if (ret < 0)
{
warning (_("Unable to fetch general registers."));
@@ -304,9 +326,20 @@ store_register (const struct regcache *regcache, int regno)
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
-
+
/* Get the general registers from the process. */
- ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
+ if (have_ptrace_getregset)
+ {
+ struct iovec iov;
+
+ iov.iov_base = &regs;
+ iov.iov_len = sizeof (regs);
+
+ ret = ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iov);
+ }
+ else
+ ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
+
if (ret < 0)
{
warning (_("Unable to fetch general registers."));
@@ -322,7 +355,18 @@ store_register (const struct regcache *regcache, int regno)
regcache_raw_collect (regcache, ARM_PC_REGNUM,
(char *) &regs[ARM_PC_REGNUM]);
- ret = ptrace (PTRACE_SETREGS, tid, 0, &regs);
+ if (have_ptrace_getregset)
+ {
+ struct iovec iov;
+
+ iov.iov_base = &regs;
+ iov.iov_len = sizeof (regs);
+
+ ret = ptrace (PTRACE_SETREGSET, tid, NT_PRSTATUS, &iov);
+ }
+ else
+ ret = ptrace (PTRACE_SETREGS, tid, 0, &regs);
+
if (ret < 0)
{
warning (_("Unable to store general register."));
@@ -338,9 +382,20 @@ store_regs (const struct regcache *regcache)
/* Get the thread id for the ptrace call. */
tid = GET_THREAD_ID (inferior_ptid);
-
+
/* Fetch the general registers. */
- ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
+ if (have_ptrace_getregset)
+ {
+ struct iovec iov;
+
+ iov.iov_base = &regs;
+ iov.iov_len = sizeof (regs);
+
+ ret = ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iov);
+ }
+ else
+ ret = ptrace (PTRACE_GETREGS, tid, 0, &regs);
+
if (ret < 0)
{
warning (_("Unable to fetch general registers."));
@@ -357,7 +412,17 @@ store_regs (const struct regcache *regcache)
regcache_raw_collect (regcache, ARM_PS_REGNUM,
(char *) &regs[ARM_CPSR_GREGNUM]);
- ret = ptrace (PTRACE_SETREGS, tid, 0, &regs);
+ if (have_ptrace_getregset)
+ {
+ struct iovec iov;
+
+ iov.iov_base = &regs;
+ iov.iov_len = sizeof (regs);
+
+ ret = ptrace (PTRACE_SETREGSET, tid, NT_PRSTATUS, &iov);
+ }
+ else
+ ret = ptrace (PTRACE_SETREGS, tid, 0, &regs);
if (ret < 0)
{