# endif
#endif
-#if !defined(FIPS_REF_POINT_IS_SAFE_TO_CROSS_COMPILE)
+#if !defined(FIPS_REF_POINT_IS_CROSS_COMPILER_AWARE)
# if (defined(__ANDROID__) && (defined(__arm__) || defined(__arm))) || \
- (defined(__vxworks) && (defined(__ppc__) || defined(__ppc)))
-# define FIPS_REF_POINT_IS_SAFE_TO_CROSS_COMPILE
+ (defined(__vxworks) && (defined(__ppc__) || defined(__ppc))) || \
+ (defined(__linux) && defined(__PPC__) && !defined(__PPC64__))
+# define FIPS_REF_POINT_IS_CROSS_COMPILER_AWARE
# endif
#endif
#endif
#ifdef FIPS_START
-#define FIPS_ref_point FIPS_text_start
+# define FIPS_ref_point FIPS_text_start
+# ifdef FIPS_REF_POINT_IS_CROSS_COMPILER_AWARE
+# define instruction_pointer FIPS_text_startX
+# endif
/* Some compilers put string literals into a separate segment. As we
* are mostly interested to hash AES tables in .rodata, we declare
* reference points accordingly. In case you wonder, the values are
* big-endian encoded variable names, just to prevent these arrays
* from being merged by linker. */
+# if defined(_MSC_VER) && defined(_WIN64)
+# pragma section("fipsro$a",read)
+ __declspec(allocate("fipsro$a"))
+# endif
const unsigned int FIPS_rodata_start[]=
{ 0x46495053, 0x5f726f64, 0x6174615f, 0x73746172 };
#else
-#define FIPS_ref_point FIPS_text_end
+# define FIPS_ref_point FIPS_text_end
+# ifdef FIPS_REF_POINT_IS_CROSS_COMPILER_AWARE
+# define instruction_pointer FIPS_text_endX
+# endif
+# if defined(_MSC_VER) && defined(_WIN64)
+# pragma section("fipsro$c",read)
+ __declspec(allocate("fipsro$c"))
+# endif
const unsigned int FIPS_rodata_end[]=
{ 0x46495053, 0x5f726f64, 0x6174615f, 0x656e645b };
#endif
"move %0,$31\n\t"
"move $31,%1" /* restore ra */
: "=r"(ret),"=r"(scratch) );
-# elif defined(__ppc__) || defined(__ppc) || \\
+# elif defined(__ppc__) || defined(__ppc) || \
defined(__powerpc) || defined(__powerpc__) || \
defined(__POWERPC__) || defined(_POWER) || defined(__PPC__) || \
defined(__PPC64__) || defined(__ppc64__) || defined(__powerpc64__)
*/
const void *FIPS_ref_point()
{
-#if defined(FIPS_REF_POINT_IS_SAFE_TO_CROSS_COMPILE)
- return (void *)FIPS_ref_point;
+#if defined(FIPS_REF_POINT_IS_CROSS_COMPILER_AWARE)
+ return (void *)instruction_pointer;
#elif defined(INSTRUCTION_POINTER_IMPLEMENTED)
return instruction_pointer();
/* Below we essentially cover vendor compilers which do not support