patch-2.4.22 linux-2.4.22/arch/ppc/kernel/ptrace.c
Next file: linux-2.4.22/arch/ppc/kernel/setup.c
Previous file: linux-2.4.22/arch/ppc/kernel/prom.c
Back to the patch index
Back to the overall index
- Lines: 89
- Date:
2003-08-25 04:44:40.000000000 -0700
- Orig file:
linux-2.4.21/arch/ppc/kernel/ptrace.c
- Orig date:
2003-06-13 07:51:31.000000000 -0700
diff -urN linux-2.4.21/arch/ppc/kernel/ptrace.c linux-2.4.22/arch/ppc/kernel/ptrace.c
@@ -33,7 +33,11 @@
/*
* Set of msr bits that gdb can change on behalf of a process.
*/
+#if defined(CONFIG_4xx)
+#define MSR_DEBUGCHANGE (0)
+#else
#define MSR_DEBUGCHANGE (MSR_FE0 | MSR_SE | MSR_BE | MSR_FE1)
+#endif
/*
* does not yet catch signals sent when the child dies.
@@ -108,12 +112,12 @@
/* copy AltiVec registers VR[0] .. VR[31] */
for (i = 0; i < 32; i++)
- for (j = 0; j < 4; j++, data++)
+ 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++)
+ for (i = 0; i < 4; i++, data++)
if (__get_user(task->thread.vscr.u[i], data))
return -EFAULT;
@@ -129,18 +133,27 @@
set_single_step(struct task_struct *task)
{
struct pt_regs *regs = task->thread.regs;
-
+#if defined(CONFIG_4xx)
+ regs->msr |= MSR_DE;
+ task->thread.dbcr0 |= (DBCR0_IDM | DBCR0_IC);
+#else
if (regs != NULL)
regs->msr |= MSR_SE;
+#endif
+
}
static inline void
clear_single_step(struct task_struct *task)
{
struct pt_regs *regs = task->thread.regs;
-
+#if defined(CONFIG_4xx)
+ regs->msr &= ~MSR_DE;
+ task->thread.dbcr0 &= ~DBCR0_IC;
+#else
if (regs != NULL)
regs->msr &= ~MSR_SE;
+#endif
}
/*
@@ -193,7 +206,7 @@
switch (request) {
/* when I and D space are separate, these will need to be fixed. */
- case PTRACE_PEEKTEXT: /* read word at location addr. */
+ case PTRACE_PEEKTEXT: /* read word at location addr. */
case PTRACE_PEEKDATA: {
unsigned long tmp;
int copied;
@@ -275,14 +288,20 @@
child->exit_code = data;
/* make sure the single step bit is not set. */
clear_single_step(child);
+#ifdef CONFIG_4xx
+ /* ...but traps may be set, so catch those....
+ */
+ child->thread.regs->msr |= MSR_DE;
+ child->thread.dbcr0 |= (DBCR0_IDM | DBCR0_TDE);
+#endif
wake_up_process(child);
ret = 0;
break;
}
/*
- * make the child exit. Best I can do is send it a sigkill.
- * perhaps it should be put in the status that it wants to
+ * make the child exit. Best I can do is send it a sigkill.
+ * perhaps it should be put in the status that it wants to
* exit.
*/
case PTRACE_KILL: {
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)