Commit 2b247cf8 authored by Andy Polyakov's avatar Andy Polyakov
Browse files

OPENSSL_ia32cap final touches. Note that OPENSSL_ia32cap is no longer a

symbol, but a macro expanded as (*(OPENSSL_ia32cap_loc())). The latter
is the only one to be exported to application.
parent 746fc252
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@ require "x86asm.pl";
$sse2=0;
for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }

&external_label("OPENSSL_ia32cap_P") if ($sse2);

&bn_mul_add_words("bn_mul_add_words");
&bn_mul_words("bn_mul_words");
&bn_sqr_words("bn_sqr_words");
@@ -22,7 +24,7 @@ sub bn_mul_add_words
	{
	local($name)=@_;

	&function_begin($name,"");
	&function_begin($name,$sse2?"EXTRN\t_OPENSSL_ia32cap_P:DWORD":"");

	&comment("");
	$Low="eax";
@@ -46,7 +48,7 @@ sub bn_mul_add_words
	&jz(&label("maw_finish"));

	if ($sse2) {
		&picmeup("eax","OPENSSL_ia32cap");
		&picmeup("eax","OPENSSL_ia32cap_P");
		&bt(&DWP(0,"eax"),26);
		&jnc(&label("maw_loop"));

+7 −7
Original line number Diff line number Diff line
@@ -541,23 +541,23 @@ const char *CRYPTO_get_lock_name(int type)

#if defined(__i386) || defined(__i386__) || defined(_M_IX86) || defined(__INTEL__)

unsigned long  OPENSSL_ia32cap=0;
unsigned long *OPENSSL_ia32cap_loc() { return &OPENSSL_ia32cap; }
unsigned long  OPENSSL_ia32cap_P=0;
unsigned long *OPENSSL_ia32cap_loc(void) { return &OPENSSL_ia32cap_P; }

#if defined(OPENSSL_CPUID_OBJ) && !defined(OPENSSL_NO_ASM) && !defined(I386_ONLY)
#define OPENSSL_CPUID_SETUP
void OPENSSL_cpuid_setup()
void OPENSSL_cpuid_setup(void)
{ static int trigger=0;
  unsigned long OPENSSL_ia32_cpuid();
  unsigned long OPENSSL_ia32_cpuid(void);
  char *env;

    if (trigger)	return;

    trigger=1;
    if ((env=getenv("OPENSSL_ia32cap")))
	OPENSSL_ia32cap = strtoul(env,NULL,0)|(1<<10);
	OPENSSL_ia32cap_P = strtoul(env,NULL,0)|(1<<10);
    else
	OPENSSL_ia32cap = OPENSSL_ia32_cpuid()|(1<<10);
	OPENSSL_ia32cap_P = OPENSSL_ia32_cpuid()|(1<<10);
    /*
     * |(1<<10) sets a reserved bit to signal that variable
     * was initialized already... This is to avoid interference
@@ -568,7 +568,7 @@ void OPENSSL_cpuid_setup()

#endif
#if !defined(OPENSSL_CPUID_SETUP)
void OPENSSL_cpuid_setup() {}
void OPENSSL_cpuid_setup(void) {}
#endif

#if (defined(_WIN32) || defined(__CYGWIN__)) && defined(_DLL)
+3 −0
Original line number Diff line number Diff line
@@ -93,6 +93,9 @@ extern "C" {
#define DECIMAL_SIZE(type)	((sizeof(type)*8+2)/3+1)
#define HEX_SIZE(type)		(sizeof(type)*2)

void OPENSSL_cpuid_setup(void);
extern unsigned long OPENSSL_ia32cap_P;

#ifdef  __cplusplus
}
#endif
+3 −0
Original line number Diff line number Diff line
@@ -541,6 +541,9 @@ void ERR_load_CRYPTO_strings(void);
/* Reason codes. */
#define CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK		 100

unsigned long *OPENSSL_ia32cap_loc(void);
#define OPENSSL_ia32cap (*(OPENSSL_ia32cap_loc()))

#ifdef  __cplusplus
}
#endif
+0 −1
Original line number Diff line number Diff line
@@ -79,7 +79,6 @@ void OPENSSL_add_all_algorithms_noconf(void)
	 * only on IA-32, but we reserve the option for all
	 * platforms...
	 */
	void OPENSSL_cpuid_setup();
	OPENSSL_cpuid_setup();
	OpenSSL_add_all_ciphers();
	OpenSSL_add_all_digests();
Loading