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 | df9d7ec9e749c18e9970fb240ca142148dd3bea9 (patch) | |
tree | fb4fda4bb9cfc65c5386c89715a73e4876bf97da /gdb | |
parent | 10766686b02fce9eedd6217ca76f457106a8142c (diff) | |
download | fsf-binutils-gdb-df9d7ec9e749c18e9970fb240ca142148dd3bea9.zip fsf-binutils-gdb-df9d7ec9e749c18e9970fb240ca142148dd3bea9.tar.gz fsf-binutils-gdb-df9d7ec9e749c18e9970fb240ca142148dd3bea9.tar.bz2 |
Fetch and store FP registers by PTRACE_{G,S}ETREGSET
If kernel supports PTRACE_GETREGSET, GDB uses PTRACE_{G,S}ETREGSET
to fetch and store FP registers.
gdb:
2015-06-01 Yao Qi <yao.qi@linaro.org>
* arm-linux-nat.c (fetch_fpregister): Use PTRACE_GETREGSET.
(fetch_fpregs): Likewise.
* arm-linux-nat.c (store_fpregister): Use PTRACE_SETREGSET.
(store_fpregs): Likewise.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/arm-linux-nat.c | 87 |
2 files changed, 84 insertions, 10 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 84c3685..646404f 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_fpregister): Use PTRACE_GETREGSET. + (fetch_fpregs): Likewise. + * arm-linux-nat.c (store_fpregister): Use PTRACE_SETREGSET. + (store_fpregs): Likewise. + +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. diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c index 98d3557..2336845 100644 --- a/gdb/arm-linux-nat.c +++ b/gdb/arm-linux-nat.c @@ -88,12 +88,23 @@ fetch_fpregister (struct regcache *regcache, int regno) { int ret, tid; gdb_byte fp[ARM_LINUX_SIZEOF_NWFPE]; - + /* Get the thread id for the ptrace call. */ tid = GET_THREAD_ID (inferior_ptid); /* Read the floating point state. */ - ret = ptrace (PT_GETFPREGS, tid, 0, fp); + if (have_ptrace_getregset) + { + struct iovec iov; + + iov.iov_base = &fp; + iov.iov_len = ARM_LINUX_SIZEOF_NWFPE; + + ret = ptrace (PTRACE_GETREGSET, tid, NT_FPREGSET, &iov); + } + else + ret = ptrace (PT_GETFPREGS, tid, 0, fp); + if (ret < 0) { warning (_("Unable to fetch floating point register.")); @@ -121,9 +132,20 @@ fetch_fpregs (struct regcache *regcache) /* Get the thread id for the ptrace call. */ tid = GET_THREAD_ID (inferior_ptid); - + /* Read the floating point state. */ - ret = ptrace (PT_GETFPREGS, tid, 0, fp); + if (have_ptrace_getregset) + { + struct iovec iov; + + iov.iov_base = &fp; + iov.iov_len = ARM_LINUX_SIZEOF_NWFPE; + + ret = ptrace (PTRACE_GETREGSET, tid, NT_FPREGSET, &iov); + } + else + ret = ptrace (PT_GETFPREGS, tid, 0, fp); + if (ret < 0) { warning (_("Unable to fetch the floating point registers.")); @@ -150,9 +172,20 @@ store_fpregister (const struct regcache *regcache, int regno) /* Get the thread id for the ptrace call. */ tid = GET_THREAD_ID (inferior_ptid); - + /* Read the floating point state. */ - ret = ptrace (PT_GETFPREGS, tid, 0, fp); + if (have_ptrace_getregset) + { + struct iovec iov; + + iov.iov_base = &fp; + iov.iov_len = ARM_LINUX_SIZEOF_NWFPE; + + ret = ptrace (PTRACE_GETREGSET, tid, NT_FPREGSET, &iov); + } + else + ret = ptrace (PT_GETFPREGS, tid, 0, fp); + if (ret < 0) { warning (_("Unable to fetch the floating point registers.")); @@ -168,7 +201,18 @@ store_fpregister (const struct regcache *regcache, int regno) if (regno >= ARM_F0_REGNUM && regno <= ARM_F7_REGNUM) collect_nwfpe_register (regcache, regno, fp); - ret = ptrace (PTRACE_SETFPREGS, tid, 0, fp); + if (have_ptrace_getregset) + { + struct iovec iov; + + iov.iov_base = &fp; + iov.iov_len = ARM_LINUX_SIZEOF_NWFPE; + + ret = ptrace (PTRACE_SETREGSET, tid, NT_FPREGSET, &iov); + } + else + ret = ptrace (PTRACE_SETFPREGS, tid, 0, fp); + if (ret < 0) { warning (_("Unable to store floating point register.")); @@ -187,9 +231,21 @@ store_fpregs (const struct regcache *regcache) /* Get the thread id for the ptrace call. */ tid = GET_THREAD_ID (inferior_ptid); - + /* Read the floating point state. */ - ret = ptrace (PT_GETFPREGS, tid, 0, fp); + if (have_ptrace_getregset) + { + elf_fpregset_t fpregs; + struct iovec iov; + + iov.iov_base = &fpregs; + iov.iov_len = sizeof (fpregs); + + ret = ptrace (PTRACE_GETREGSET, tid, NT_FPREGSET, &iov); + } + else + ret = ptrace (PT_GETFPREGS, tid, 0, fp); + if (ret < 0) { warning (_("Unable to fetch the floating point registers.")); @@ -205,7 +261,18 @@ store_fpregs (const struct regcache *regcache) if (REG_VALID == regcache_register_status (regcache, regno)) collect_nwfpe_register (regcache, regno, fp); - ret = ptrace (PTRACE_SETFPREGS, tid, 0, fp); + if (have_ptrace_getregset) + { + struct iovec iov; + + iov.iov_base = &fp; + iov.iov_len = ARM_LINUX_SIZEOF_NWFPE; + + ret = ptrace (PTRACE_SETREGSET, tid, NT_FPREGSET, &iov); + } + else + ret = ptrace (PTRACE_SETFPREGS, tid, 0, fp); + if (ret < 0) { warning (_("Unable to store floating point registers.")); |