summaryrefslogtreecommitdiffstats
path: root/crypto/x86cpuid.pl
diff options
context:
space:
mode:
authorAndy Polyakov <appro@openssl.org>2007-04-01 17:28:08 +0000
committerAndy Polyakov <appro@openssl.org>2007-04-01 17:28:08 +0000
commit162f677def843739f4984d674b4ad33eb726e7ea (patch)
tree73897035de9fdcf42991bb2530f488a6ca1663df /crypto/x86cpuid.pl
parent287546242539e686ef1233d0a7c57c935fb61c3f (diff)
Update x86cpuid.pl to correctly detect shared cache and to support new
RC4_set_key.
Diffstat (limited to 'crypto/x86cpuid.pl')
-rw-r--r--crypto/x86cpuid.pl24
1 files changed, 24 insertions, 0 deletions
diff --git a/crypto/x86cpuid.pl b/crypto/x86cpuid.pl
index c53c9bc998..7d924a60b7 100644
--- a/crypto/x86cpuid.pl
+++ b/crypto/x86cpuid.pl
@@ -20,12 +20,36 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
&xor ("ecx","eax");
&bt ("ecx",21);
&jnc (&label("nocpuid"));
+ &xor ("eax","eax");
+ &cpuid ();
+ &xor ("eax","eax");
+ &cmp ("ebx",0x756e6547); # "Genu"
+ &setne (&LB("eax"));
+ &mov ("ebp","eax");
+ &cmp ("edx",0x49656e69); # "ineI"
+ &setne (&LB("eax"));
+ &or ("ebp","eax");
+ &cmp ("ecx",0x6c65746e); # "ntel"
+ &setne (&LB("eax"));
+ &or ("ebp","eax");
&mov ("eax",1);
&cpuid ();
+ &bt ("edx",28); # test hyper-threading bit
+ &jnc (&label("nocpuid"));
+ &cmp ("ebp",0);
+ &jne (&label("notintel"));
+ &or ("edx",1<<20); # use reserved bit to engage RC4_CHAR
+&set_label("notintel");
+ &shr ("ebx",16);
+ &cmp (&LB("ebx"),1); # see if cache is shared(*)
+ &ja (&label("nocpuid"));
+ &and ("edx",~(1<<28)); # clear hyper-threading bit if not
&set_label("nocpuid");
&mov ("eax","edx");
&mov ("edx","ecx");
&function_end("OPENSSL_ia32_cpuid");
+# (*) on Core2 this value is set to 2 denoting the fact that L2
+# cache is shared between cores.
&external_label("OPENSSL_ia32cap_P");