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__)
|