summaryrefslogtreecommitdiff
path: root/ppc-simd.cpp
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2017-09-19 21:08:37 -0400
committerJeffrey Walton <noloader@gmail.com>2017-09-19 21:08:37 -0400
commit6102333fc3c1c73c8c5b05e7cd568ac681741c9d (patch)
tree1a54b40f518230ac1727380ea431b85cf7d87495 /ppc-simd.cpp
parent6440921723695913cfcfffdf2c59f0cf01e59c89 (diff)
downloadcryptopp-git-6102333fc3c1c73c8c5b05e7cd568ac681741c9d.tar.gz
Add CRYPTOPP_NO_CPU_FEATURE_PROBES (GH #511)
We determine machine capabilities by performing an os/platform *query* first, like getauxv(). If the *query* fails, we move onto a cpu *probe*. The cpu *probe* tries to exeute an instruction and then catches a SIGILL on Linux or the exception EXCEPTION_ILLEGAL_INSTRUCTION on Windows. Some OSes fail to hangle a SIGILL gracefully, like Apple OSes. Apple machines corrupt memory and variables around the probe.
Diffstat (limited to 'ppc-simd.cpp')
-rw-r--r--ppc-simd.cpp24
1 files changed, 18 insertions, 6 deletions
diff --git a/ppc-simd.cpp b/ppc-simd.cpp
index 9dde6167..7fc18503 100644
--- a/ppc-simd.cpp
+++ b/ppc-simd.cpp
@@ -67,7 +67,9 @@ extern "C" {
#if (CRYPTOPP_BOOL_PPC32 || CRYPTOPP_BOOL_PPC64)
bool CPU_ProbeAltivec()
{
-#if (CRYPTOPP_ALTIVEC_AVAILABLE)
+#if defined(CRYPTOPP_NO_CPU_FEATURE_PROBES)
+ return false;
+#elif (CRYPTOPP_ALTIVEC_AVAILABLE)
# if defined(CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY)
// longjmp and clobber warnings. Volatile is required.
@@ -117,7 +119,9 @@ bool CPU_ProbeAltivec()
#if 0
bool CPU_ProbePower7()
{
-#if (CRYPTOPP_POWER7_AVAILABLE)
+#if defined(CRYPTOPP_NO_CPU_FEATURE_PROBES)
+ return false;
+#elif (CRYPTOPP_POWER7_AVAILABLE)
# if defined(CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY)
// longjmp and clobber warnings. Volatile is required.
@@ -161,7 +165,9 @@ bool CPU_ProbePower7()
bool CPU_ProbePower8()
{
-#if (CRYPTOPP_POWER8_AVAILABLE)
+#if defined(CRYPTOPP_NO_CPU_FEATURE_PROBES)
+ return false;
+#elif (CRYPTOPP_POWER8_AVAILABLE)
# if defined(CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY)
// longjmp and clobber warnings. Volatile is required.
@@ -204,7 +210,9 @@ bool CPU_ProbePower8()
bool CPU_ProbeAES()
{
-#if (CRYPTOPP_POWER8_AES_AVAILABLE)
+#if defined(CRYPTOPP_NO_CPU_FEATURE_PROBES)
+ return false;
+#elif (CRYPTOPP_POWER8_AES_AVAILABLE)
# if defined(CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY)
// longjmp and clobber warnings. Volatile is required.
@@ -255,7 +263,9 @@ bool CPU_ProbeAES()
bool CPU_ProbeSHA1()
{
-#if (CRYPTOPP_ALTIVEC_AVAILABLE)
+#if defined(CRYPTOPP_NO_CPU_FEATURE_PROBES)
+ return false;
+#elif (CRYPTOPP_ALTIVEC_AVAILABLE)
# if defined(CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY)
// longjmp and clobber warnings. Volatile is required.
@@ -288,7 +298,9 @@ bool CPU_ProbeSHA1()
bool CPU_ProbeSHA2()
{
-#if (CRYPTOPP_ALTIVEC_AVAILABLE)
+#if defined(CRYPTOPP_NO_CPU_FEATURE_PROBES)
+ return false;
+#elif (CRYPTOPP_ALTIVEC_AVAILABLE)
# if defined(CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY)
// longjmp and clobber warnings. Volatile is required.