[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Minios-devel] [UNIKRAFT RFC PATCH] Implement PL031 RTC library for Arm



Hi,

> -----Original Message-----
> From: Julien Grall <julien.grall@xxxxxxx>
> Sent: Saturday, November 10, 2018 1:44 AM
> To: Jianyong Wu (Arm Technology China) <Jianyong.Wu@xxxxxxx>; minios-
> devel@xxxxxxxxxxxxxxxxxxxx; simon.kuenzer@xxxxxxxxx
> Cc: Kaly Xin (Arm Technology China) <Kaly.Xin@xxxxxxx>; nd
> <nd@xxxxxxx>; Wei Chen (Arm Technology China) <Wei.Chen@xxxxxxx>
> Subject: Re: [Minios-devel] [UNIKRAFT RFC PATCH] Implement PL031 RTC
> library for Arm
> 
> Hi,
> 
> On 09/11/2018 08:55, Jianyong Wu wrote:
> > Signed-off-by: Wei Chen <wei.chen@xxxxxxx>
> > Signed-off-by: Jianyong Wu <jianyong.wu@xxxxxxx>
> > ---
> >   lib/fdt/include/libfdt.h      |   1 +
> >   plat/common/arm/rtc.c         | 140
> ++++++++++++++++++++++++++++++++++++++++++
> >   plat/common/include/arm/rtc.h |  43 +++++++++++++
> >   plat/kvm/Makefile.uk          |   1 +
> >   4 files changed, 185 insertions(+)
> >   create mode 100644 plat/common/arm/rtc.c
> >   create mode 100644 plat/common/include/arm/rtc.h
> >
> > diff --git a/lib/fdt/include/libfdt.h b/lib/fdt/include/libfdt.h index
> > 05dedbd..96d530d 100644
> > --- a/lib/fdt/include/libfdt.h
> > +++ b/lib/fdt/include/libfdt.h
> > @@ -1873,4 +1873,5 @@ const char *fdt_strerror(int errval);
> >   }
> >   #endif
> >
> > +void *_libkvmplat_dtb;
> 
> This likely belong to a separate patch.
> 
Yeah, this should be removed.

> >   #endif /* _LIBFDT_H */
> > diff --git a/plat/common/arm/rtc.c b/plat/common/arm/rtc.c new file
> > mode 100644 index 0000000..56ee015
> > --- /dev/null
> > +++ b/plat/common/arm/rtc.c
> > @@ -0,0 +1,140 @@
> > +/* SPDX-License-Identifier: BSD-3-Clause */
> > +/*
> > + * Authors: Wei Chen <Wei.Chen@xxxxxxx>
> > + *          Jianyong Wu <Jianyong.Wu@xxxxxxx>
> > + *
> > + * Copyright (c) 2018, Arm Ltd. All rights reserved.
> > + *
> > + * 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 copyright holder 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
> > + *
> > + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
> > + */
> > +#include <string.h>
> > +#include <libfdt.h>
> > +#include <uk/assert.h>
> > +#include <uk/essentials.h>
> > +#include <uk/print.h>
> > +#include <arm/cpu.h>
> > +
> > +static void *rtc_base_addr;
> > +uint32_t rtc_boot_seconds;
> > +
> > +/* Define offset of RTC registers */
> > +#define RTC_REG_DR 0
> > +#define RTC_REG_MR 0x4
> > +#define RTC_REG_LR 0x8
> > +#define RTC_REG_CR 0xc
> > +#define RTC_REG_IMSC       0x10
> > +#define RTC_REG_RIS        0x14
> > +#define RTC_REG_MIS        0x18
> > +#define RTC_REG_ICR        0x1c
> > +
> > +#define RTC_REG(r) (rtc_base_addr + (r))
> > +
> > +static char *rtc_device_list[] = {
> > +   "arm,pl031",
> > +};
> > +
> > +uint32_t rtc_read(void)
> > +{
> > +   return ioreg_read32(RTC_REG(RTC_REG_DR));
> > +}
> > +
> > +/*
> > + * set rtc match register comparing with counter
> > + * value to generat a interrupt
> > + */
> > +void rtc_set_match(uint32_t alam)
> > +{
> > +   ioreg_write32(RTC_REG(RTC_REG_MR), alam); }
> > +
> > +void rtc_update(uint32_t val)
> > +{
> > +   ioreg_write32(RTC_REG(RTC_REG_LR), val); }
> > +
> > +void rtc_enable(void)
> > +{
> > +   ioreg_write32(RTC_REG(RTC_REG_CR), 1); }
> > +
> > +/* return rtc status, 1 denotes enable and 0 denotes disable */
> > +uint32_t rtc_get_status(void) {
> > +   uint32_t val;
> > +
> > +   val = ioreg_read32(RTC_REG(RTC_REG_CR));
> > +   val &= 0x1;
> > +   return val;
> > +}
> > +
> > +/* mask alam */
> > +void rtc_mask_intr(void)
> > +{
> > +   ioreg_write32(RTC_REG(RTC_REG_IMSC), 1); }
> > +
> > +/* clear alam mask */
> > +void rtc_unmask_intr(void)
> > +{
> > +   ioreg_write32(RTC_REG(RTC_REG_IMSC), 0); }
> > +
> > +/* return the raw state of rtc interrupt before masking*/ uint32_t
> > +rtc_get_intr_raw_state(void) {
> > +   return ioreg_read32(RTC_REG(RTC_REG_RIS));
> > +}
> > +
> > +/* return interrupt state after interrupt masking */ uint32_t
> > +rtc_get_intr_state(void) {
> > +   return ioreg_read32(RTC_REG(RTC_REG_MIS));
> > +}
> > +
> > +void rtc_clear_intr(void)
> > +{
> > +   ioreg_write32(RTC_REG(RTC_REG_ICR), 1); }
> > +
> > +int _dtb_init_rtc(void *dtb)
> > +{
> > +   uint32_t idx;
> > +   int fdt_rtc, naddr, nsize, size, prop_len, prop_min_len;
> > +   const uint64_t *regs;
> > +
> > +   uk_printd(DLVL_INFO, "Probing RTC...\n");
> > +   fdt_rtc = uk_dtb_find_device(dtb, rtc_device_list,
> > +           sizeof(rtc_device_list));
> 
> I would not assume the RTC is always present.

The check is inside uk_dtb_read_region.
> 
> > +   naddr = uk_dtb_read_region(dtb, fdt_rtc, &nsize, &regs);
> > +   rtc_base_addr = uk_dtb_read_term(regs, 0, naddr, nsize, &size);
> 
> Similarly here, I would not assume uk_dtb_read_term() will always succeed.
> It would make the code more safe if the DT passed is wrong.


Check has been done in this function.
> 
> > +
> > +   /* Record the boot seconds */
> > +   rtc_boot_seconds = rtc_read();
> > +
> > +   uk_printd(DLVL_INFO, "Found RTC on: %p\n", rtc_base_addr);
> 
> I am slightly surprised this compile in Unikraft. This function is meant to
> return an integer but I don't see any return here.

Which function? Rtc_read()? Check it again.

Bests
Jianyong wu
> 
> > +}
> > diff --git a/plat/common/include/arm/rtc.h
> > b/plat/common/include/arm/rtc.h new file mode 100644 index
> > 0000000..d8bab7f
> > --- /dev/null
> > +++ b/plat/common/include/arm/rtc.h
> > @@ -0,0 +1,43 @@
> > +/* SPDX-License-Identifier: BSD-3-Clause */
> > +/*
> > + * Authors: Wei Chen <Wei.Chen@xxxxxxx>
> > + *          Jianyong Wu <Jianyong.Wu@xxxxxxx>
> > + *
> > + * Copyright (c) 2018, Arm Ltd. All rights reserved.
> > + *
> > + * 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 copyright holder 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
> > + *
> > + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
> > + */
> > +
> > +#ifndef __PLAT_CMN_ARM_RTC_H__
> > +#define __PLAT_CMN_ARM_RTC_H__
> > +
> > +extern uint32_t rtc_boot_seconds;
> > +
> > +int _dtb_init_rtc(void *dtb);
> 
> Where do you expect this function to be called?
> 
> > +
> > +#endif //__PLAT_CMN_ARM_GICV2_H__
> 
> Wrong guard?
> 
> > diff --git a/plat/kvm/Makefile.uk b/plat/kvm/Makefile.uk index
> > 8e481b4..197175a 100644
> > --- a/plat/kvm/Makefile.uk
> > +++ b/plat/kvm/Makefile.uk
> > @@ -60,6 +60,7 @@ LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) +=
> $(UK_PLAT_COMMON_BASE)/arm/psci_arm64.S
> >   LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) +=
> $(UK_PLAT_COMMON_BASE)/arm/time.c|common
> >   LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) +=
> $(UK_PLAT_COMMON_BASE)/arm/traps.c|common
> >   LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) +=
> > $(UK_PLAT_COMMON_BASE)/arm/fdt.c|common
> > +LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) +=
> > +$(UK_PLAT_COMMON_BASE)/arm/rtc.c|common
> >   LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) +=
> $(LIBKVMPLAT_BASE)/arm/entry64.S
> >   LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) +=
> $(LIBKVMPLAT_BASE)/arm/exceptions.S
> >   LIBKVMPLAT_SRCS-$(CONFIG_ARCH_ARM_64) +=
> > $(LIBKVMPLAT_BASE)/arm/pagetable.S
> >
> 
> --
> Julien Grall
_______________________________________________
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®.