> From: Paul Irofti <[email protected]>
> Date: Wed, 8 Jul 2020 12:05:04 +0300
>
> On 2020-06-26 06:22, George Koehler wrote:
> > On Mon, 22 Jun 2020 19:12:22 +0300
> > Paul Irofti <[email protected]> wrote:
> >
> >> New iteration:
> >>
> >> - ps_timekeep should not coredump, pointed by deraadt@
> >> - set ps_timekeep to 0 before user uvm_map for randomization
> >> - map timekeep before fixup. confirmed by naddy@ that it fixes NULL init
> >> - initialize va. clarified by kettenis@
> >
> > Here's macppc again. My macppc isn't using your newest diff but does
> > now need to define TC_TB in <machine/timetc.h>.
> >
> > The /sys/arch/powerpc/include/timetc.h in your diff never gets used,
> > because there is no #include <powerpc/timetc.h>. On macppc,
> > uname -m => macppc and
> > uname -p => powerpc are different,
> > and #include <machine/timetc.h> is /sys/arch/macppc/include/timetc.h.
> > I suspect that <machine/timetc.h> is /sys/arch/$i/include/timetc.h
> > if and only if /sys/arch/$i/compile exists.
> >
> > 10 days ago, naddy said, "You only need the lower register." That is
> > correct, so this diff also stops using mftbu (the higher register).
>
> Reads OK to me. Please make the adjustments to static functions that
> kettenis@ mentioned in the alpha thread.
To add to that:
* TC_LAST isn't needed, so kill that
* tc_get_timecount
Also in the sparc64 I did an exact copy of the kernel implementation
of the functions to read the counter. I only made them static inline.
That makes it easier to verify that they are indeed identical.
> > --- lib/libc/arch/powerpc/gen/usertc.c.before Wed Jun 24 16:42:36 2020
> > +++ lib/libc/arch/powerpc/gen/usertc.c Wed Jun 24 16:46:00 2020
> > @@ -18,4 +18,17 @@
> > #include <sys/types.h>
> > #include <sys/timetc.h>
> >
> > -int (*const _tc_get_timecount)(struct timekeep *, u_int *) = NULL;
> > +int
> > +tc_get_timecount(struct timekeep *tk, u_int *tc)
> > +{
> > + u_int tb;
> > +
> > + if (tk->tk_user != TC_TB)
> > + return -1;
> > +
> > + asm volatile("mftb %0" : "=r"(tb));
> > + *tc = tb;
> > + return 0;
> > +}
> > +int (*const _tc_get_timecount)(struct timekeep *tk, u_int *tc)
> > + = tc_get_timecount;
> > --- sys/arch/macppc/include/timetc.h.before Wed Jun 24 16:36:03 2020
> > +++ sys/arch/macppc/include/timetc.h Wed Jun 24 16:37:47 2020
> > @@ -18,6 +18,7 @@
> > #ifndef _MACHINE_TIMETC_H_
> > #define _MACHINE_TIMETC_H_
> >
> > -#define TC_LAST 0
> > +#define TC_TB 1
> > +#define TC_LAST 2
> >
> > #endif /* _MACHINE_TIMETC_H_ */
> > --- sys/arch/macppc/macppc/clock.c.before Wed Jun 24 16:39:58 2020
> > +++ sys/arch/macppc/macppc/clock.c Wed Jun 24 16:40:08 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, TC_TB
> > };
> >
> > /* calibrate the timecounter frequency for the listed models */
> >
>
>