From: Al Viro <[email protected]>

We know this won't be called for child == current, so we don't need
to bother with callbacks, etc. - just do unw_init_from_blocked_task(),
unw_unwind_to_user() and do the payload of gpregs_[gs]et().  For
one register.  Which is to say, access_elf_reg().

Signed-off-by: Al Viro <[email protected]>
---
 arch/ia64/kernel/ptrace.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c
index be635f6f93c9..e0813c8e4b47 100644
--- a/arch/ia64/kernel/ptrace.c
+++ b/arch/ia64/kernel/ptrace.c
@@ -1936,15 +1936,14 @@ access_uarea(struct task_struct *child, unsigned long 
addr,
        }
 
        if (pos != -1) {
-               if (write_access)
-                       ret = gpregs_set(child, NULL, pos,
-                               sizeof(unsigned long), data, NULL);
-               else
-                       ret = gpregs_get(child, NULL, pos,
-                               sizeof(unsigned long), data, NULL);
-               if (ret != 0)
-                       return -1;
-               return 0;
+               struct unw_frame_info info;
+
+               memset(&info, 0, sizeof(info));
+               unw_init_from_blocked_task(&info, child);
+               if (unw_unwind_to_user(&info) < 0)
+                       return 0;
+
+               return access_elf_reg(child, &info, pos, data, write_access);
        }
 
        /* access debug registers */
-- 
2.11.0

Reply via email to