Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9c027e6c authored by Arve Hjønnevåg's avatar Arve Hjønnevåg Committed by Amit Pundir
Browse files

ANDROID: fiq_debugger: Add fiq_watchdog_triggered api



Dumps registers and stacktrace into console-ramoops when called
from a watchdog fiq.

Change-Id: Ib6fab5a52f670db18e64214d5e4890e8292a749c
Signed-off-by: default avatarArve Hjønnevåg <arve@android.com>
parent 9200a45d
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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
+2 −1
Original line number Diff line number Diff line
obj-y			+= fiq_debugger.o
obj-$(CONFIG_ARM)	+= fiq_debugger_arm.o
obj-$(CONFIG_ARM64)	+= fiq_debugger_arm64.o
obj-$(CONFIG_FIQ_WATCHDOG)	+= fiq_watchdog.o
+56 −0
Original line number Diff line number Diff line
/*
 * 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);
}
+20 −0
Original line number Diff line number Diff line
/*
 * 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