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;