diff options
Diffstat (limited to 'arch/mips/kernel/ptrace32.c')
-rw-r--r-- | arch/mips/kernel/ptrace32.c | 25 |
1 files changed, 8 insertions, 17 deletions
diff --git a/arch/mips/kernel/ptrace32.c b/arch/mips/kernel/ptrace32.c index b8aa2dd5b00b..c394d8f74265 100644 --- a/arch/mips/kernel/ptrace32.c +++ b/arch/mips/kernel/ptrace32.c | |||
@@ -80,7 +80,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
80 | /* Read the word at location addr in the USER area. */ | 80 | /* Read the word at location addr in the USER area. */ |
81 | case PTRACE_PEEKUSR: { | 81 | case PTRACE_PEEKUSR: { |
82 | struct pt_regs *regs; | 82 | struct pt_regs *regs; |
83 | fpureg_t *fregs; | 83 | union fpureg *fregs; |
84 | unsigned int tmp; | 84 | unsigned int tmp; |
85 | 85 | ||
86 | regs = task_pt_regs(child); | 86 | regs = task_pt_regs(child); |
@@ -103,13 +103,11 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
103 | * order bits of the values stored in the even | 103 | * order bits of the values stored in the even |
104 | * registers - unless we're using r2k_switch.S. | 104 | * registers - unless we're using r2k_switch.S. |
105 | */ | 105 | */ |
106 | if (addr & 1) | 106 | tmp = get_fpr32(&fregs[(addr & ~1) - FPR_BASE], |
107 | tmp = fregs[(addr & ~1) - 32] >> 32; | 107 | addr & 1); |
108 | else | ||
109 | tmp = fregs[addr - 32]; | ||
110 | break; | 108 | break; |
111 | } | 109 | } |
112 | tmp = fregs[addr - FPR_BASE]; | 110 | tmp = get_fpr32(&fregs[addr - FPR_BASE], 0); |
113 | break; | 111 | break; |
114 | case PC: | 112 | case PC: |
115 | tmp = regs->cp0_epc; | 113 | tmp = regs->cp0_epc; |
@@ -233,7 +231,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
233 | regs->regs[addr] = data; | 231 | regs->regs[addr] = data; |
234 | break; | 232 | break; |
235 | case FPR_BASE ... FPR_BASE + 31: { | 233 | case FPR_BASE ... FPR_BASE + 31: { |
236 | fpureg_t *fregs = get_fpu_regs(child); | 234 | union fpureg *fregs = get_fpu_regs(child); |
237 | 235 | ||
238 | if (!tsk_used_math(child)) { | 236 | if (!tsk_used_math(child)) { |
239 | /* FP not yet used */ | 237 | /* FP not yet used */ |
@@ -247,18 +245,11 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, | |||
247 | * order bits of the values stored in the even | 245 | * order bits of the values stored in the even |
248 | * registers - unless we're using r2k_switch.S. | 246 | * registers - unless we're using r2k_switch.S. |
249 | */ | 247 | */ |
250 | if (addr & 1) { | 248 | set_fpr32(&fregs[(addr & ~1) - FPR_BASE], |
251 | fregs[(addr & ~1) - FPR_BASE] &= | 249 | addr & 1, data); |
252 | 0xffffffff; | ||
253 | fregs[(addr & ~1) - FPR_BASE] |= | ||
254 | ((u64)data) << 32; | ||
255 | } else { | ||
256 | fregs[addr - FPR_BASE] &= ~0xffffffffLL; | ||
257 | fregs[addr - FPR_BASE] |= data; | ||
258 | } | ||
259 | break; | 250 | break; |
260 | } | 251 | } |
261 | fregs[addr - FPR_BASE] = data; | 252 | set_fpr64(&fregs[addr - FPR_BASE], 0, data); |
262 | break; | 253 | break; |
263 | } | 254 | } |
264 | case PC: | 255 | case PC: |