On Mon, 22 Jun 2020 19:12:22 +0300 Paul Irofti <p...@irofti.net> 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). --- 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 */