| .. | .. |
|---|
| 30 | 30 | #include <asm/fpu.h> |
|---|
| 31 | 31 | #include <asm/mipsregs.h> |
|---|
| 32 | 32 | #include <asm/mipsmtregs.h> |
|---|
| 33 | | -#include <asm/pgtable.h> |
|---|
| 34 | 33 | #include <asm/page.h> |
|---|
| 35 | 34 | #include <asm/reg.h> |
|---|
| 36 | 35 | #include <asm/syscall.h> |
|---|
| .. | .. |
|---|
| 82 | 81 | /* Read the word at location addr in the USER area. */ |
|---|
| 83 | 82 | case PTRACE_PEEKUSR: { |
|---|
| 84 | 83 | struct pt_regs *regs; |
|---|
| 85 | | - union fpureg *fregs; |
|---|
| 86 | 84 | unsigned int tmp; |
|---|
| 87 | 85 | |
|---|
| 88 | 86 | regs = task_pt_regs(child); |
|---|
| .. | .. |
|---|
| 92 | 90 | case 0 ... 31: |
|---|
| 93 | 91 | tmp = regs->regs[addr]; |
|---|
| 94 | 92 | break; |
|---|
| 95 | | - case FPR_BASE ... FPR_BASE + 31: |
|---|
| 93 | +#ifdef CONFIG_MIPS_FP_SUPPORT |
|---|
| 94 | + case FPR_BASE ... FPR_BASE + 31: { |
|---|
| 95 | + union fpureg *fregs; |
|---|
| 96 | + |
|---|
| 96 | 97 | if (!tsk_used_math(child)) { |
|---|
| 97 | 98 | /* FP not yet used */ |
|---|
| 98 | 99 | tmp = -1; |
|---|
| .. | .. |
|---|
| 111 | 112 | } |
|---|
| 112 | 113 | tmp = get_fpr64(&fregs[addr - FPR_BASE], 0); |
|---|
| 113 | 114 | break; |
|---|
| 115 | + } |
|---|
| 116 | + case FPC_CSR: |
|---|
| 117 | + tmp = child->thread.fpu.fcr31; |
|---|
| 118 | + break; |
|---|
| 119 | + case FPC_EIR: |
|---|
| 120 | + /* implementation / version register */ |
|---|
| 121 | + tmp = boot_cpu_data.fpu_id; |
|---|
| 122 | + break; |
|---|
| 123 | +#endif /* CONFIG_MIPS_FP_SUPPORT */ |
|---|
| 114 | 124 | case PC: |
|---|
| 115 | 125 | tmp = regs->cp0_epc; |
|---|
| 116 | 126 | break; |
|---|
| .. | .. |
|---|
| 125 | 135 | break; |
|---|
| 126 | 136 | case MMLO: |
|---|
| 127 | 137 | tmp = regs->lo; |
|---|
| 128 | | - break; |
|---|
| 129 | | - case FPC_CSR: |
|---|
| 130 | | - tmp = child->thread.fpu.fcr31; |
|---|
| 131 | | - break; |
|---|
| 132 | | - case FPC_EIR: |
|---|
| 133 | | - /* implementation / version register */ |
|---|
| 134 | | - tmp = boot_cpu_data.fpu_id; |
|---|
| 135 | 138 | break; |
|---|
| 136 | 139 | case DSP_BASE ... DSP_BASE + 5: { |
|---|
| 137 | 140 | dspreg_t *dregs; |
|---|
| .. | .. |
|---|
| 203 | 206 | mips_syscall_is_indirect(child, regs)) |
|---|
| 204 | 207 | mips_syscall_update_nr(child, regs); |
|---|
| 205 | 208 | break; |
|---|
| 209 | +#ifdef CONFIG_MIPS_FP_SUPPORT |
|---|
| 206 | 210 | case FPR_BASE ... FPR_BASE + 31: { |
|---|
| 207 | 211 | union fpureg *fregs = get_fpu_regs(child); |
|---|
| 208 | 212 | |
|---|
| .. | .. |
|---|
| 225 | 229 | set_fpr64(&fregs[addr - FPR_BASE], 0, data); |
|---|
| 226 | 230 | break; |
|---|
| 227 | 231 | } |
|---|
| 232 | + case FPC_CSR: |
|---|
| 233 | + child->thread.fpu.fcr31 = data; |
|---|
| 234 | + break; |
|---|
| 235 | +#endif /* CONFIG_MIPS_FP_SUPPORT */ |
|---|
| 228 | 236 | case PC: |
|---|
| 229 | 237 | regs->cp0_epc = data; |
|---|
| 230 | 238 | break; |
|---|
| .. | .. |
|---|
| 233 | 241 | break; |
|---|
| 234 | 242 | case MMLO: |
|---|
| 235 | 243 | regs->lo = data; |
|---|
| 236 | | - break; |
|---|
| 237 | | - case FPC_CSR: |
|---|
| 238 | | - child->thread.fpu.fcr31 = data; |
|---|
| 239 | 244 | break; |
|---|
| 240 | 245 | case DSP_BASE ... DSP_BASE + 5: { |
|---|
| 241 | 246 | dspreg_t *dregs; |
|---|
| .. | .. |
|---|
| 274 | 279 | (struct user_pt_regs __user *) (__u64) data); |
|---|
| 275 | 280 | break; |
|---|
| 276 | 281 | |
|---|
| 282 | +#ifdef CONFIG_MIPS_FP_SUPPORT |
|---|
| 277 | 283 | case PTRACE_GETFPREGS: |
|---|
| 278 | 284 | ret = ptrace_getfpregs(child, (__u32 __user *) (__u64) data); |
|---|
| 279 | 285 | break; |
|---|
| .. | .. |
|---|
| 281 | 287 | case PTRACE_SETFPREGS: |
|---|
| 282 | 288 | ret = ptrace_setfpregs(child, (__u32 __user *) (__u64) data); |
|---|
| 283 | 289 | break; |
|---|
| 284 | | - |
|---|
| 290 | +#endif |
|---|
| 285 | 291 | case PTRACE_GET_THREAD_AREA: |
|---|
| 286 | 292 | ret = put_user(task_thread_info(child)->tp_value, |
|---|
| 287 | 293 | (unsigned int __user *) (unsigned long) data); |
|---|