diff options
Diffstat (limited to 'arch/mips/kernel/ptrace32.c')
| -rw-r--r-- | arch/mips/kernel/ptrace32.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/arch/mips/kernel/ptrace32.c b/arch/mips/kernel/ptrace32.c index 0d5cf97af727..8704dc0496ea 100644 --- a/arch/mips/kernel/ptrace32.c +++ b/arch/mips/kernel/ptrace32.c | |||
| @@ -173,12 +173,22 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | |||
| 173 | break; | 173 | break; |
| 174 | case FPC_EIR: { /* implementation / version register */ | 174 | case FPC_EIR: { /* implementation / version register */ |
| 175 | unsigned int flags; | 175 | unsigned int flags; |
| 176 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 177 | unsigned int irqflags; | ||
| 178 | unsigned int mtflags; | ||
| 179 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 176 | 180 | ||
| 177 | if (!cpu_has_fpu) { | 181 | if (!cpu_has_fpu) { |
| 178 | tmp = 0; | 182 | tmp = 0; |
| 179 | break; | 183 | break; |
| 180 | } | 184 | } |
| 181 | 185 | ||
| 186 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 187 | /* Read-modify-write of Status must be atomic */ | ||
| 188 | local_irq_save(irqflags); | ||
| 189 | mtflags = dmt(); | ||
| 190 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 191 | |||
| 182 | preempt_disable(); | 192 | preempt_disable(); |
| 183 | if (cpu_has_mipsmt) { | 193 | if (cpu_has_mipsmt) { |
| 184 | unsigned int vpflags = dvpe(); | 194 | unsigned int vpflags = dvpe(); |
| @@ -193,6 +203,10 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | |||
| 193 | __asm__ __volatile__("cfc1\t%0,$0": "=r" (tmp)); | 203 | __asm__ __volatile__("cfc1\t%0,$0": "=r" (tmp)); |
| 194 | write_c0_status(flags); | 204 | write_c0_status(flags); |
| 195 | } | 205 | } |
| 206 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 207 | emt(mtflags); | ||
| 208 | local_irq_restore(irqflags); | ||
| 209 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 196 | preempt_enable(); | 210 | preempt_enable(); |
| 197 | break; | 211 | break; |
| 198 | } | 212 | } |
