X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=fips%2Ffips_canister.c;h=7be48426d90500fcf3c499453cafac5e332b5e43;hp=d71b5d5a3d860ec08a981b27f896d884a8e753ae;hb=46ab9bbd7fa610d775fe645dd0fe6d509c8dff3a;hpb=31b46ebb62325c8b259ffd6d4dd85de8e730d5a4 diff --git a/fips/fips_canister.c b/fips/fips_canister.c index d71b5d5a3d..7be48426d9 100644 --- a/fips/fips_canister.c +++ b/fips/fips_canister.c @@ -27,10 +27,16 @@ const void *FIPS_text_end(void); # endif #endif -#if !defined(FIPS_REF_POINT_IS_SAFE_TO_CROSS_COMPILE) -# if (defined(__ANDROID__) && (defined(__arm__) || defined(__arm))) || \ - (defined(__vxworks) && (defined(__ppc__) || defined(__ppc))) -# define 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(__i386__)|| defined(__i386))) || \ + (defined(__vxworks) && (defined(__ppc__) || defined(__ppc) || \ + defined(__mips__)|| defined(__mips))) || \ + (defined(__linux) && ((defined(__PPC__) && !defined(__PPC64__)) || \ + defined(__arm__) || defined(__arm))) || \ + (defined(__APPLE__) /* verified on all MacOS X & iOS flavors */)|| \ + (defined(_WIN32) && defined(_MSC_VER)) +# define FIPS_REF_POINT_IS_CROSS_COMPILER_AWARE # endif #endif @@ -46,20 +52,47 @@ static void *instruction_pointer_xlc(void); #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) +# pragma code_seg("fipstx") +# pragma code_seg() + __declspec(allocate("fipstx")) +const unsigned int FIPS_text_startX[]= + { 0x46495053, 0x5f746578, 0x745f7374, 0x61727458 }; +# pragma const_seg("fipsro$a") +# pragma const_seg() + __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) +# pragma code_seg("fipstx$z") +# pragma code_seg() + __declspec(allocate("fipstx$z")) +const unsigned int FIPS_text_endX[]= + { 0x46495053, 0x5f746578, 0x745f656e, 0x64585b5d }; +# pragma const_seg("fipsro$z") +# pragma const_seg() + __declspec(allocate("fipsro$z")) +# endif const unsigned int FIPS_rodata_end[]= { 0x46495053, 0x5f726f64, 0x6174615f, 0x656e645b }; #endif +#if !defined(_MSC_VER) || !defined(instruction_pointer) /* * I declare reference function as static in order to avoid certain * pitfalls in -dynamic linker behaviour... @@ -95,7 +128,7 @@ static void *instruction_pointer(void) "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__) @@ -141,6 +174,7 @@ static void *instruction_pointer(void) #endif return ret; } +#endif /* * This function returns pointer to an instruction in the vicinity of @@ -149,9 +183,13 @@ static void *instruction_pointer(void) */ const void *FIPS_ref_point() { -#if defined(FIPS_REF_POINT_IS_SAFE_TO_CROSS_COMPILE) - return (void *)FIPS_ref_point; -#if defined(INSTRUCTION_POINTER_IMPLEMENTED) +#if defined(FIPS_REF_POINT_IS_CROSS_COMPILER_AWARE) +# if defined(__thumb__) || defined(__thumb) + return (void *)((size_t)instruction_pointer&~1); +# else + return (void *)instruction_pointer; +# endif +#elif defined(INSTRUCTION_POINTER_IMPLEMENTED) return instruction_pointer(); /* Below we essentially cover vendor compilers which do not support * inline assembler... */