powerpc64: TimeBase: add userspace timecounting support
authorcheloha <cheloha@openbsd.org>
Sat, 5 Nov 2022 16:23:02 +0000 (16:23 +0000)
committercheloha <cheloha@openbsd.org>
Sat, 5 Nov 2022 16:23:02 +0000 (16:23 +0000)
Tested by gkoehler@.

ok gkoehler@

lib/libc/arch/powerpc64/gen/usertc.c
sys/arch/powerpc64/include/timetc.h
sys/arch/powerpc64/powerpc64/clock.c

index 2ad6f97..f0ff2df 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: usertc.c,v 1.1 2020/07/11 16:21:29 kettenis Exp $     */
+/*     $OpenBSD: usertc.c,v 1.2 2022/11/05 16:23:02 cheloha Exp $      */
 /*
  * Copyright (c) 2020 Paul Irofti <paul@irofti.net>
  *
 #include <sys/types.h>
 #include <sys/timetc.h>
 
-int (*const _tc_get_timecount)(struct timekeep *, u_int *) = NULL;
+static u_int
+mftbl(void)
+{
+       uint64_t value;
+       __asm volatile ("mftb %0" : "=r"(value));
+       return value;
+}
+
+static int
+tc_get_timecount(struct timekeep *tk, u_int *tc)
+{
+       switch (tk->tk_user) {
+       case TC_TB:
+               *tc = mftbl();
+               return 0;
+       }
+       return -1;
+}
+
+int (*const _tc_get_timecount)(struct timekeep *, u_int *) = tc_get_timecount;
index ec63af1..4567a49 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: timetc.h,v 1.1 2020/07/06 13:33:08 pirofti Exp $ */
+/*     $OpenBSD: timetc.h,v 1.2 2022/11/05 16:23:02 cheloha Exp $ */
 /*
  * Copyright (c) 2020 Paul Irofti <paul@irofti.net>
  *
@@ -18,6 +18,6 @@
 #ifndef _MACHINE_TIMETC_H_
 #define _MACHINE_TIMETC_H_
 
-#define        TC_LAST 0
+#define        TC_TB   1
 
 #endif /* _MACHINE_TIMETC_H_ */
index aef95e8..20e81c6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: clock.c,v 1.5 2022/08/11 17:15:21 cheloha Exp $       */
+/*     $OpenBSD: clock.c,v 1.6 2022/11/05 16:23:02 cheloha Exp $       */
 
 /*
  * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
@@ -44,6 +44,7 @@ static struct timecounter tb_timecounter = {
        .tc_name = "tb",
        .tc_quality = 0,
        .tc_priv = NULL,
+       .tc_user = TC_TB,
 };
 
 void   cpu_startclock(void);