/* watchdog.c */ #include "watchdog.h" #include "panic.h" #include "timer.h" /* There are two watchdogs to worry about. The hardware one, and watchdogs to make sure that critical parts of the software are running. */ /* * This is about 10 times round the main loop. If we haven't had a kick by * now, something's gone horribly wrong. */ #define WATCHDOG_TIMEOUT (100 * TIMER_MS) static unsigned int watchdog_last_seen[WATCHDOG_MODULES]; void watchdog_kick(unsigned int module) { if (module > WATCHDOG_MODULES) return; watchdog_last_seen[module] = timer_read(); } void watchdog_check(void) { unsigned int time = timer_read(); int i; /* XXX not yet */ /* return; */ for (i = 0; i < WATCHDOG_MODULES; i++) { if ((signed int)(watchdog_last_seen[i] + WATCHDOG_TIMEOUT - time) < 0) { panic(PANIC_WATCHDOG_TIMEOUT + i); } } } void init_watchdog(void) { unsigned int time = timer_read(); int i; for (i = 0; i < WATCHDOG_MODULES; i++) { watchdog_last_seen[i] = time; } }