fiq_debugger: Add fiq_watchdog_triggered api
authorArve Hjønnevåg <arve@android.com>
Sat, 3 May 2014 03:31:07 +0000 (20:31 -0700)
committerArve Hjønnevåg <arve@android.com>
Tue, 6 May 2014 00:02:07 +0000 (17:02 -0700)
Dumps registers and stacktrace into console-ramoops when called
from a watchdog fiq.

Change-Id: Ib6fab5a52f670db18e64214d5e4890e8292a749c
Signed-off-by: Arve Hjønnevåg <arve@android.com>
drivers/staging/android/fiq_debugger/Kconfig
drivers/staging/android/fiq_debugger/Makefile
drivers/staging/android/fiq_debugger/fiq_watchdog.c [new file with mode: 0644]
drivers/staging/android/fiq_debugger/fiq_watchdog.h [new file with mode: 0644]

index d87978cc7deecce17ee691fe2015b806adc32b83..56f7f999377e8e9c050a807bee1a2ff58e985832 100644 (file)
@@ -41,3 +41,9 @@ config FIQ_DEBUGGER_CONSOLE_DEFAULT_ENABLE
        help
          If enabled, this puts the fiq debugger into console mode by default.
          Otherwise, the fiq debugger will start out in debug mode.
+
+config FIQ_WATCHDOG
+       bool
+       select FIQ_DEBUGGER
+       select PSTORE_RAM
+       default n
index c95da7eb1b33c216574561000162101e2e898b67..a7ca4871cad31edbedf8497ad948580a7c33b422 100644 (file)
@@ -1,3 +1,4 @@
 obj-y                  += fiq_debugger.o
 obj-$(CONFIG_ARM)      += fiq_debugger_arm.o
-obj-$(CONFIG_ARM64)    += fiq_debugger_arm64.o
\ No newline at end of file
+obj-$(CONFIG_ARM64)    += fiq_debugger_arm64.o
+obj-$(CONFIG_FIQ_WATCHDOG)     += fiq_watchdog.o
diff --git a/drivers/staging/android/fiq_debugger/fiq_watchdog.c b/drivers/staging/android/fiq_debugger/fiq_watchdog.c
new file mode 100644 (file)
index 0000000..194b541
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/spinlock.h>
+#include <linux/pstore_ram.h>
+
+#include "fiq_watchdog.h"
+#include "fiq_debugger_priv.h"
+
+static DEFINE_RAW_SPINLOCK(fiq_watchdog_lock);
+
+static void fiq_watchdog_printf(struct fiq_debugger_output *output,
+                               const char *fmt, ...)
+{
+       char buf[256];
+       va_list ap;
+       int len;
+
+       va_start(ap, fmt);
+       len = vscnprintf(buf, sizeof(buf), fmt, ap);
+       va_end(ap);
+
+       ramoops_console_write_buf(buf, len);
+}
+
+struct fiq_debugger_output fiq_watchdog_output = {
+       .printf = fiq_watchdog_printf,
+};
+
+void fiq_watchdog_triggered(const struct pt_regs *regs, void *svc_sp)
+{
+       char msg[24];
+       int len;
+
+       raw_spin_lock(&fiq_watchdog_lock);
+
+       len = scnprintf(msg, sizeof(msg), "watchdog fiq cpu %d\n",
+                       THREAD_INFO(svc_sp)->cpu);
+       ramoops_console_write_buf(msg, len);
+
+       fiq_debugger_dump_stacktrace(&fiq_watchdog_output, regs, 100, svc_sp);
+
+       raw_spin_unlock(&fiq_watchdog_lock);
+}
diff --git a/drivers/staging/android/fiq_debugger/fiq_watchdog.h b/drivers/staging/android/fiq_debugger/fiq_watchdog.h
new file mode 100644 (file)
index 0000000..c6b507f
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef _FIQ_WATCHDOG_H_
+#define _FIQ_WATCHDOG_H_
+
+void fiq_watchdog_triggered(const struct pt_regs *regs, void *svc_sp);
+
+#endif