summaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel/ptrace.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1999-08-18 23:37:42 +0000
committerRalf Baechle <ralf@linux-mips.org>1999-08-18 23:37:42 +0000
commit794ff4dc959a8dfef4f704ef6a5bb7334e421623 (patch)
tree9ea4d7f31e69420a29819a7e4c88e4097aa4380f /arch/mips/kernel/ptrace.c
parent8b92ed51419c907aa453c063b0afaefaef268c02 (diff)
- Drop support for 32/32 fp register model
- Fix siginfo structure definition - Ptrace fixes, one of them was an uninitialized pointer. - Header file fixes. - Fixes to linker scripts required for new binutils. - MIPS64. Chainsaw edition. Btw, Harald, why does the kernel no longer compile ...
Diffstat (limited to 'arch/mips/kernel/ptrace.c')
-rw-r--r--arch/mips/kernel/ptrace.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c
index 9350a3be0..c8e3d23b6 100644
--- a/arch/mips/kernel/ptrace.c
+++ b/arch/mips/kernel/ptrace.c
@@ -1,4 +1,4 @@
-/* $Id: ptrace.c,v 1.13 1999/06/17 13:25:46 ralf Exp $
+/* $Id: ptrace.c,v 1.15 1999/08/09 19:43:14 harald Exp $
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
@@ -348,17 +348,13 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
break;
case FPR_BASE ... FPR_BASE + 31:
if (child->used_math) {
- unsigned long long *fregs;
-
if (last_task_used_math == child) {
enable_cp1();
save_fp(child);
disable_cp1();
last_task_used_math = NULL;
}
- fregs = (unsigned long long *)
- &child->tss.fpu.hard.fp_regs[0];
- tmp = (unsigned long) fregs[(addr - 32)];
+ tmp = child->tss.fpu.hard.fp_regs[addr - 32];
} else {
tmp = -1; /* FP not yet used */
}
@@ -381,9 +377,15 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
case FPC_CSR:
tmp = child->tss.fpu.hard.control;
break;
- case FPC_EIR: /* implementation / version register */
- tmp = 0; /* XXX */
+ case FPC_EIR: { /* implementation / version register */
+ unsigned int flags;
+
+ __save_flags(flags);
+ enable_cp1();
+ __asm__ __volatile__("cfc1\t%0,$0": "=r" (tmp));
+ __restore_flags(flags);
break;
+ }
default:
tmp = 0;
res = -EIO;
@@ -401,22 +403,24 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
goto out;
case PTRACE_POKEUSR: {
- unsigned long long *fregs;
struct pt_regs *regs;
int res = 0;
+ regs = (struct pt_regs *) ((unsigned long) child +
+ KERNEL_STACK_SIZE - 32 - sizeof(struct pt_regs));
switch (addr) {
case 0 ... 31:
- regs = (struct pt_regs *) ((unsigned long) child +
- KERNEL_STACK_SIZE - 32 - sizeof(struct pt_regs));
+ regs->regs[addr] = data;
break;
- case FPR_BASE ... FPR_BASE + 31:
+ case FPR_BASE ... FPR_BASE + 31: {
+ unsigned int *fregs;
if (child->used_math) {
if (last_task_used_math == child) {
enable_cp1();
save_fp(child);
disable_cp1();
last_task_used_math = NULL;
+ regs->cp0_status &= ~ST0_CU1;
}
} else {
/* FP not yet used */
@@ -424,10 +428,10 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
sizeof(child->tss.fpu.hard));
child->tss.fpu.hard.control = 0;
}
- fregs = (unsigned long long *)
- &child->tss.fpu.hard.fp_regs[0];
- fregs[(addr - 32)] = (unsigned long long) data;
+ fregs = child->tss.fpu.hard.fp_regs;
+ fregs[addr - FPR_BASE] = data;
break;
+ }
case PC:
regs->cp0_epc = data;
break;