diff options
author | Yao Qi <yao.qi@linaro.org> | 2015-06-01 12:13:02 +0100 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2015-06-01 12:13:02 +0100 |
commit | 10766686b02fce9eedd6217ca76f457106a8142c (patch) | |
tree | 4362456310dd45aed69c8bcc325ad0f4c5a1f33a | |
parent | 7efe48d196f3fb6f55fc53b8021a410848c0a677 (diff) | |
download | gdb-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/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/arm-linux-nat.c | 85 |
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, ®s); + + if (have_ptrace_getregset) + { + struct iovec iov; + + iov.iov_base = ®s; + iov.iov_len = sizeof (regs); + + ret = ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iov); + } + else + ret = ptrace (PTRACE_GETREGS, tid, 0, ®s); + 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, ®s); + + if (have_ptrace_getregset) + { + struct iovec iov; + + iov.iov_base = ®s; + iov.iov_len = sizeof (regs); + + ret = ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iov); + } + else + ret = ptrace (PTRACE_GETREGS, tid, 0, ®s); + 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, ®s); + if (have_ptrace_getregset) + { + struct iovec iov; + + iov.iov_base = ®s; + iov.iov_len = sizeof (regs); + + ret = ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iov); + } + else + ret = ptrace (PTRACE_GETREGS, tid, 0, ®s); + 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 *) ®s[ARM_PC_REGNUM]); - ret = ptrace (PTRACE_SETREGS, tid, 0, ®s); + if (have_ptrace_getregset) + { + struct iovec iov; + + iov.iov_base = ®s; + iov.iov_len = sizeof (regs); + + ret = ptrace (PTRACE_SETREGSET, tid, NT_PRSTATUS, &iov); + } + else + ret = ptrace (PTRACE_SETREGS, tid, 0, ®s); + 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, ®s); + if (have_ptrace_getregset) + { + struct iovec iov; + + iov.iov_base = ®s; + iov.iov_len = sizeof (regs); + + ret = ptrace (PTRACE_GETREGSET, tid, NT_PRSTATUS, &iov); + } + else + ret = ptrace (PTRACE_GETREGS, tid, 0, ®s); + 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 *) ®s[ARM_CPSR_GREGNUM]); - ret = ptrace (PTRACE_SETREGS, tid, 0, ®s); + if (have_ptrace_getregset) + { + struct iovec iov; + + iov.iov_base = ®s; + iov.iov_len = sizeof (regs); + + ret = ptrace (PTRACE_SETREGSET, tid, NT_PRSTATUS, &iov); + } + else + ret = ptrace (PTRACE_SETREGS, tid, 0, ®s); if (ret < 0) { |