From 846bde90e6b1001480016fa46a957a9e726af68a Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 19 Mar 2012 16:59:53 +0000 Subject: [PATCH] [time] Define an API for getting the current time Signed-off-by: Michael Brown --- src/arch/i386/include/bits/time.h | 12 ++++++ src/arch/x86_64/include/bits/time.h | 12 ++++++ src/config/defaults/efi.h | 1 + src/config/defaults/linux.h | 1 + src/config/defaults/pcbios.h | 1 + src/config/time.h | 16 ++++++++ src/core/null_time.c | 29 +++++++++++++++ src/include/ipxe/null_time.h | 23 ++++++++++++ src/include/ipxe/time.h | 58 +++++++++++++++++++++++++++++ src/include/time.h | 16 ++++++++ 10 files changed, 169 insertions(+) create mode 100644 src/arch/i386/include/bits/time.h create mode 100644 src/arch/x86_64/include/bits/time.h create mode 100644 src/config/time.h create mode 100644 src/core/null_time.c create mode 100644 src/include/ipxe/null_time.h create mode 100644 src/include/ipxe/time.h diff --git a/src/arch/i386/include/bits/time.h b/src/arch/i386/include/bits/time.h new file mode 100644 index 00000000..d2baacd8 --- /dev/null +++ b/src/arch/i386/include/bits/time.h @@ -0,0 +1,12 @@ +#ifndef _BITS_TIME_H +#define _BITS_TIME_H + +/** @file + * + * i386-specific time API implementations + * + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +#endif /* _BITS_TIME_H */ diff --git a/src/arch/x86_64/include/bits/time.h b/src/arch/x86_64/include/bits/time.h new file mode 100644 index 00000000..59b35535 --- /dev/null +++ b/src/arch/x86_64/include/bits/time.h @@ -0,0 +1,12 @@ +#ifndef _BITS_TIME_H +#define _BITS_TIME_H + +/** @file + * + * x86_64-specific time API implementations + * + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +#endif /* _BITS_TIME_H */ diff --git a/src/config/defaults/efi.h b/src/config/defaults/efi.h index c0bb78da..16a44dd5 100644 --- a/src/config/defaults/efi.h +++ b/src/config/defaults/efi.h @@ -18,6 +18,7 @@ #define SANBOOT_NULL #define BOFM_EFI #define ENTROPY_NULL +#define TIME_NULL #define IMAGE_EFI /* EFI image support */ #define IMAGE_SCRIPT /* iPXE script image support */ diff --git a/src/config/defaults/linux.h b/src/config/defaults/linux.h index fcdf9040..58c73c38 100644 --- a/src/config/defaults/linux.h +++ b/src/config/defaults/linux.h @@ -15,6 +15,7 @@ #define SMBIOS_LINUX #define SANBOOT_NULL #define ENTROPY_LINUX +#define TIME_NULL #define DRIVERS_LINUX diff --git a/src/config/defaults/pcbios.h b/src/config/defaults/pcbios.h index 17e6ef63..2bb82cf0 100644 --- a/src/config/defaults/pcbios.h +++ b/src/config/defaults/pcbios.h @@ -19,6 +19,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #define SMBIOS_PCBIOS #define SANBOOT_PCBIOS #define ENTROPY_RTC +#define TIME_NULL #define IMAGE_ELF /* ELF image support */ #define IMAGE_MULTIBOOT /* MultiBoot image support */ diff --git a/src/config/time.h b/src/config/time.h new file mode 100644 index 00000000..0576211f --- /dev/null +++ b/src/config/time.h @@ -0,0 +1,16 @@ +#ifndef CONFIG_TIME_H +#define CONFIG_TIME_H + +/** @file + * + * Time API configuration + * + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +#include + +#include + +#endif /* CONFIG_TIME_H */ diff --git a/src/core/null_time.c b/src/core/null_time.c new file mode 100644 index 00000000..f9c48a95 --- /dev/null +++ b/src/core/null_time.c @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2012 Michael Brown . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +/** @file + * + * Nonexistent time source + * + */ + +#include + +PROVIDE_TIME_INLINE ( null, time_now ); diff --git a/src/include/ipxe/null_time.h b/src/include/ipxe/null_time.h new file mode 100644 index 00000000..2b72cdf5 --- /dev/null +++ b/src/include/ipxe/null_time.h @@ -0,0 +1,23 @@ +#ifndef _IPXE_NULL_TIME_H +#define _IPXE_NULL_TIME_H + +/** @file + * + * Nonexistent time source + * + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +#ifdef TIME_NULL +#define TIME_PREFIX_null +#else +#define TIME_PREFIX_null __null_ +#endif + +static inline __always_inline time_t +TIME_INLINE ( null, time_now ) ( void ) { + return 0; +} + +#endif /* _IPXE_NULL_TIME_H */ diff --git a/src/include/ipxe/time.h b/src/include/ipxe/time.h new file mode 100644 index 00000000..c74959f8 --- /dev/null +++ b/src/include/ipxe/time.h @@ -0,0 +1,58 @@ +#ifndef _IPXE_TIME_H +#define _IPXE_TIME_H + +/** @file + * + * Time source + * + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +#include +#include +#include + +/** + * Calculate static inline time API function name + * + * @v _prefix Subsystem prefix + * @v _api_func API function + * @ret _subsys_func Subsystem API function + */ +#define TIME_INLINE( _subsys, _api_func ) \ + SINGLE_API_INLINE ( TIME_PREFIX_ ## _subsys, _api_func ) + +/** + * Provide a time API implementation + * + * @v _prefix Subsystem prefix + * @v _api_func API function + * @v _func Implementing function + */ +#define PROVIDE_TIME( _subsys, _api_func, _func ) \ + PROVIDE_SINGLE_API ( TIME_PREFIX_ ## _subsys, _api_func, _func ) + +/** + * Provide a static inline time API implementation + * + * @v _prefix Subsystem prefix + * @v _api_func API function + */ +#define PROVIDE_TIME_INLINE( _subsys, _api_func ) \ + PROVIDE_SINGLE_API_INLINE ( TIME_PREFIX_ ## _subsys, _api_func ) + +/* Include all architecture-independent time API headers */ +#include + +/* Include all architecture-dependent time API headers */ +#include + +/** + * Get current time in seconds + * + * @ret time Time, in seconds + */ +time_t time_now ( void ); + +#endif /* _IPXE_TIME_H */ diff --git a/src/include/time.h b/src/include/time.h index f33300ab..bc73af4c 100644 --- a/src/include/time.h +++ b/src/include/time.h @@ -7,6 +7,7 @@ */ #include +#include /** Broken-down time */ struct tm { @@ -30,6 +31,21 @@ struct tm { int tm_isdst; }; +/** + * Get current time in seconds since the Epoch + * + * @v t Time to fill in, or NULL + * @ret time Current time + */ +static inline time_t time ( time_t *t ) { + time_t now; + + now = time_now(); + if ( t ) + *t = now; + return now; +} + extern time_t mktime ( struct tm *tm ); #endif /* _TIME_H */