> Date: Sun, 31 May 2020 00:25:00 -0400 > From: George Koehler <kern...@gmail.com> > > On Sat, 30 May 2020 19:21:30 +0300 > Paul Irofti <p...@irofti.net> wrote: > > > Here is an updated diff with no libc bump. Please use this one for > > further testing. > > Your diff does amd64. > Here is a diff to add macppc. Apply after your diff. > > I have only tested clock_gettime(2) with CLOCK_REALTIME, > by doing loops in Ruby like, $ ruby27 -e '10000.times{p Time.now}' > The time increased steadily, and ktrace showed only a few system calls > to clock_gettime(2). > > I copied ppc_mftb() from /sys/arch/powerpc/powerpc/cpu.h and renamed > it to tc_get_timecount_md(), because #include <machine/cpu.h> doesn't > provide ppc_mftb() if not _KERNEL. It would be better to edit the > kernel headers to give ppc_mftb() if _LIBC, but I haven't done that. > > I changed __amd64 to __amd64__ because I didn't find __powerpc. I'm > not sure, but one might move the list of arches to dlfcn/Makefile.inc > and do -DTIMEKEEP, like how thread/Makefile.inc does -DFUTEX. One > might drop the tc_get_timecount function pointer and just always call > the function #ifdef TIMEKEEP. > > PowerPC Mac OS X had a userland gettimeofday(2) using the cpu's > timebase and a "common page" from the kernel. Their common page also > had executable code for gettimeofday, memcpy, pthread_self, and a few > other functions. --George
Oh, and on the diff itself: > Index: lib/libc/arch/powerpc/gen/Makefile.inc > =================================================================== > RCS file: /cvs/src/lib/libc/arch/powerpc/gen/Makefile.inc,v > retrieving revision 1.14 > diff -u -p -r1.14 Makefile.inc > --- lib/libc/arch/powerpc/gen/Makefile.inc 12 Apr 2012 16:14:09 -0000 > 1.14 > +++ lib/libc/arch/powerpc/gen/Makefile.inc 31 May 2020 03:20:58 -0000 > @@ -3,3 +3,4 @@ SRCS+= fabs.c > SRCS+= fpgetmask.c fpsetmask.c > SRCS+= fpgetround.c fpsetround.c > SRCS+= fpgetsticky.c fpsetsticky.c > +SRCS+= usertc.c > --- /dev/null Sat May 30 23:21:20 2020 > +++ lib/libc/arch/powerpc/gen/usertc.c Sat May 30 19:37:59 2020 > @@ -0,0 +1,44 @@ > +/* $OpenBSD$ */ > +/* > + * Copyright (C) 1995, 1996 Wolfgang Solfrank. > + * Copyright (C) 1995, 1996 TooLs GmbH. > + * 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. All advertising materials mentioning features or use of this software > + * must display the following acknowledgement: > + * This product includes software developed by TooLs GmbH. > + * 4. The name of TooLs GmbH may not be used to endorse or promote products > + * derived from this software without specific prior written permission. > + * > + * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``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 TOOLS GMBH 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. > + */ > + > +#include <sys/types.h> > + > +uint64_t > +tc_get_timecount_md(void) > +{ > + u_long scratch; > + u_int64_t tb; > + > + __asm volatile ("1: mftbu %0; mftb %L0; mftbu %1;" > + " cmpw 0,%0,%1; bne 1b" : "=r"(tb), "=r"(scratch)); > + return tb; > +} Would be good not to mux uint64_t and u_int64_t in the same bit of code. I'd use uint64_t and replace u_long with uint32_t. > --- lib/libc/dlfcn/init.c.before Sat May 30 23:26:35 2020 > +++ lib/libc/dlfcn/init.c Sat May 30 18:00:45 2020 > @@ -70,7 +70,7 @@ > > /* provide definitions for these */ > const dl_cb *_dl_cb __relro = NULL; > -#if defined(__amd64) > +#if defined(__amd64__) || defined(__powerpc__) > uint64_t (*const tc_get_timecount)(void) = tc_get_timecount_md; > #else > uint64_t (*const tc_get_timecount)(void) = NULL; > --- sys/arch/macppc/macppc/clock.c.before Sat May 30 23:28:00 2020 > +++ sys/arch/macppc/macppc/clock.c Sat May 30 20:35:47 2020 > @@ -57,7 +57,7 @@ > static int32_t ticks_per_intr; > > static struct timecounter tb_timecounter = { > - tb_get_timecount, NULL, 0x7fffffff, 0, "tb", 0, NULL, 0 > + tb_get_timecount, NULL, 0x7fffffff, 0, "tb", 0, NULL, 1 > }; > > /* calibrate the timecounter frequency for the listed models */ >