parisc: Wire up PTRACE_GETREGS/PTRACE_SETREGS for compat case
authorHelge Deller <deller@gmx.de>
Wed, 1 Feb 2023 15:41:54 +0000 (16:41 +0100)
committerHelge Deller <deller@gmx.de>
Wed, 1 Feb 2023 20:42:37 +0000 (21:42 +0100)
Wire up the missing ptrace requests PTRACE_GETREGS, PTRACE_SETREGS,
PTRACE_GETFPREGS and PTRACE_SETFPREGS when running 32-bit applications
on 64-bit kernels.

Signed-off-by: Helge Deller <deller@gmx.de>
Cc: stable@vger.kernel.org # 4.7+
arch/parisc/kernel/ptrace.c

index 31735e9..ceb45f5 100644 (file)
@@ -126,6 +126,12 @@ long arch_ptrace(struct task_struct *child, long request,
        unsigned long tmp;
        long ret = -EIO;
 
+       unsigned long user_regs_struct_size = sizeof(struct user_regs_struct);
+#ifdef CONFIG_64BIT
+       if (is_compat_task())
+               user_regs_struct_size /= 2;
+#endif
+
        switch (request) {
 
        /* Read the word at location addr in the USER area.  For ptraced
@@ -181,14 +187,14 @@ long arch_ptrace(struct task_struct *child, long request,
                return copy_regset_to_user(child,
                                           task_user_regset_view(current),
                                           REGSET_GENERAL,
-                                          0, sizeof(struct user_regs_struct),
+                                          0, user_regs_struct_size,
                                           datap);
 
        case PTRACE_SETREGS:    /* Set all gp regs in the child. */
                return copy_regset_from_user(child,
                                             task_user_regset_view(current),
                                             REGSET_GENERAL,
-                                            0, sizeof(struct user_regs_struct),
+                                            0, user_regs_struct_size,
                                             datap);
 
        case PTRACE_GETFPREGS:  /* Get the child FPU state. */
@@ -302,6 +308,11 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
                        }
                }
                break;
+       case PTRACE_GETREGS:
+       case PTRACE_SETREGS:
+       case PTRACE_GETFPREGS:
+       case PTRACE_SETFPREGS:
+               return arch_ptrace(child, request, addr, data);
 
        default:
                ret = compat_ptrace_request(child, request, addr, data);