Loading crypto/cryptlib.c +14 −6 Original line number Diff line number Diff line Loading @@ -125,7 +125,7 @@ static double SSLeay_MSVC5_hack=0.0; /* and for VC1.5 */ defined(__INTEL__) || \ defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64) extern unsigned int OPENSSL_ia32cap_P[2]; extern unsigned int OPENSSL_ia32cap_P[4]; unsigned int *OPENSSL_ia32cap_loc(void) { return OPENSSL_ia32cap_P; } #if defined(OPENSSL_CPUID_OBJ) && !defined(OPENSSL_NO_ASM) && !defined(I386_ONLY) Loading @@ -137,7 +137,7 @@ typedef unsigned long long IA32CAP; #endif void OPENSSL_cpuid_setup(void) { static int trigger=0; IA32CAP OPENSSL_ia32_cpuid(void); IA32CAP OPENSSL_ia32_cpuid(unsigned int *); IA32CAP vec; char *env; Loading @@ -151,10 +151,18 @@ void OPENSSL_cpuid_setup(void) #else if (!sscanf(env+off,"%lli",(long long *)&vec)) vec = strtoul(env+off,NULL,0); #endif if (off) vec = OPENSSL_ia32_cpuid()&~vec; if (off) vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P)&~vec; OPENSSL_ia32cap_P[2] = 0; if ((env=strchr(env,':'))) { off = (env[1]=='~')?2:1; vec = strtoul(env+off,NULL,0); if (off>1) OPENSSL_ia32cap_P[2] &= ~vec; else OPENSSL_ia32cap_P[2] = vec; } } else vec = OPENSSL_ia32_cpuid(); vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P); /* * |(1<<10) sets a reserved bit to signal that variable Loading @@ -165,7 +173,7 @@ void OPENSSL_cpuid_setup(void) OPENSSL_ia32cap_P[1] = (unsigned int)(vec>>32); } #else unsigned int OPENSSL_ia32cap_P[2]; unsigned int OPENSSL_ia32cap_P[4]; #endif #else Loading @@ -173,7 +181,7 @@ unsigned int *OPENSSL_ia32cap_loc(void) { return NULL; } #endif int OPENSSL_NONPIC_relocated = 0; #if !defined(OPENSSL_CPUID_SETUP) && !defined(OPENSSL_CPUID_OBJ) void OPENSSL_cpuid_setup(void) {} void OPENSSL_cpuid_setup(unsigned int *) {} #endif #if (defined(_WIN32) || defined(__CYGWIN__)) && defined(_WINDLL) Loading crypto/perlasm/x86asm.pl +26 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,32 @@ sub ::rdrand { &::generic("rdrand",@_); } } sub rxb { local *opcode=shift; my ($dst,$src1,$src2,$rxb)=@_; $rxb|=0x7<<5; $rxb&=~(0x04<<5) if($dst>=8); $rxb&=~(0x01<<5) if($src1>=8); $rxb&=~(0x02<<5) if($src2>=8); push @opcode,$rxb; } sub ::vprotd { my $args=join(',',@_); if ($args =~ /xmm([0-7]),xmm([0-7]),([x0-9a-f]+)/) { my @opcode=(0x8f); rxb(\@opcode,$1,$2,-1,0x08); push @opcode,0x78,0xc2; push @opcode,0xc0|($2&7)|(($1&7)<<3); # ModR/M my $c=$3; push @opcode,$c=~/^0/?oct($c):$c; &::data_byte(@opcode); } else { &::generic("vprotd",@_); } } # label management $lbdecor="L"; # local label decoration, set by package $label="000"; Loading crypto/perlasm/x86gas.pl +3 −1 Original line number Diff line number Diff line Loading @@ -70,6 +70,8 @@ sub ::DWP { my($addr,$reg1,$reg2,$idx)=@_; my $ret=""; if (!defined($idx) && 1*$reg2) { $idx=$reg2; $reg2=$reg1; undef $reg1; } $addr =~ s/^\s+//; # prepend global references with optional underscore $addr =~ s/^([^\+\-0-9][^\+\-]*)/&::islabel($1) or "$nmdecor$1"/ige; Loading Loading @@ -157,7 +159,7 @@ sub ::file_end } } if (grep {/\b${nmdecor}OPENSSL_ia32cap_P\b/i} @out) { my $tmp=".comm\t${nmdecor}OPENSSL_ia32cap_P,8"; my $tmp=".comm\t${nmdecor}OPENSSL_ia32cap_P,16"; if ($::macosx) { push (@out,"$tmp,2\n"); } elsif ($::elf) { push (@out,"$tmp,4\n"); } else { push (@out,"$tmp\n"); } Loading crypto/perlasm/x86masm.pl +3 −1 Original line number Diff line number Diff line Loading @@ -39,6 +39,8 @@ sub get_mem { my($size,$addr,$reg1,$reg2,$idx)=@_; my($post,$ret); if (!defined($idx) && 1*$reg2) { $idx=$reg2; $reg2=$reg1; undef $reg1; } $ret .= "$size PTR " if ($size ne ""); $addr =~ s/^\s+//; Loading Loading @@ -133,7 +135,7 @@ ___ if (grep {/\b${nmdecor}OPENSSL_ia32cap_P\b/i} @out) { my $comm=<<___; .bss SEGMENT 'BSS' COMM ${nmdecor}OPENSSL_ia32cap_P:QWORD COMM ${nmdecor}OPENSSL_ia32cap_P:DWORD:4 .bss ENDS ___ # comment out OPENSSL_ia32cap_P declarations Loading crypto/perlasm/x86nasm.pl +3 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ sub get_mem { my($size,$addr,$reg1,$reg2,$idx)=@_; my($post,$ret); if (!defined($idx) && 1*$reg2) { $idx=$reg2; $reg2=$reg1; undef $reg1; } if ($size ne "") { $ret .= "$size"; $ret .= " PTR" if ($::mwerks); Loading Loading @@ -117,7 +119,7 @@ sub ::file_end { if (grep {/\b${nmdecor}OPENSSL_ia32cap_P\b/i} @out) { my $comm=<<___; ${drdecor}segment .bss ${drdecor}common ${nmdecor}OPENSSL_ia32cap_P 8 ${drdecor}common ${nmdecor}OPENSSL_ia32cap_P 16 ___ # comment out OPENSSL_ia32cap_P declarations grep {s/(^extern\s+${nmdecor}OPENSSL_ia32cap_P)/\;$1/} @out; Loading Loading
crypto/cryptlib.c +14 −6 Original line number Diff line number Diff line Loading @@ -125,7 +125,7 @@ static double SSLeay_MSVC5_hack=0.0; /* and for VC1.5 */ defined(__INTEL__) || \ defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64) extern unsigned int OPENSSL_ia32cap_P[2]; extern unsigned int OPENSSL_ia32cap_P[4]; unsigned int *OPENSSL_ia32cap_loc(void) { return OPENSSL_ia32cap_P; } #if defined(OPENSSL_CPUID_OBJ) && !defined(OPENSSL_NO_ASM) && !defined(I386_ONLY) Loading @@ -137,7 +137,7 @@ typedef unsigned long long IA32CAP; #endif void OPENSSL_cpuid_setup(void) { static int trigger=0; IA32CAP OPENSSL_ia32_cpuid(void); IA32CAP OPENSSL_ia32_cpuid(unsigned int *); IA32CAP vec; char *env; Loading @@ -151,10 +151,18 @@ void OPENSSL_cpuid_setup(void) #else if (!sscanf(env+off,"%lli",(long long *)&vec)) vec = strtoul(env+off,NULL,0); #endif if (off) vec = OPENSSL_ia32_cpuid()&~vec; if (off) vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P)&~vec; OPENSSL_ia32cap_P[2] = 0; if ((env=strchr(env,':'))) { off = (env[1]=='~')?2:1; vec = strtoul(env+off,NULL,0); if (off>1) OPENSSL_ia32cap_P[2] &= ~vec; else OPENSSL_ia32cap_P[2] = vec; } } else vec = OPENSSL_ia32_cpuid(); vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P); /* * |(1<<10) sets a reserved bit to signal that variable Loading @@ -165,7 +173,7 @@ void OPENSSL_cpuid_setup(void) OPENSSL_ia32cap_P[1] = (unsigned int)(vec>>32); } #else unsigned int OPENSSL_ia32cap_P[2]; unsigned int OPENSSL_ia32cap_P[4]; #endif #else Loading @@ -173,7 +181,7 @@ unsigned int *OPENSSL_ia32cap_loc(void) { return NULL; } #endif int OPENSSL_NONPIC_relocated = 0; #if !defined(OPENSSL_CPUID_SETUP) && !defined(OPENSSL_CPUID_OBJ) void OPENSSL_cpuid_setup(void) {} void OPENSSL_cpuid_setup(unsigned int *) {} #endif #if (defined(_WIN32) || defined(__CYGWIN__)) && defined(_WINDLL) Loading
crypto/perlasm/x86asm.pl +26 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,32 @@ sub ::rdrand { &::generic("rdrand",@_); } } sub rxb { local *opcode=shift; my ($dst,$src1,$src2,$rxb)=@_; $rxb|=0x7<<5; $rxb&=~(0x04<<5) if($dst>=8); $rxb&=~(0x01<<5) if($src1>=8); $rxb&=~(0x02<<5) if($src2>=8); push @opcode,$rxb; } sub ::vprotd { my $args=join(',',@_); if ($args =~ /xmm([0-7]),xmm([0-7]),([x0-9a-f]+)/) { my @opcode=(0x8f); rxb(\@opcode,$1,$2,-1,0x08); push @opcode,0x78,0xc2; push @opcode,0xc0|($2&7)|(($1&7)<<3); # ModR/M my $c=$3; push @opcode,$c=~/^0/?oct($c):$c; &::data_byte(@opcode); } else { &::generic("vprotd",@_); } } # label management $lbdecor="L"; # local label decoration, set by package $label="000"; Loading
crypto/perlasm/x86gas.pl +3 −1 Original line number Diff line number Diff line Loading @@ -70,6 +70,8 @@ sub ::DWP { my($addr,$reg1,$reg2,$idx)=@_; my $ret=""; if (!defined($idx) && 1*$reg2) { $idx=$reg2; $reg2=$reg1; undef $reg1; } $addr =~ s/^\s+//; # prepend global references with optional underscore $addr =~ s/^([^\+\-0-9][^\+\-]*)/&::islabel($1) or "$nmdecor$1"/ige; Loading Loading @@ -157,7 +159,7 @@ sub ::file_end } } if (grep {/\b${nmdecor}OPENSSL_ia32cap_P\b/i} @out) { my $tmp=".comm\t${nmdecor}OPENSSL_ia32cap_P,8"; my $tmp=".comm\t${nmdecor}OPENSSL_ia32cap_P,16"; if ($::macosx) { push (@out,"$tmp,2\n"); } elsif ($::elf) { push (@out,"$tmp,4\n"); } else { push (@out,"$tmp\n"); } Loading
crypto/perlasm/x86masm.pl +3 −1 Original line number Diff line number Diff line Loading @@ -39,6 +39,8 @@ sub get_mem { my($size,$addr,$reg1,$reg2,$idx)=@_; my($post,$ret); if (!defined($idx) && 1*$reg2) { $idx=$reg2; $reg2=$reg1; undef $reg1; } $ret .= "$size PTR " if ($size ne ""); $addr =~ s/^\s+//; Loading Loading @@ -133,7 +135,7 @@ ___ if (grep {/\b${nmdecor}OPENSSL_ia32cap_P\b/i} @out) { my $comm=<<___; .bss SEGMENT 'BSS' COMM ${nmdecor}OPENSSL_ia32cap_P:QWORD COMM ${nmdecor}OPENSSL_ia32cap_P:DWORD:4 .bss ENDS ___ # comment out OPENSSL_ia32cap_P declarations Loading
crypto/perlasm/x86nasm.pl +3 −1 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ sub get_mem { my($size,$addr,$reg1,$reg2,$idx)=@_; my($post,$ret); if (!defined($idx) && 1*$reg2) { $idx=$reg2; $reg2=$reg1; undef $reg1; } if ($size ne "") { $ret .= "$size"; $ret .= " PTR" if ($::mwerks); Loading Loading @@ -117,7 +119,7 @@ sub ::file_end { if (grep {/\b${nmdecor}OPENSSL_ia32cap_P\b/i} @out) { my $comm=<<___; ${drdecor}segment .bss ${drdecor}common ${nmdecor}OPENSSL_ia32cap_P 8 ${drdecor}common ${nmdecor}OPENSSL_ia32cap_P 16 ___ # comment out OPENSSL_ia32cap_P declarations grep {s/(^extern\s+${nmdecor}OPENSSL_ia32cap_P)/\;$1/} @out; Loading