lkml.org 
[lkml]   [2020]   [Jun]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 08/41] [ia64] access_uarea(): don't bother with fpregs_[gs]et()
    Date
    From: Al Viro <viro@zeniv.linux.org.uk>

    similar to previous commit...

    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    ---
    arch/ia64/kernel/ptrace.c | 42 +++++++++++++++++++++++++++++++++---------
    1 file changed, 33 insertions(+), 9 deletions(-)

    diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c
    index e0813c8e4b47..eae7b094f608 100644
    --- a/arch/ia64/kernel/ptrace.c
    +++ b/arch/ia64/kernel/ptrace.c
    @@ -1811,7 +1811,6 @@ access_uarea(struct task_struct *child, unsigned long addr,
    unsigned long *data, int write_access)
    {
    unsigned int pos = -1; /* an invalid value */
    - int ret;
    unsigned long *ptr, regnum;

    if ((addr & 0x7) != 0) {
    @@ -1843,14 +1842,39 @@ access_uarea(struct task_struct *child, unsigned long addr,
    }

    if (pos != -1) {
    - if (write_access)
    - ret = fpregs_set(child, NULL, pos,
    - sizeof(unsigned long), data, NULL);
    - else
    - ret = fpregs_get(child, NULL, pos,
    - sizeof(unsigned long), data, NULL);
    - if (ret != 0)
    - return -1;
    + unsigned reg = pos / sizeof(elf_fpreg_t);
    + int which_half = (pos / sizeof(unsigned long)) & 1;
    +
    + if (reg < 32) { /* fr2-fr31 */
    + struct unw_frame_info info;
    + elf_fpreg_t fpreg;
    +
    + memset(&info, 0, sizeof(info));
    + unw_init_from_blocked_task(&info, child);
    + if (unw_unwind_to_user(&info) < 0)
    + return 0;
    +
    + if (unw_get_fr(&info, reg, &fpreg))
    + return -1;
    + if (write_access) {
    + fpreg.u.bits[which_half] = *data;
    + if (unw_set_fr(&info, reg, fpreg))
    + return -1;
    + } else {
    + *data = fpreg.u.bits[which_half];
    + }
    + } else { /* fph */
    + elf_fpreg_t *p = &child->thread.fph[reg - 32];
    + unsigned long *bits = &p->u.bits[which_half];
    +
    + ia64_sync_fph(child);
    + if (write_access)
    + *bits = *data;
    + else if (child->thread.flags & IA64_THREAD_FPH_VALID)
    + *data = *bits;
    + else
    + *data = 0;
    + }
    return 0;
    }

    --
    2.11.0
    \
     
     \ /
      Last update: 2020-06-29 23:29    [W:3.296 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site