1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

Merge pull request #685 from rousselk/panic

Panic
This commit is contained in:
Oleg Hahm 2014-02-26 16:26:27 +01:00
commit 0c14597ec2
5 changed files with 286 additions and 0 deletions

41
core/include/crash.h Normal file
View File

@ -0,0 +1,41 @@
/*
* Copyright (C) 2014 INRIA
*
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License. See the file LICENSE in the top level directory for more
* details.
*/
/**
* @addtogroup core_util
* @{
*
* @file crash.h
* @brief Crash handling header
*
* Define a panic() function that allows to stop/reboot the system
* when an unrecoverable problem has occured.
*
* @author Kévin Roussel <Kevin.Roussel@inria.fr>
*/
#ifndef __CRASH_H
#define __CRASH_H
#include "kernel.h"
/** Handle an unrecoverable error by halting or rebooting the system.
A numeric code indicating the failure reason can be given
as the ::crash_code parameter.
Detailing the failure is possible using the ::message parameter.
This function should serve a similar purpose than the panic()
function of Unix/Linux kernels.
if DEVELHELP macro is defined, system will be halted;
system will be rebooted otherwise.
WARNING: this function NEVER returns! */
NORETURN void core_panic(int crash_code, const char *message);
/** @} */
#endif /* __CRASH_H */

63
cpu/arm_common/crash.c Normal file
View File

@ -0,0 +1,63 @@
/*
* Copyright (C) 2014 INRIA
*
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License. See the file LICENSE in the top level directory for more
* details.
*/
/**
* @ingroup core_util
* @{
*
* @file crash.c
* @brief Crash handling functions implementation for ARM-based MCUs
*
* @author Kévin Roussel <Kevin.Roussel@inria.fr>
*/
#include "cpu.h"
#include "lpm.h"
#include "crash.h"
#include <string.h>
#include <stdio.h>
/* "public" variables holding the crash data */
char panic_str[80];
int panic_code;
/* flag preventing "recursive crash printing loop" */
static int crashed = 0;
/* WARNING: this function NEVER returns! */
NORETURN void core_panic(int crash_code, const char *message)
{
/* copy panic datas to "public" global variables */
panic_code = crash_code;
strncpy(panic_str, message, 80);
/* print panic message to console (if possible) */
if (crashed == 0) {
crashed = 1;
puts("******** SYSTEM FAILURE ********\n");
puts(message);
#if DEVELHELP
puts("******** RIOT HALTS HERE ********\n");
#else
puts("******** RIOT WILL REBOOT ********\n");
#endif
puts("\n\n");
}
/* disable watchdog and all possible sources of interrupts */
//TODO
dINT();
#if DEVELHELP
/* enter infinite loop, into deepest possible sleep mode */
while (1) {
lpm_set(LPM_OFF);
}
#else
/* DEVELHELP not set => reboot system */
reboot();
#endif
}

64
cpu/lpc1768/crash.c Normal file
View File

@ -0,0 +1,64 @@
/*
* Copyright (C) 2014 INRIA
*
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License. See the file LICENSE in the top level directory for more
* details.
*/
/**
* @ingroup core_util
* @{
*
* @file crash.c
* @brief Crash handling functions implementation for LPC1768 MCU
* (actually, a copy from 'arm_common'...)
*
* @author Kévin Roussel <Kevin.Roussel@inria.fr>
*/
#include "cpu.h"
#include "lpm.h"
#include "crash.h"
#include <string.h>
#include <stdio.h>
/* "public" variables holding the crash data */
char panic_str[80];
int panic_code;
/* flag preventing "recursive crash printing loop" */
static int crashed = 0;
/* WARNING: this function NEVER returns! */
NORETURN void core_panic(int crash_code, const char *message)
{
/* copy panic datas to "public" global variables */
panic_code = crash_code;
strncpy(panic_str, message, 80);
/* print panic message to console (if possible) */
if (crashed == 0) {
crashed = 1;
puts("******** SYSTEM FAILURE ********\n");
puts(message);
#if DEVELHELP
puts("******** RIOT HALTS HERE ********\n");
#else
puts("******** RIOT WILL REBOOT ********\n");
#endif
puts("\n\n");
}
/* disable watchdog and all possible sources of interrupts */
//TODO
dINT();
#if DEVELHELP
/* enter infinite loop, into deepest possible sleep mode */
while (1) {
lpm_set(LPM_OFF);
}
#else
/* DEVELHELP not set => reboot system */
reboot();
#endif
}

63
cpu/msp430-common/crash.c Normal file
View File

@ -0,0 +1,63 @@
/*
* Copyright (C) 2014 INRIA
*
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License. See the file LICENSE in the top level directory for more
* details.
*/
/**
* @ingroup core_util
* @{
*
* @file crash.c
* @brief Crash handling functions implementation for MSP430 MCUs
*
* @author Kévin Roussel <Kevin.Roussel@inria.fr>
*/
#include "cpu.h"
#include "lpm.h"
#include "crash.h"
#include <string.h>
#include <stdio.h>
/* "public" variables holding the crash data */
char panic_str[80];
int panic_code;
/* flag preventing "recursive crash printing loop" */
static int crashed = 0;
/* WARNING: this function NEVER returns! */
NORETURN void core_panic(int crash_code, const char *message)
{
/* copy panic datas to "public" global variables */
panic_code = crash_code;
strncpy(panic_str, message, 80);
/* (try to) print panic message to console */
if (crashed == 0) {
crashed = 1;
puts("******** SYSTEM FAILURE ********\n");
puts(message);
#if DEVELHELP
puts("******** RIOT HALTS HERE ********\n");
#else
puts("******** RIOT WILL REBOOT ********\n");
#endif
puts("\n\n");
}
/* disable watchdog and all possible sources of interrupts */
WDTCTL = WDTPW | WDTHOLD;
dINT();
#if DEVELHELP
/* enter infinite loop, into deepest possible sleep mode */
while (1) {
lpm_set(LPM_OFF);
}
#else
/* DEVELHELP not set => reboot system */
reboot();
#endif
}

55
cpu/native/crash.c Normal file
View File

@ -0,0 +1,55 @@
/*
* Copyright (C) 2014 Freie Universitaet Berlin (FUB) and INRIA
*
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License. See the file LICENSE in the top level directory for more
* details.
*/
/**
* @ingroup core_util
* @{
*
* @file crash.c
* @brief Crash handling functions implementation for 'native' port
*
* @author Ludwig Ortmann <ludwig.ortmann@fu-berlin.de>
* @author Kévin Roussel <Kevin.Roussel@inria.fr>
*/
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include "crash.h"
/* "public" variables holding the crash data (look for them in your debugger) */
char panic_str[80];
int panic_code;
/* flag preventing "recursive crash printing loop" */
static int crashed = 0;
NORETURN void core_panic(int crash_code, const char *message)
{
if (crashed == 0) {
crashed = 1;
/* copy the crash data to "long-lived" global variables */
panic_code = crash_code;
strncpy(panic_str, message, 80);
/* try to print panic message to console (if possible) */
puts("******** SYSTEM FAILURE ********\n");
puts(message);
puts("******** RIOT HALTS HERE ********\n");
puts("\n\n");
}
/* since we're atop an Unix-like platform,
just use the (developer-)friendly core-dump feature */
kill(getpid(), SIGTRAP);
/* proove the compiler that we won't return from this function
(even if we actually won't even get here...) */
while (1) {
/* nothing in particular */;
}
}