patch-2.4.19 linux-2.4.19/arch/ppc/kernel/ptrace.c
Next file: linux-2.4.19/arch/ppc/kernel/qspan_pci.c
Previous file: linux-2.4.19/arch/ppc/kernel/prom_init.c
Back to the patch index
Back to the overall index
- Lines: 97
- Date:
Fri Aug 2 17:39:43 2002
- Orig file:
linux-2.4.18/arch/ppc/kernel/ptrace.c
- Orig date:
Mon Nov 26 05:29:17 2001
diff -urN linux-2.4.18/arch/ppc/kernel/ptrace.c linux-2.4.19/arch/ppc/kernel/ptrace.c
@@ -1,5 +1,5 @@
/*
- * BK Id: SCCS/s.ptrace.c 1.12 11/23/01 16:38:30 paulus
+ * BK Id: SCCS/s.ptrace.c 1.14 01/17/02 23:05:50 paulus
*/
/*
* linux/arch/ppc/kernel/ptrace.c
@@ -71,6 +71,64 @@
return -EIO;
}
+#ifdef CONFIG_ALTIVEC
+/*
+ * Get contents of AltiVec register state in task TASK
+ */
+static inline int get_vrregs(unsigned long *data, struct task_struct *task)
+{
+ int i, j;
+
+ if (!access_ok(VERIFY_WRITE, data, 133 * sizeof(unsigned long)))
+ return -EFAULT;
+
+ /* copy AltiVec registers VR[0] .. VR[31] */
+ for (i = 0; i < 32; i++)
+ for (j = 0; j < 4; j++, data++)
+ if (__put_user(task->thread.vr[i].u[j], data))
+ return -EFAULT;
+
+ /* copy VSCR */
+ for (i = 0; i < 4; i++, data++)
+ if (__put_user(task->thread.vscr.u[i], data))
+ return -EFAULT;
+
+ /* copy VRSAVE */
+ if (__put_user(task->thread.vrsave, data))
+ return -EFAULT;
+
+ return 0;
+}
+
+/*
+ * Write contents of AltiVec register state into task TASK.
+ */
+static inline int set_vrregs(struct task_struct *task, unsigned long *data)
+{
+ int i, j;
+
+ if (!access_ok(VERIFY_READ, data, 133 * sizeof(unsigned long)))
+ return -EFAULT;
+
+ /* copy AltiVec registers VR[0] .. VR[31] */
+ for (i = 0; i < 32; i++)
+ for (j = 0; j < 4; j++, data++)
+ if (__get_user(task->thread.vr[i].u[j], data))
+ return -EFAULT;
+
+ /* copy VSCR */
+ for (i = 0; i < 4; i++, data++)
+ if (__get_user(task->thread.vscr.u[i], data))
+ return -EFAULT;
+
+ /* copy VRSAVE */
+ if (__get_user(task->thread.vrsave, data))
+ return -EFAULT;
+
+ return 0;
+}
+#endif
+
static inline void
set_single_step(struct task_struct *task)
{
@@ -259,6 +317,24 @@
ret = ptrace_detach(child, data);
break;
+#ifdef CONFIG_ALTIVEC
+ case PTRACE_GETVRREGS:
+ /* Get the child altivec register state. */
+ if (child->thread.regs->msr & MSR_VEC)
+ giveup_altivec(child);
+ ret = get_vrregs((unsigned long *)data, child);
+ break;
+
+ case PTRACE_SETVRREGS:
+ /* Set the child altivec register state. */
+ /* this is to clear the MSR_VEC bit to force a reload
+ * of register state from memory */
+ if (child->thread.regs->msr & MSR_VEC)
+ giveup_altivec(child);
+ ret = set_vrregs(child, (unsigned long *)data);
+ break;
+#endif
+
default:
ret = -EIO;
break;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)