@@ -126,6 +126,12 @@ long arch_ptrace(struct task_struct *child, long request,
126
126
unsigned long tmp ;
127
127
long ret = - EIO ;
128
128
129
+ unsigned long user_regs_struct_size = sizeof (struct user_regs_struct );
130
+ #ifdef CONFIG_64BIT
131
+ if (is_compat_task ())
132
+ user_regs_struct_size /= 2 ;
133
+ #endif
134
+
129
135
switch (request ) {
130
136
131
137
/* 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,
181
187
return copy_regset_to_user (child ,
182
188
task_user_regset_view (current ),
183
189
REGSET_GENERAL ,
184
- 0 , sizeof ( struct user_regs_struct ) ,
190
+ 0 , user_regs_struct_size ,
185
191
datap );
186
192
187
193
case PTRACE_SETREGS : /* Set all gp regs in the child. */
188
194
return copy_regset_from_user (child ,
189
195
task_user_regset_view (current ),
190
196
REGSET_GENERAL ,
191
- 0 , sizeof ( struct user_regs_struct ) ,
197
+ 0 , user_regs_struct_size ,
192
198
datap );
193
199
194
200
case PTRACE_GETFPREGS : /* Get the child FPU state. */
@@ -302,6 +308,11 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
302
308
}
303
309
}
304
310
break ;
311
+ case PTRACE_GETREGS :
312
+ case PTRACE_SETREGS :
313
+ case PTRACE_GETFPREGS :
314
+ case PTRACE_SETFPREGS :
315
+ return arch_ptrace (child , request , addr , data );
305
316
306
317
default :
307
318
ret = compat_ptrace_request (child , request , addr , data );
0 commit comments