aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/frv/kernel/ptrace.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/arch/frv/kernel/ptrace.c b/arch/frv/kernel/ptrace.c
index e9dbfad93589..9d68f7fac730 100644
--- a/arch/frv/kernel/ptrace.c
+++ b/arch/frv/kernel/ptrace.c
@@ -259,19 +259,21 @@ long arch_ptrace(struct task_struct *child, long request,
259{ 259{
260 unsigned long tmp; 260 unsigned long tmp;
261 int ret; 261 int ret;
262 int regno = addr >> 2;
263 unsigned long __user *datap = (unsigned long __user *) data;
262 264
263 switch (request) { 265 switch (request) {
264 /* read the word at location addr in the USER area. */ 266 /* read the word at location addr in the USER area. */
265 case PTRACE_PEEKUSR: { 267 case PTRACE_PEEKUSR: {
266 tmp = 0; 268 tmp = 0;
267 ret = -EIO; 269 ret = -EIO;
268 if ((addr & 3) || addr < 0) 270 if (addr & 3)
269 break; 271 break;
270 272
271 ret = 0; 273 ret = 0;
272 switch (addr >> 2) { 274 switch (regno) {
273 case 0 ... PT__END - 1: 275 case 0 ... PT__END - 1:
274 tmp = get_reg(child, addr >> 2); 276 tmp = get_reg(child, regno);
275 break; 277 break;
276 278
277 case PT__END + 0: 279 case PT__END + 0:
@@ -300,23 +302,18 @@ long arch_ptrace(struct task_struct *child, long request,
300 } 302 }
301 303
302 if (ret == 0) 304 if (ret == 0)
303 ret = put_user(tmp, (unsigned long *) data); 305 ret = put_user(tmp, datap);
304 break; 306 break;
305 } 307 }
306 308
307 case PTRACE_POKEUSR: /* write the word at location addr in the USER area */ 309 case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
308 ret = -EIO; 310 ret = -EIO;
309 if ((addr & 3) || addr < 0) 311 if (addr & 3)
310 break; 312 break;
311 313
312 ret = 0; 314 switch (regno) {
313 switch (addr >> 2) {
314 case 0 ... PT__END - 1: 315 case 0 ... PT__END - 1:
315 ret = put_reg(child, addr >> 2, data); 316 ret = put_reg(child, regno, data);
316 break;
317
318 default:
319 ret = -EIO;
320 break; 317 break;
321 } 318 }
322 break; 319 break;
@@ -325,25 +322,25 @@ long arch_ptrace(struct task_struct *child, long request,
325 return copy_regset_to_user(child, &user_frv_native_view, 322 return copy_regset_to_user(child, &user_frv_native_view,
326 REGSET_GENERAL, 323 REGSET_GENERAL,
327 0, sizeof(child->thread.user->i), 324 0, sizeof(child->thread.user->i),
328 (void __user *)data); 325 datap);
329 326
330 case PTRACE_SETREGS: /* Set all integer regs in the child. */ 327 case PTRACE_SETREGS: /* Set all integer regs in the child. */
331 return copy_regset_from_user(child, &user_frv_native_view, 328 return copy_regset_from_user(child, &user_frv_native_view,
332 REGSET_GENERAL, 329 REGSET_GENERAL,
333 0, sizeof(child->thread.user->i), 330 0, sizeof(child->thread.user->i),
334 (const void __user *)data); 331 datap);
335 332
336 case PTRACE_GETFPREGS: /* Get the child FP/Media state. */ 333 case PTRACE_GETFPREGS: /* Get the child FP/Media state. */
337 return copy_regset_to_user(child, &user_frv_native_view, 334 return copy_regset_to_user(child, &user_frv_native_view,
338 REGSET_FPMEDIA, 335 REGSET_FPMEDIA,
339 0, sizeof(child->thread.user->f), 336 0, sizeof(child->thread.user->f),
340 (void __user *)data); 337 datap);
341 338
342 case PTRACE_SETFPREGS: /* Set the child FP/Media state. */ 339 case PTRACE_SETFPREGS: /* Set the child FP/Media state. */
343 return copy_regset_from_user(child, &user_frv_native_view, 340 return copy_regset_from_user(child, &user_frv_native_view,
344 REGSET_FPMEDIA, 341 REGSET_FPMEDIA,
345 0, sizeof(child->thread.user->f), 342 0, sizeof(child->thread.user->f),
346 (const void __user *)data); 343 datap);
347 344
348 default: 345 default:
349 ret = ptrace_request(child, request, addr, data); 346 ret = ptrace_request(child, request, addr, data);