From a8f80a75d25970f1e4e607e761a153a7d57b9a15 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 1 Feb 2017 15:30:41 +0000 Subject: [PATCH] [time] Report attempts to use timers before initialisation Signed-off-by: Michael Brown --- src/core/timer.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/core/timer.c b/src/core/timer.c index ed724605..791cdcdb 100644 --- a/src/core/timer.c +++ b/src/core/timer.c @@ -24,7 +24,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include -#include #include #include #include @@ -42,7 +41,14 @@ static struct timer *timer; */ unsigned long currticks ( void ) { - assert ( timer != NULL ); + /* Guard against use during early initialisation */ + if ( ! timer ) { + DBGC ( &timer, "TIMER currticks() called before initialisation " + "from %p\n", __builtin_return_address ( 0 ) ); + return 0; + } + + /* Use selected timer */ return timer->currticks(); } @@ -53,7 +59,14 @@ unsigned long currticks ( void ) { */ void udelay ( unsigned long usecs ) { - assert ( timer != NULL ); + /* Guard against use during early initialisation */ + if ( ! timer ) { + DBGC ( &timer, "TIMER udelay() called before initialisation " + "from %p\n", __builtin_return_address ( 0 ) ); + return; + } + + /* Use selected timer */ timer->udelay ( usecs ); } @@ -63,6 +76,15 @@ void udelay ( unsigned long usecs ) { * @v msecs Number of milliseconds for which to delay */ void mdelay ( unsigned long msecs ) { + + /* Guard against use during early initialisation */ + if ( ! timer ) { + DBGC ( &timer, "TIMER mdelay() called before initialisation " + "from %p\n", __builtin_return_address ( 0 ) ); + return; + } + + /* Delay for specified number of milliseconds */ while ( msecs-- ) udelay ( 1000 ); }