On 08/24/2015 04:58 PM, Douglas Anderson wrote:
If we're in kgdb then the machine is already stopped.  Trying to stop
it again will cause us to try to sleep, which is not allowed while in
kgdb.  To avoid this problem, only stop the machine when we're not in
kgdb.

Reported-by: Aapo Vienamo <[email protected]>
Suggested-by: Kees Cook <[email protected]>
Signed-off-by: Douglas Anderson <[email protected]>
---

Can you add the backtrace?

  arch/arm/kernel/patch.c | 7 ++++++-
  1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/arch/arm/kernel/patch.c b/arch/arm/kernel/patch.c
index 69bda1a..abf30ec 100644
--- a/arch/arm/kernel/patch.c
+++ b/arch/arm/kernel/patch.c
@@ -1,5 +1,6 @@
  #include <linux/kernel.h>
  #include <linux/spinlock.h>
+#include <linux/kgdb.h>
  #include <linux/kprobes.h>
  #include <linux/mm.h>
  #include <linux/stop_machine.h>
@@ -124,6 +125,9 @@ void __kprobes patch_text(void *addr, unsigned int insn)
                .insn = insn,
        };
- stop_machine(patch_text_stop_machine, &patch, NULL);
+       /* Stop machine before patching; but not if in the debugger */
+       if (unlikely(in_dbg_master()))
+               patch_text_stop_machine(&patch);
+       else
+               stop_machine(patch_text_stop_machine, &patch, NULL);
  }

Perhaps it would be better to add a different function for the kgdb call site? Then it's explicit what's going on without us having to figure out when in_dbg_master() is true.

--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to