|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH v2 7/8] lib/uktimeconv: Add time conversion library
Reviewed-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx>
Simon Kuenzer <simon.kuenzer@xxxxxxxxx> writes:
> libuktimeconv adds helpers for detecting leap years,
> calculating the days per month or year, and converting
> BMK clocks to __nsec timestamps.
> The code is ported from Solo5.
>
> Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx>
> Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> ---
> lib/Config.uk | 1 +
> lib/Makefile.uk | 1 +
> lib/uktimeconv/Config.uk | 4 +
> lib/uktimeconv/Makefile.uk | 6 +
> lib/uktimeconv/include/uk/timeconv.h | 109 +++++++++++++++++
> lib/uktimeconv/timeconv.c | 228
> +++++++++++++++++++++++++++++++++++
> 6 files changed, 349 insertions(+)
> create mode 100644 lib/uktimeconv/Config.uk
> create mode 100644 lib/uktimeconv/Makefile.uk
> create mode 100644 lib/uktimeconv/include/uk/timeconv.h
> create mode 100644 lib/uktimeconv/timeconv.c
>
> diff --git a/lib/Config.uk b/lib/Config.uk
> index 637c5d4..5bf5ebc 100644
> --- a/lib/Config.uk
> +++ b/lib/Config.uk
> @@ -26,6 +26,7 @@ config HAVE_SCHED
> source "lib/ukboot/Config.uk"
> source "lib/ukdebug/Config.uk"
> source "lib/ukargparse/Config.uk"
> +source "lib/uktimeconv/Config.uk"
> source "lib/nolibc/Config.uk"
> source "lib/ukalloc/Config.uk"
> source "lib/ukallocbbuddy/Config.uk"
> diff --git a/lib/Makefile.uk b/lib/Makefile.uk
> index a594137..d08a50f 100644
> --- a/lib/Makefile.uk
> +++ b/lib/Makefile.uk
> @@ -7,6 +7,7 @@
> $(eval $(call _import_lib,$(UK_BASE)/lib/ukboot))
> $(eval $(call _import_lib,$(UK_BASE)/lib/ukdebug))
> $(eval $(call _import_lib,$(UK_BASE)/lib/ukargparse))
> +$(eval $(call _import_lib,$(UK_BASE)/lib/uktimeconv))
> $(eval $(call _import_lib,$(UK_BASE)/lib/nolibc))
> $(eval $(call _import_lib,$(UK_BASE)/lib/ukalloc))
> $(eval $(call _import_lib,$(UK_BASE)/lib/ukallocbbuddy))
> diff --git a/lib/uktimeconv/Config.uk b/lib/uktimeconv/Config.uk
> new file mode 100644
> index 0000000..f0494ca
> --- /dev/null
> +++ b/lib/uktimeconv/Config.uk
> @@ -0,0 +1,4 @@
> +config LIBUKTIMECONV
> + bool "uktimeconv: Time conversion functions"
> + default n
> + select LIBUKDEBUG
> diff --git a/lib/uktimeconv/Makefile.uk b/lib/uktimeconv/Makefile.uk
> new file mode 100644
> index 0000000..0f44984
> --- /dev/null
> +++ b/lib/uktimeconv/Makefile.uk
> @@ -0,0 +1,6 @@
> +$(eval $(call addlib_s,libuktimeconv,$(LIBUKTIMECONV)))
> +
> +CINCLUDES-$(LIBUKTIMECONV) += -I$(LIBUKTIMECONV_BASE)/include
> +CXXINCLUDES-$(LIBUKTIMECONV) += -I$(LIBUKTIMECONV_BASE)/include
> +
> +LIBUKTIMECONV_SRCS-y += $(LIBUKTIMECONV_BASE)/timeconv.c
> diff --git a/lib/uktimeconv/include/uk/timeconv.h
> b/lib/uktimeconv/include/uk/timeconv.h
> new file mode 100644
> index 0000000..0a67bb5
> --- /dev/null
> +++ b/lib/uktimeconv/include/uk/timeconv.h
> @@ -0,0 +1,109 @@
> +/* SPDX-License-Identifier: ISC AND BSD-2-Clause-NetBSD */
> +/*
> + * Authors: Martin Lucina
> + * Ricardo Koller
> + * Costin Lupu <costin.lupu@xxxxxxxxx>
> + * Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> + *
> + * Copyright (c) 2015-2017 IBM
> + * Copyright (c) 2016-2017 Docker, Inc.
> + * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation
> + *
> + * Permission to use, copy, modify, and/or distribute this software
> + * for any purpose with or without fee is hereby granted, provided
> + * that the above copyright notice and this permission notice appear
> + * in all copies.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
> + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
> + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
> + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
> + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
> + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
> + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
> + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +/* Taken from solo5 clock_subr.h */
> +
> +/*-
> + * Copyright (c) 1996 The NetBSD Foundation, Inc.
> + * All rights reserved.
> + *
> + * This code is derived from software contributed to The NetBSD Foundation
> + * by Gordon W. Ross
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
> + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> LIMITED
> + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
> + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +#ifndef __UKTIMECONV_H__
> +#define __UKTIMECONV_H__
> +
> +#include <uk/arch/time.h>
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +/* Some handy constants. */
> +#define __SECS_PER_MINUTE 60
> +#define __SECS_PER_HOUR 3600
> +#define __SECS_PER_DAY 86400
> +#define __DAYS_PER_COMMON_YEAR 365
> +#define __DAYS_PER_LEAP_YEAR 366
> +
> +struct uktimeconv_bmkclock {
> + __s64 dt_year;
> + __u8 dt_mon;
> + __u8 dt_day;
> + __u8 dt_hour;
> + __u8 dt_min;
> + __u8 dt_sec;
> +};
> +
> +int uktimeconv_is_leap_year(__s64 year);
> +__u8 uktimeconv_days_in_month(__u8 month, int is_leap_year);
> +
> +static inline __u16 uktimeconv_days_per_year(__s64 year)
> +{
> + return uktimeconv_is_leap_year(year)
> + ? __DAYS_PER_LEAP_YEAR
> + : __DAYS_PER_COMMON_YEAR;
> +}
> +
> +/*
> + * "POSIX time" from "YY/MM/DD/hh/mm/ss"
> + */
> +__nsec uktimeconv_bmkclock_to_nsec(struct uktimeconv_bmkclock *dt);
> +
> +/*
> + * BCD to binary.
> + */
> +static inline unsigned int uktimeconv_bcdtobin(unsigned int bcd)
> +{
> + return ((bcd >> 4) & 0x0f) * 10 + (bcd & 0x0f);
> +}
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* __UKTIMECONV_H__ */
> diff --git a/lib/uktimeconv/timeconv.c b/lib/uktimeconv/timeconv.c
> new file mode 100644
> index 0000000..0d07f50
> --- /dev/null
> +++ b/lib/uktimeconv/timeconv.c
> @@ -0,0 +1,228 @@
> +/* SPDX-License-Identifier: ISC AND BSD-2-Clause-NetBSD AND BSD-3-Clause */
> +/*
> + * Authors: Martin Lucina
> + * Ricardo Koller
> + * Costin Lupu <costin.lupu@xxxxxxxxx>
> + * Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> + *
> + * Copyright (c) 2015-2017 IBM
> + * Copyright (c) 2016-2017 Docker, Inc.
> + * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation
> + *
> + * Permission to use, copy, modify, and/or distribute this software
> + * for any purpose with or without fee is hereby granted, provided
> + * that the above copyright notice and this permission notice appear
> + * in all copies.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
> + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
> + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
> + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
> + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
> + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
> + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
> + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + */
> +/* Taken from solo5 clock_subr.c */
> +
> +/* $NetBSD: clock_subr.c,v 1.26 2014/12/22 18:09:20 christos Exp $ */
> +
> +/*-
> + * Copyright (c) 1996 The NetBSD Foundation, Inc.
> + * All rights reserved.
> + *
> + * This code is derived from software contributed to The NetBSD Foundation
> + * by Gordon W. Ross
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
> + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> LIMITED
> + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
> + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + */
> +
> +/*
> + * Copyright (c) 1988 University of Utah.
> + * Copyright (c) 1982, 1990, 1993
> + * The Regents of the University of California. All rights reserved.
> + *
> + * This code is derived from software contributed to Berkeley by
> + * the Systems Programming Group of the University of Utah Computer
> + * Science Department.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + * 3. Neither the name of the University nor the names of its contributors
> + * may be used to endorse or promote products derived from this software
> + * without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + *
> + * from: Utah $Hdr: clock.c 1.18 91/01/21$
> + *
> + * @(#)clock.c 8.2 (Berkeley) 1/12/94
> + */
> +
> +#include <uk/timeconv.h>
> +#include <uk/assert.h>
> +
> +#define SECS_PER_COMMON_YEAR (__SECS_PER_DAY * DAYS_PER_COMMON_YEAR)
> +#define SECS_PER_LEAP_YEAR (__SECS_PER_DAY * DAYS_PER_LEAP_YEAR)
> +
> +#define FEBRUARY 2
> +
> +/* Traditional POSIX base year */
> +#define POSIX_BASE_YEAR 1970
> +
> +/* Some handy functions */
> +static __u8 _days_in_month(__u8 m)
> +{
> + switch (m) {
> + case FEBRUARY:
> + return 28;
> + case 4: case 6: case 9: case 11:
> + return 30;
> + case 1: case 3: case 5: case 7: case 8: case 10: case 12:
> + return 31;
> + default:
> + /* m out of range */
> + return 0;
> + }
> +}
> +
> +__u8 uktimeconv_days_in_month(__u8 month, int is_leap_year)
> +{
> + __u8 days;
> +
> + days = _days_in_month(month);
> + if (is_leap_year && month == FEBRUARY)
> + ++days;
> +
> + return days;
> +}
> +
> +/*
> + * This function avoids some unnecessary modulo
> + * operations as compared with the usual macro:
> + * ( ((year % 4) == 0 &&
> + * (year % 100) != 0) ||
> + * ((year % 400) == 0) )
> + * It is otherwise equivalent.
> + */
> +int uktimeconv_is_leap_year(__s64 year)
> +{
> + if ((year & 3) != 0)
> + return 0;
> +
> + if ((year % 100) != 0)
> + return 1;
> +
> + return (year % 400) == 0;
> +}
> +
> +
> +/*
> + * Generic routines to convert between a POSIX date
> + * (seconds since 1/1/1970) and yr/mo/day/hr/min/sec
> + * Derived from arch/hp300/hp300/clock.c
> + */
> +
> +/* for easier alignment:
> + * time from the epoch to 2000 (there were 7 leap years):
> + */
> +#define DAYSTO2000 (365 * 30 + 7)
> +
> +/* 4 year intervals include 1 leap year */
> +#define DAYS4YEARS (365 * 4 + 1)
> +
> +/* 100 year intervals include 24 leap years */
> +#define DAYS100YEARS (365 * 100 + 24)
> +
> +/* 400 year intervals include 97 leap years */
> +#define DAYS400YEARS (365 * 400 + 97)
> +
> +__nsec uktimeconv_bmkclock_to_nsec(struct uktimeconv_bmkclock *dt)
> +{
> + __u64 secs, year, days, i;
> +
> + UK_ASSERT(dt->dt_year >= POSIX_BASE_YEAR);
> +
> + /*
> + * Compute days since start of time
> + * First from years, then from months.
> + */
> + year = (__u64) dt->dt_year;
> + days = 0;
> + if (uktimeconv_is_leap_year(year) && dt->dt_mon > FEBRUARY)
> + days++;
> +
> + if (year < 2000) {
> + /* simple way for early years */
> + for (i = POSIX_BASE_YEAR; i < year; i++)
> + days += uktimeconv_days_per_year(i);
> +
> + } else {
> + /* years are properly aligned */
> + days += DAYSTO2000;
> + year -= 2000;
> +
> + i = year / 400;
> + days += i * DAYS400YEARS;
> + year -= i * 400;
> +
> + i = year / 100;
> + days += i * DAYS100YEARS;
> + year -= i * 100;
> +
> + i = year / 4;
> + days += i * DAYS4YEARS;
> + year -= i * 4;
> +
> + for (i = dt->dt_year - year; i < (__u64) dt->dt_year; i++)
> + days += uktimeconv_days_per_year(i);
> + }
> +
> + /* Months */
> + for (i = 1; i < dt->dt_mon; i++)
> + days += _days_in_month(i);
> + days += (dt->dt_day - 1);
> +
> + /* Add hours, minutes, seconds. */
> + secs = ((days
> + * 24 + dt->dt_hour)
> + * 60 + dt->dt_min)
> + * 60 + dt->dt_sec;
> +
> + return ukarch_time_sec_to_nsec((__nsec) secs);
> +}
> --
> 2.7.4
>
--
Yuri Volchkov
Software Specialist
NEC Europe Ltd
Kurfürsten-Anlage 36
D-69115 Heidelberg
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |