[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.