powerpc: Update for VSX core file and ptrace
authorMichael Neuling <mikey@neuling.org>
Tue, 1 Jul 2008 04:01:39 +0000 (14:01 +1000)
committerPaul Mackerras <paulus@samba.org>
Tue, 1 Jul 2008 04:47:09 +0000 (14:47 +1000)
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>
arch/powerpc/kernel/process.c
arch/powerpc/kernel/ptrace.c
include/asm-powerpc/elf.h
include/linux/elf.h

index d52ded366f14abda09297f0ed5b763eae9900671..1924b57bd241077996a1275d62693dbedb0cc925 100644 (file)
@@ -162,7 +162,7 @@ void flush_altivec_to_thread(struct task_struct *tsk)
        }
 }
 
-int dump_task_altivec(struct task_struct *tsk, elf_vrreg_t *vrregs)
+int dump_task_altivec(struct task_struct *tsk, elf_vrregset_t *vrregs)
 {
        /* ELF_NVRREG includes the VSCR and VRSAVE which we need to save
         * separately, see below */
@@ -249,23 +249,6 @@ int dump_task_vsx(struct task_struct *tsk, elf_vrreg_t *vrregs)
 }
 #endif /* CONFIG_VSX */
 
-int dump_task_vector(struct task_struct *tsk, elf_vrregset_t *vrregs)
-{
-       int rc = 0;
-       elf_vrreg_t *regs = (elf_vrreg_t *)vrregs;
-#ifdef CONFIG_ALTIVEC
-       rc = dump_task_altivec(tsk, regs);
-       if (rc)
-               return rc;
-       regs += ELF_NVRREG;
-#endif
-
-#ifdef CONFIG_VSX
-       rc = dump_task_vsx(tsk, regs);
-#endif
-       return rc;
-}
-
 #ifdef CONFIG_SPE
 
 void enable_kernel_spe(void)
index 4e203a89e1890daef54c1134a4b4fdf18491534c..8feb93e7890c74174de4a8161509f47735b3201c 100644 (file)
@@ -368,13 +368,15 @@ static int vsr_get(struct task_struct *target, const struct user_regset *regset,
                   unsigned int pos, unsigned int count,
                   void *kbuf, void __user *ubuf)
 {
-       int ret;
+       double buf[32];
+       int ret, i;
 
        flush_vsx_to_thread(target);
 
+       for (i = 0; i < 32 ; i++)
+               buf[i] = current->thread.fpr[i][TS_VSRLOWOFFSET];
        ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf,
-                                 target->thread.fpr, 0,
-                                 32 * sizeof(vector128));
+                                 buf, 0, 32 * sizeof(double));
 
        return ret;
 }
@@ -383,13 +385,16 @@ static int vsr_set(struct task_struct *target, const struct user_regset *regset,
                   unsigned int pos, unsigned int count,
                   const void *kbuf, const void __user *ubuf)
 {
-       int ret;
+       double buf[32];
+       int ret,i;
 
        flush_vsx_to_thread(target);
 
        ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
-                                target->thread.fpr, 0,
-                                32 * sizeof(vector128));
+                                buf, 0, 32 * sizeof(double));
+       for (i = 0; i < 32 ; i++)
+               current->thread.fpr[i][TS_VSRLOWOFFSET] = buf[i];
+
 
        return ret;
 }
@@ -499,8 +504,8 @@ static const struct user_regset native_regsets[] = {
 #endif
 #ifdef CONFIG_VSX
        [REGSET_VSX] = {
-               .n = 32,
-               .size = sizeof(vector128), .align = sizeof(vector128),
+               .core_note_type = NT_PPC_VSX, .n = 32,
+               .size = sizeof(double), .align = sizeof(double),
                .active = vsr_active, .get = vsr_get, .set = vsr_set
        },
 #endif
index b6a874db801d023546d38460365dbbd12a6d57c0..38a51728406f580b132ff710f44172318b15a211 100644 (file)
@@ -221,8 +221,8 @@ extern int dump_task_fpu(struct task_struct *, elf_fpregset_t *);
 typedef elf_vrregset_t elf_fpxregset_t;
 
 #ifdef CONFIG_ALTIVEC
-extern int dump_task_vector(struct task_struct *, elf_vrregset_t *vrregs);
-#define ELF_CORE_COPY_XFPREGS(tsk, regs) dump_task_vector(tsk, regs)
+extern int dump_task_altivec(struct task_struct *, elf_vrregset_t *vrregs);
+#define ELF_CORE_COPY_XFPREGS(tsk, regs) dump_task_altivec(tsk, regs)
 #define ELF_CORE_XFPREG_TYPE NT_PPC_VMX
 #endif
 
index ff9fbed90123faff8fb8e3a7817a831f6bc5e276..edc3dac3f02f446802136b6ad65bbc39cbd6996a 100644 (file)
@@ -358,6 +358,7 @@ typedef struct elf64_shdr {
 #define NT_PRXFPREG     0x46e62b7f      /* copied from gdb5.1/include/elf/common.h */
 #define NT_PPC_VMX     0x100           /* PowerPC Altivec/VMX registers */
 #define NT_PPC_SPE     0x101           /* PowerPC SPE/EVR registers */
+#define NT_PPC_VSX     0x102           /* PowerPC VSX registers */
 #define NT_386_TLS     0x200           /* i386 TLS slots (struct user_desc) */