From e6111c151794c4c15a0988e259666ef5be24ffcc Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 13 Jun 2016 15:29:05 +0100 Subject: [PATCH] [time] Allow system clock to be adjusted at runtime Provide a mechanism to allow an arbitrary adjustment to be applied to all subsequent calls to time(). Note that the underlying clock source (e.g. the RTC clock) will not be changed; only the time as reported within iPXE will be affected. Signed-off-by: Michael Brown --- src/core/time.c | 3 +++ src/include/ipxe/time.h | 15 ++++++++++++++- src/include/time.h | 4 ++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/core/time.c b/src/core/time.c index 29a924eb..c353ac5b 100644 --- a/src/core/time.c +++ b/src/core/time.c @@ -43,6 +43,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); * 400. */ +/** Current system clock offset */ +signed long time_offset; + /** Days of week (for debugging) */ static const char *weekdays[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" diff --git a/src/include/ipxe/time.h b/src/include/ipxe/time.h index 4c5bb2a0..89bf90e0 100644 --- a/src/include/ipxe/time.h +++ b/src/include/ipxe/time.h @@ -50,11 +50,24 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); /* Include all architecture-dependent time API headers */ #include +extern signed long time_offset; + /** - * Get current time in seconds + * Get current time in seconds (ignoring system clock offset) * * @ret time Time, in seconds */ time_t time_now ( void ); +/** + * Adjust system clock + * + * @v delta Clock adjustment, in seconds + */ +static inline __attribute__ (( always_inline )) void +time_adjust ( signed long delta ) { + + time_offset += delta; +} + #endif /* _IPXE_TIME_H */ diff --git a/src/include/time.h b/src/include/time.h index 462ac699..ab93a3db 100644 --- a/src/include/time.h +++ b/src/include/time.h @@ -39,10 +39,10 @@ struct tm { * @v t Time to fill in, or NULL * @ret time Current time */ -static inline time_t time ( time_t *t ) { +static inline __attribute__ (( always_inline )) time_t time ( time_t *t ) { time_t now; - now = time_now(); + now = ( time_now() + time_offset ); if ( t ) *t = now; return now;