ath10k: bring back the WMI path for mgmt frames
[cascardo/linux.git] / kernel / ptrace.c
index 335a7ae..4041f57 100644 (file)
@@ -469,6 +469,7 @@ static int ptrace_detach(struct task_struct *child, unsigned int data)
        /* Architecture-specific hardware disable .. */
        ptrace_disable(child);
        clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
+       flush_ptrace_hw_breakpoint(child);
 
        write_lock_irq(&tasklist_lock);
        /*
@@ -844,6 +845,47 @@ int ptrace_request(struct task_struct *child, long request,
                        ret = ptrace_setsiginfo(child, &siginfo);
                break;
 
+       case PTRACE_GETSIGMASK:
+               if (addr != sizeof(sigset_t)) {
+                       ret = -EINVAL;
+                       break;
+               }
+
+               if (copy_to_user(datavp, &child->blocked, sizeof(sigset_t)))
+                       ret = -EFAULT;
+               else
+                       ret = 0;
+
+               break;
+
+       case PTRACE_SETSIGMASK: {
+               sigset_t new_set;
+
+               if (addr != sizeof(sigset_t)) {
+                       ret = -EINVAL;
+                       break;
+               }
+
+               if (copy_from_user(&new_set, datavp, sizeof(sigset_t))) {
+                       ret = -EFAULT;
+                       break;
+               }
+
+               sigdelsetmask(&new_set, sigmask(SIGKILL)|sigmask(SIGSTOP));
+
+               /*
+                * Every thread does recalc_sigpending() after resume, so
+                * retarget_shared_pending() and recalc_sigpending() are not
+                * called here.
+                */
+               spin_lock_irq(&child->sighand->siglock);
+               child->blocked = new_set;
+               spin_unlock_irq(&child->sighand->siglock);
+
+               ret = 0;
+               break;
+       }
+
        case PTRACE_INTERRUPT:
                /*
                 * Stop tracee without any side-effect on signal or job
@@ -948,8 +990,7 @@ int ptrace_request(struct task_struct *child, long request,
 
 #ifdef CONFIG_HAVE_ARCH_TRACEHOOK
        case PTRACE_GETREGSET:
-       case PTRACE_SETREGSET:
-       {
+       case PTRACE_SETREGSET: {
                struct iovec kiov;
                struct iovec __user *uiov = datavp;
 
@@ -1181,19 +1222,3 @@ asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
        return ret;
 }
 #endif /* CONFIG_COMPAT */
-
-#ifdef CONFIG_HAVE_HW_BREAKPOINT
-int ptrace_get_breakpoints(struct task_struct *tsk)
-{
-       if (atomic_inc_not_zero(&tsk->ptrace_bp_refcnt))
-               return 0;
-
-       return -1;
-}
-
-void ptrace_put_breakpoints(struct task_struct *tsk)
-{
-       if (atomic_dec_and_test(&tsk->ptrace_bp_refcnt))
-               flush_ptrace_hw_breakpoint(tsk);
-}
-#endif /* CONFIG_HAVE_HW_BREAKPOINT */