aboutsummaryrefslogtreecommitdiff
path: root/devel/abseil/files/patch-absl_base_internal_unscaledcycleclock.cc
blob: 392739e0ed1c970c70789df8f9d1326cbcec4283 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
--- absl/base/internal/unscaledcycleclock.cc.orig	2019-07-24 12:47:23 UTC
+++ absl/base/internal/unscaledcycleclock.cc
@@ -20,10 +20,15 @@
 #include <intrin.h>
 #endif
 
-#if defined(__powerpc__) || defined(__ppc__)
+#if (defined(__powerpc__) || defined(__ppc__)) && !defined(__FreeBSD__)
 #include <sys/platform/ppc.h>
 #endif
 
+#ifdef __FreeBSD__
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#endif
+
 #include "absl/base/internal/sysinfo.h"
 
 namespace absl {
@@ -56,11 +61,34 @@ double UnscaledCycleClock::Frequency() {
 #elif defined(__powerpc__) || defined(__ppc__)
 
 int64_t UnscaledCycleClock::Now() {
+#ifndef __FreeBSD__
   return __ppc_get_timebase();
+#else
+  union { long long complete; unsigned int part[2]; } ticks;
+  unsigned int tmp;
+  asm volatile(
+    "0:\n"
+    "mftbu %[hi32]\n"
+    "mftb %[lo32]\n"
+    "mftbu %[tmp]\n"
+    "cmpw %[tmp],%[hi32]\n"
+    "bne 0b\n"
+    : [hi32] "=r"(ticks.part[0]), [lo32] "=r"(ticks.part[1]),
+    [tmp] "=r"(tmp)
+  );
+  return ticks.complete;
+#endif
 }
 
 double UnscaledCycleClock::Frequency() {
+#ifndef __FreeBSD__
   return __ppc_get_timebase_freq();
+#else
+  long timebaseFrequency = 0;
+  size_t length = sizeof(timebaseFrequency);
+  sysctlbyname("kern.timecounter.tc.timebase.frequency", &timebaseFrequency, &length, NULL, 0);
+  return timebaseFrequency;
+#endif
 }
 
 #elif defined(__aarch64__)