57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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);
 | |
| }
 |