diff options
author | Piotr Kubaj <pkubaj@FreeBSD.org> | 2021-09-12 21:06:06 +0000 |
---|---|---|
committer | Piotr Kubaj <pkubaj@FreeBSD.org> | 2021-09-12 21:06:06 +0000 |
commit | ff9319692d9e5399bc446413b48c01a60dc07db9 (patch) | |
tree | 65b4cc017e0837b4c08d66250244059efd112903 /security/masscan/files/patch-src_smack1.c | |
parent | emulators/qemu50: fix build on powerpc (diff) |
security/masscan: fix build on powerpc*
Implement rdtsc, similar to ARM. Builds fine with clang.
Diffstat (limited to 'security/masscan/files/patch-src_smack1.c')
-rw-r--r-- | security/masscan/files/patch-src_smack1.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/security/masscan/files/patch-src_smack1.c b/security/masscan/files/patch-src_smack1.c index 8a5448fd62dc..909d256435cf 100644 --- a/security/masscan/files/patch-src_smack1.c +++ b/security/masscan/files/patch-src_smack1.c @@ -1,6 +1,6 @@ --- src/smack1.c.orig 2021-01-31 09:13:30 UTC +++ src/smack1.c -@@ -119,8 +119,7 @@ +@@ -119,9 +119,8 @@ #elif defined(__FreeBSD__) #include <sys/types.h> #include <machine/cpufunc.h> @@ -10,12 +10,35 @@ unsigned long long rdtsc(void) { uint32_t pmccntr; -@@ -138,6 +137,10 @@ unsigned long long rdtsc(void) + uint32_t pmuseren; +@@ -138,6 +137,32 @@ unsigned long long rdtsc(void) } return 0; } +#elif defined(__aarch64__) +#define __rdtsc() 0 ++#elif defined(__powerpc64__) ++unsigned long long __rdtsc(void) ++{ ++ unsigned long long rval; ++ __asm__ __volatile__("mfspr %%r3, 268": "=r" (rval)); ++ return rval; ++} ++#elif defined(__powerpc__) ++unsigned long long __rdtsc(void) ++{ ++ unsigned int tmp; ++ union { unsigned long long complete; unsigned int part[2]; } ticks; ++ __asm__ ("0:" ++ "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; ++} +#else +#define __rdtsc rdtsc #endif |