patch-2.4.21 linux-2.4.21/arch/ppc64/kernel/ptrace32.c
Next file: linux-2.4.21/arch/ppc64/kernel/rtas-proc.c
Previous file: linux-2.4.21/arch/ppc64/kernel/ptrace.c
Back to the patch index
Back to the overall index
- Lines: 87
- Date:
2003-06-13 07:51:32.000000000 -0700
- Orig file:
linux-2.4.20/arch/ppc64/kernel/ptrace32.c
- Orig date:
2002-11-28 15:53:11.000000000 -0800
diff -urN linux-2.4.20/arch/ppc64/kernel/ptrace32.c linux-2.4.21/arch/ppc64/kernel/ptrace32.c
@@ -228,9 +228,9 @@
if (child->thread.regs->msr & MSR_FP)
giveup_fpu(child);
if (numReg == PT_FPSCR)
- tmp_reg_value = ((unsigned int *)child->thread.fpscr);
+ tmp_reg_value = ((unsigned long *)child->thread.fpscr);
else
- tmp_reg_value = ((unsigned long int *)child->thread.fpr)[numReg - PT_FPR0];
+ tmp_reg_value = ((unsigned long *)child->thread.fpr)[numReg - PT_FPR0];
} else { /* register within PT_REGS struct */
tmp_reg_value = get_reg(child, numReg);
}
@@ -395,6 +395,74 @@
ret = ptrace_detach(child, data);
break;
+ case PPC_PTRACE_GETREGS: { /* Get GPRs 0 - 31. */
+ int i;
+ unsigned long *reg = &((unsigned long *)child->thread.regs)[0];
+ unsigned int *tmp = (unsigned int *)addr;
+
+ for (i = 0; i < 32; i++) {
+ ret = put_user(*reg, tmp);
+ if (ret)
+ break;
+ reg++;
+ tmp++;
+ }
+ break;
+ }
+
+ case PPC_PTRACE_SETREGS: { /* Set GPRs 0 - 31. */
+ int i;
+ unsigned long *reg = &((unsigned long *)child->thread.regs)[0];
+ unsigned int *tmp = (unsigned int *)addr;
+
+ for (i = 0; i < 32; i++) {
+ ret = get_user(*reg, tmp);
+ if (ret)
+ break;
+ reg++;
+ tmp++;
+ }
+ break;
+ }
+
+ case PPC_PTRACE_GETFPREGS: { /* Get FPRs 0 - 31. */
+ int i;
+ unsigned long *reg = &((unsigned long *)child->thread.fpr)[0];
+ unsigned int *tmp = (unsigned int *)addr;
+
+ if (child->thread.regs->msr & MSR_FP)
+ giveup_fpu(child);
+
+ for (i = 0; i < 32; i++) {
+ ret = put_user(*reg, tmp);
+ if (ret)
+ break;
+ reg++;
+ tmp++;
+ }
+ break;
+ }
+
+ case PPC_PTRACE_SETFPREGS: { /* Get FPRs 0 - 31. */
+ int i;
+ unsigned long *reg = &((unsigned long *)child->thread.fpr)[0];
+ unsigned int *tmp = (unsigned int *)addr;
+
+ if (child->thread.regs->msr & MSR_FP)
+ giveup_fpu(child);
+
+ for (i = 0; i < 32; i++) {
+ ret = get_user(*reg, tmp);
+ if (ret)
+ break;
+ reg++;
+ tmp++;
+ }
+ break;
+ }
+
+
+
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)