]> err.no Git - linux-2.6/blobdiff - arch/mips/kernel/ptrace32.c
Support the MIPS32 / MIPS64 DSP ASE.
[linux-2.6] / arch / mips / kernel / ptrace32.c
index eb446e525908829632ca5bc34186fbd7635fa5e2..5c45a5880226055aafc54f86a71a2acbc3b4c3f5 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/security.h>
 
 #include <asm/cpu.h>
+#include <asm/dsp.h>
 #include <asm/fpu.h>
 #include <asm/mipsregs.h>
 #include <asm/pgtable.h>
@@ -161,6 +162,27 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)
                        write_c0_status(flags);
                        break;
                }
+               case DSP_BASE ... DSP_BASE + 5:
+                       if (!cpu_has_dsp) {
+                               tmp = 0;
+                               ret = -EIO;
+                               goto out_tsk;
+                       }
+                       if (child->thread.dsp.used_dsp) {
+                               dspreg_t *dregs = __get_dsp_regs(child);
+                               tmp = (unsigned long) (dregs[addr - DSP_BASE]);
+                       } else {
+                               tmp = -1;       /* DSP registers yet used  */
+                       }
+                       break;
+               case DSP_CONTROL:
+                       if (!cpu_has_dsp) {
+                               tmp = 0;
+                               ret = -EIO;
+                               goto out_tsk;
+                       }
+                       tmp = child->thread.dsp.dspcontrol;
+                       break;
                default:
                        tmp = 0;
                        ret = -EIO;
@@ -230,6 +252,22 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data)
                        else
                                child->thread.fpu.soft.fcr31 = data;
                        break;
+               case DSP_BASE ... DSP_BASE + 5:
+                       if (!cpu_has_dsp) {
+                               ret = -EIO;
+                               break;
+                       }
+
+                       dspreg_t *dregs = __get_dsp_regs(child);
+                       dregs[addr - DSP_BASE] = data;
+                       break;
+               case DSP_CONTROL:
+                       if (!cpu_has_dsp) {
+                               ret = -EIO;
+                               break;
+                       }
+                       child->thread.dsp.dspcontrol = data;
+                       break;
                default:
                        /* The rest are not allowed. */
                        ret = -EIO;