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