> Date: Sun, 12 Jul 2020 00:06:21 +0200
> From: Christian Weisgerber <na...@mips.inka.de>
> 
> Mark Kettenis:
> 
> > Nevertheless, here is a different take on the problem. Since the
> > timecounter only uses the low 32 bits we don't need the double read.
> > This version also changes the timecounter mask from 0x7fffffff to
> > 0xffffffff.  That must be ok, since the counter has 64 bits and we are
> > already using 0xffffffff as a mask on amd64 and sparc64.
> > 
> > ok?
> 
> Yes, but don't forget the part in sys/arch/arm64/include/timetc.h.
> 
> Also, if I may ask, ...
> 
> > Index: sys/arch/arm64/dev/agtimer.c
> > ===================================================================
> > RCS file: /cvs/src/sys/arch/arm64/dev/agtimer.c,v
> > retrieving revision 1.14
> > diff -u -p -r1.14 agtimer.c
> > --- sys/arch/arm64/dev/agtimer.c    11 Jul 2020 15:22:44 -0000      1.14
> > +++ sys/arch/arm64/dev/agtimer.c    11 Jul 2020 18:35:12 -0000
> > @@ -43,7 +43,8 @@ int32_t agtimer_frequency = TIMER_FREQUE
> >  u_int agtimer_get_timecount(struct timecounter *);
> >  
> >  static struct timecounter agtimer_timecounter = {
> > -   agtimer_get_timecount, NULL, 0x7fffffff, 0, "agtimer", 0, NULL, 0
> > +   agtimer_get_timecount, NULL, 0xffffffff, 0, "agtimer", 0, NULL,
> > +   TC_AGTIMER
> >  };
> >  
> >  struct agtimer_pcpu_softc {
> > @@ -191,7 +192,15 @@ agtimer_attach(struct device *parent, st
> >  u_int
> >  agtimer_get_timecount(struct timecounter *tc)
> >  {
> > -   return agtimer_readcnt64();
> > +   uint64_t val;
> > +
> > +   /*
> > +    * No need to work around Cortex-A73 errata 858921 since we
> > +    * only look at the low 32 bits here.
> > +    */
> > +   __asm volatile("isb" ::: "memory");
> > +   __asm volatile("mrs %x0, CNTVCT_EL0" : "=r" (val));
> > +   return (val & 0xffffffff);
> 
> Is there any point, stylistically I mean, to explicitly masking
> this over the truncation implicit in the types?  I'm pretty sure
> we do, say, "intvar = int64var" all the time.

I tried to make it explicit that the result is truncated to 32 bits.
But indeed this isn't necessary.  The compiler knows and optimizes it
away completely.  I can leave it out if you think that's better.

> 
> >  }
> >  
> >  int
> > Index: lib/libc/arch/aarch64/gen/usertc.c
> > ===================================================================
> > RCS file: /cvs/src/lib/libc/arch/aarch64/gen/usertc.c,v
> > retrieving revision 1.1
> > diff -u -p -r1.1 usertc.c
> > --- lib/libc/arch/aarch64/gen/usertc.c      6 Jul 2020 13:33:05 -0000       
> > 1.1
> > +++ lib/libc/arch/aarch64/gen/usertc.c      11 Jul 2020 18:35:12 -0000
> > @@ -1,6 +1,6 @@
> > -/* $OpenBSD: usertc.c,v 1.1 2020/07/06 13:33:05 pirofti Exp $      */
> > +/* $OpenBSD$       */
> >  /*
> > - * Copyright (c) 2020 Paul Irofti <p...@irofti.net>
> > + * Copyright (c) 2020 Mark Kettenis <kette...@openbsd.org>
> >   *
> >   * Permission to use, copy, modify, and distribute this software for any
> >   * purpose with or without fee is hereby granted, provided that the above
> > @@ -18,4 +18,30 @@
> >  #include <sys/types.h>
> >  #include <sys/timetc.h>
> >  
> > -int (*const _tc_get_timecount)(struct timekeep *, u_int *) = NULL;
> > +static inline u_int
> > +agtimer_get_timecount(struct timecounter *tc)
> > +{
> > +   uint64_t val;
> > +
> > +   /*
> > +    * No need to work around Cortex-A73 errata 858921 since we
> > +    * only look at the low 32 bits here.
> > +    */
> > +   __asm volatile("isb" ::: "memory");
> > +   __asm volatile("mrs %x0, CNTVCT_EL0" : "=r" (val));
> > +   return (val & 0xffffffff);
> > +}
> > +
> > +static int
> > +tc_get_timecount(struct timekeep *tk, u_int *tc)
> > +{
> > +   switch (tk->tk_user) {
> > +   case TC_AGTIMER:
> > +           *tc = agtimer_get_timecount(NULL);
> > +           return 0;
> > +   }
> > +
> > +   return -1;
> > +}
> > +
> > +int (*const _tc_get_timecount)(struct timekeep *, u_int *) = 
> > tc_get_timecount;
> > 
> 
> -- 
> Christian "naddy" Weisgerber                          na...@mips.inka.de
> 

Reply via email to