aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/ptrace.c
diff options
context:
space:
mode:
authorMichael Neuling <mikey@neuling.org>2008-07-01 00:01:39 -0400
committerPaul Mackerras <paulus@samba.org>2008-07-01 00:47:09 -0400
commitf3e909c2750eb20536bacacc867dc9047b70546a (patch)
tree97bf54aafb93313d54aaeaa05eb99d1a9ab48c3c /arch/powerpc/kernel/ptrace.c
parent436db693c4f4d02d375780a1f0b2ebdca2451cd6 (diff)
powerpc: Update for VSX core file and ptrace
This correctly hooks the VSX dump into Roland McGrath core file infrastructure. It adds the VSX dump information as an additional elf note in the core file (after talking more to the tool chain/gdb guys). This also ensures the formats are consistent between signals, ptrace and core files. Signed-off-by: Michael Neuling <mikey@neuling.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/kernel/ptrace.c')
-rw-r--r--arch/powerpc/kernel/ptrace.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
index 4e203a89e189..8feb93e7890c 100644
--- a/arch/powerpc/kernel/ptrace.c
+++ b/arch/powerpc/kernel/ptrace.c
@@ -368,13 +368,15 @@ static int vsr_get(struct task_struct *target, const struct user_regset *regset,
368 unsigned int pos, unsigned int count, 368 unsigned int pos, unsigned int count,
369 void *kbuf, void __user *ubuf) 369 void *kbuf, void __user *ubuf)
370{ 370{
371 int ret; 371 double buf[32];
372 int ret, i;
372 373
373 flush_vsx_to_thread(target); 374 flush_vsx_to_thread(target);
374 375
376 for (i = 0; i < 32 ; i++)
377 buf[i] = current->thread.fpr[i][TS_VSRLOWOFFSET];
375 ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, 378 ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
376 target->thread.fpr, 0, 379 buf, 0, 32 * sizeof(double));
377 32 * sizeof(vector128));
378 380
379 return ret; 381 return ret;
380} 382}
@@ -383,13 +385,16 @@ static int vsr_set(struct task_struct *target, const struct user_regset *regset,
383 unsigned int pos, unsigned int count, 385 unsigned int pos, unsigned int count,
384 const void *kbuf, const void __user *ubuf) 386 const void *kbuf, const void __user *ubuf)
385{ 387{
386 int ret; 388 double buf[32];
389 int ret,i;
387 390
388 flush_vsx_to_thread(target); 391 flush_vsx_to_thread(target);
389 392
390 ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, 393 ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
391 target->thread.fpr, 0, 394 buf, 0, 32 * sizeof(double));
392 32 * sizeof(vector128)); 395 for (i = 0; i < 32 ; i++)
396 current->thread.fpr[i][TS_VSRLOWOFFSET] = buf[i];
397
393 398
394 return ret; 399 return ret;
395} 400}
@@ -499,8 +504,8 @@ static const struct user_regset native_regsets[] = {
499#endif 504#endif
500#ifdef CONFIG_VSX 505#ifdef CONFIG_VSX
501 [REGSET_VSX] = { 506 [REGSET_VSX] = {
502 .n = 32, 507 .core_note_type = NT_PPC_VSX, .n = 32,
503 .size = sizeof(vector128), .align = sizeof(vector128), 508 .size = sizeof(double), .align = sizeof(double),
504 .active = vsr_active, .get = vsr_get, .set = vsr_set 509 .active = vsr_active, .get = vsr_get, .set = vsr_set
505 }, 510 },
506#endif 511#endif