> From: Jeremie Courreges-Anglas <[email protected]>
> Date: Sun, 25 Jul 2021 04:31:20 +0200
>
> On Sat, Jul 24 2021, Mark Kettenis <[email protected]> wrote:
> >> From: Jeremie Courreges-Anglas <[email protected]>
> >> Date: Sat, 24 Jul 2021 21:22:23 +0200
> >>
> >> hifive /usr/src/regress/sys/kern/gettimeofday$ doas -u build time
> >> obj/gettimeofday
> >> 6.64 real 6.63 user 0.02 sys
> >> hifive /usr/src/regress/sys/kern/gettimeofday$ doas -u build env
> >> LIBC_NOUSERTC=1 time obj/gettimeofday
> >> 6.48 real 0.60 user 5.42 sys
> >>
> >> Initially I thought that a more descriptive name than TC_TB could be
> >> helpful (TC_TIMEBASE?). But since powerpc also uses TC_TB I think it's
> >> fine as a first step. We can change it later easily, it's just a define
> >> name.
> >>
> >> I haven't even built a release with this, not sure it's worth it.
> >> If you have cpu cycles to spare, please say so.
> >>
> >> ok?
> >
> > Two small nits below. With that fixed, ok kettenis@
>
> [...]
>
> >> Index: lib/libc/arch/riscv64/gen/usertc.c
> >> ===================================================================
> >> RCS file: /cvs/src/lib/libc/arch/riscv64/gen/usertc.c,v
> >> retrieving revision 1.1
> >> diff -u -p -r1.1 usertc.c
> >> --- lib/libc/arch/riscv64/gen/usertc.c 29 Apr 2021 18:33:36 -0000
> >> 1.1
> >> +++ lib/libc/arch/riscv64/gen/usertc.c 24 Jul 2021 17:07:01 -0000
> >> @@ -1,6 +1,7 @@
> >> /* $OpenBSD: usertc.c,v 1.1 2021/04/29 18:33:36 drahn Exp $
> >> */
> >> /*
> >> * Copyright (c) 2020 Paul Irofti <[email protected]>
> >> + * Copyright (c) 2021 Jeremie Courreges-Anglas <[email protected]>
> >> *
> >> * 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 +19,24 @@
> >> #include <sys/types.h>
> >> #include <sys/timetc.h>
> >>
> >> -int (*const _tc_get_timecount)(struct timekeep *, u_int *) = NULL;
> >> +static inline u_int
> >> +rdtime(void)
> >> +{
> >> + uint64_t ret;
> >> + asm volatile("rdtime %0" : "=r"(ret));
> >
> > Can you make that __asm vol[a]tile?
>
> Done. I copied that from amd64 usertc.c.
>
> >> + return ret & 0xffffffff;
> >
> > The & 0xffffffff isn't really necessary here and the kernel doesn't do
> > it. So I'd drop that bit and simply return ret.
>
> I thought I would make it explicit to the reader that we only cared
> about the low 32 bits, rather then rely on the implicit truncation.
> Your nit was about consistency, what about trying to make other
> implementations consistent? Or should we make it explicit on other
> archs?
>
> Two changes, only compile-tested on amd64 and sparc64:
> - asm/__asm__ -> __asm
> - val & mask -> val
>
> I can also drop this diff, consistency is good but so is time on our
> hands.
So the whole idea was to minimize the diffs between the kernel and
userland implementation of the tc_get_timecount() functions. On some
of the architectures that isn't entirely feasable so there are some
differences. But it seems you realized this ;).
Masking is in general unnecessary as the generic timecounter code
(kernel and userland) already does the masking. However, there are
exceptions.
> Index: lib/libc/arch/aarch64/gen/usertc.c
> ===================================================================
> RCS file: /d/cvs/src/lib/libc/arch/aarch64/gen/usertc.c,v
> retrieving revision 1.2
> diff -u -p -r1.2 usertc.c
> --- lib/libc/arch/aarch64/gen/usertc.c 15 Jul 2020 22:58:33 -0000
> 1.2
> +++ lib/libc/arch/aarch64/gen/usertc.c 24 Jul 2021 23:45:52 -0000
> @@ -29,7 +29,7 @@ agtimer_get_timecount(struct timecounter
> */
> __asm volatile("isb" ::: "memory");
> __asm volatile("mrs %x0, CNTVCT_EL0" : "=r" (val));
> - return (val & 0xffffffff);
> + return val;
> }
The masking here is deliberate as without the masking the errata
mentioned in the comment comes into play. So please drop this.
> static int
> Index: lib/libc/arch/amd64/gen/usertc.c
> ===================================================================
> RCS file: /d/cvs/src/lib/libc/arch/amd64/gen/usertc.c,v
> retrieving revision 1.3
> diff -u -p -r1.3 usertc.c
> --- lib/libc/arch/amd64/gen/usertc.c 23 Aug 2020 21:38:47 -0000 1.3
> +++ lib/libc/arch/amd64/gen/usertc.c 24 Jul 2021 23:45:52 -0000
> @@ -22,7 +22,7 @@ static inline u_int
> rdtsc_lfence(void)
> {
> uint32_t hi, lo;
> - asm volatile("lfence; rdtsc" : "=a"(lo), "=d"(hi));
> + __asm volatile("lfence; rdtsc" : "=a"(lo), "=d"(hi));
> return ((uint64_t)lo)|(((uint64_t)hi)<<32);
> }
ok kettenis@
> Index: lib/libc/arch/mips64/gen/usertc.c
> ===================================================================
> RCS file: /d/cvs/src/lib/libc/arch/mips64/gen/usertc.c,v
> retrieving revision 1.2
> diff -u -p -r1.2 usertc.c
> --- lib/libc/arch/mips64/gen/usertc.c 18 Jul 2020 08:37:43 -0000 1.2
> +++ lib/libc/arch/mips64/gen/usertc.c 25 Jul 2021 02:16:21 -0000
> @@ -23,7 +23,7 @@ get_cp0_count(void)
> {
> uint32_t count;
>
> - __asm__ volatile (
> + __asm volatile (
> " .set push\n"
> " .set mips64r2\n"
> " rdhwr %0, $2\n"
ok kettenis@
> Index: lib/libc/arch/sparc64/gen/usertc.c
> ===================================================================
> RCS file: /d/cvs/src/lib/libc/arch/sparc64/gen/usertc.c,v
> retrieving revision 1.2
> diff -u -p -r1.2 usertc.c
> --- lib/libc/arch/sparc64/gen/usertc.c 8 Jul 2020 09:20:28 -0000
> 1.2
> +++ lib/libc/arch/sparc64/gen/usertc.c 24 Jul 2021 23:45:52 -0000
> @@ -25,7 +25,7 @@ tick_get_timecount(struct timecounter *t
>
> __asm volatile("rd %%tick, %0" : "=r" (tick));
>
> - return (tick & ~0u);
> + return tick;
> }
>
> static inline u_int
> @@ -35,7 +35,7 @@ sys_tick_get_timecount(struct timecounte
>
> __asm volatile("rd %%sys_tick, %0" : "=r" (tick));
>
> - return (tick & ~0u);
> + return tick;
> }
>
> static int
ok kettenis@
> Index: sys/arch/arm64/dev/agtimer.c
> ===================================================================
> RCS file: /d/cvs/src/sys/arch/arm64/dev/agtimer.c,v
> retrieving revision 1.18
> diff -u -p -r1.18 agtimer.c
> --- sys/arch/arm64/dev/agtimer.c 11 Mar 2021 11:16:56 -0000 1.18
> +++ sys/arch/arm64/dev/agtimer.c 24 Jul 2021 23:45:52 -0000
> @@ -206,7 +206,7 @@ agtimer_get_timecount(struct timecounter
> */
> __asm volatile("isb" ::: "memory");
> __asm volatile("mrs %x0, CNTVCT_EL0" : "=r" (val));
> - return (val & 0xffffffff);
> + return val;
> }
Masking is deliberate here as well.
>
> int
> Index: sys/arch/sparc64/sparc64/clock.c
> ===================================================================
> RCS file: /d/cvs/src/sys/arch/sparc64/sparc64/clock.c,v
> retrieving revision 1.70
> diff -u -p -r1.70 clock.c
> --- sys/arch/sparc64/sparc64/clock.c 11 Mar 2021 11:17:00 -0000 1.70
> +++ sys/arch/sparc64/sparc64/clock.c 24 Jul 2021 23:45:52 -0000
> @@ -931,7 +931,7 @@ tick_get_timecount(struct timecounter *t
>
> __asm volatile("rd %%tick, %0" : "=r" (tick));
>
> - return (tick & ~0u);
> + return tick;
> }
>
> u_int
> @@ -941,5 +941,5 @@ sys_tick_get_timecount(struct timecounte
>
> __asm volatile("rd %%sys_tick, %0" : "=r" (tick));
>
> - return (tick & ~0u);
> + return tick;
> }
ok kettenis@