summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormiod <>2015-09-11 14:57:29 +0000
committermiod <>2015-09-11 14:57:29 +0000
commit3e95ffd0c2d6060a71ec897ae9459ffd2fce63ab (patch)
tree690535d57046faa98c31f6e44079f382e1cc83d4
parent0d2b8753e4416642fc3ae7d5871b1e4bcc856d35 (diff)
downloadopenbsd-3e95ffd0c2d6060a71ec897ae9459ffd2fce63ab.tar.gz
openbsd-3e95ffd0c2d6060a71ec897ae9459ffd2fce63ab.tar.bz2
openbsd-3e95ffd0c2d6060a71ec897ae9459ffd2fce63ab.zip
Bring back the expansion-into-.byte-sequences routines removed in r1.9, but
only define them if not building for the "openbsd" flavour. This way, non-obfuscated output can still be generated for analysis, by using the "openbsd" flavour (which OpenBSD HEAD will do), and obfuscated output, compatible with older as(1), will be generated for other platforms. The portable version of LibreSSL can then use "openbsd-portable" as the flavour for OpenBSD/amd64 so that generated files can be compiled with OpenBSD 5.7 and other older versions stuck with as(1) 2.15.
-rwxr-xr-xsrc/lib/libcrypto/perlasm/x86_64-xlate.pl79
-rwxr-xr-xsrc/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl79
2 files changed, 134 insertions, 24 deletions
diff --git a/src/lib/libcrypto/perlasm/x86_64-xlate.pl b/src/lib/libcrypto/perlasm/x86_64-xlate.pl
index 82992f41e5..4bd53da33d 100755
--- a/src/lib/libcrypto/perlasm/x86_64-xlate.pl
+++ b/src/lib/libcrypto/perlasm/x86_64-xlate.pl
@@ -662,6 +662,32 @@ sub rex {
662my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3, 662my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3,
663 "%esp"=>4, "%ebp"=>5, "%esi"=>6, "%edi"=>7 ); 663 "%esp"=>4, "%ebp"=>5, "%esi"=>6, "%edi"=>7 );
664 664
665if ($flavour ne "openbsd") {
666
667$movq = sub { # elderly gas can't handle inter-register movq
668 my $arg = shift;
669 my @opcode=(0x66);
670 if ($arg =~ /%xmm([0-9]+),\s*%r(\w+)/) {
671 my ($src,$dst)=($1,$2);
672 if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; }
673 rex(\@opcode,$src,$dst,0x8);
674 push @opcode,0x0f,0x7e;
675 push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M
676 @opcode;
677 } elsif ($arg =~ /%r(\w+),\s*%xmm([0-9]+)/) {
678 my ($src,$dst)=($2,$1);
679 if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; }
680 rex(\@opcode,$src,$dst,0x8);
681 push @opcode,0x0f,0x6e;
682 push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M
683 @opcode;
684 } else {
685 ();
686 }
687};
688
689}
690
665my $pextrd = sub { 691my $pextrd = sub {
666 if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) { 692 if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) {
667 my @opcode=(0x66); 693 my @opcode=(0x66);
@@ -698,20 +724,49 @@ my $pinsrd = sub {
698 } 724 }
699}; 725};
700 726
701my $pclmulqdq = sub { 727if ($flavour ne "openbsd") {
702 if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { 728
703 my @opcode=(0x66); 729$pshufb = sub {
704 rex(\@opcode,$3,$2); 730 if (shift =~ /%xmm([0-9]+),\s*%xmm([0-9]+)/) {
705 push @opcode,0x0f,0x3a,0x44; 731 my @opcode=(0x66);
706 push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M 732 rex(\@opcode,$2,$1);
707 my $c=$1; 733 push @opcode,0x0f,0x38,0x00;
708 push @opcode,$c=~/^0/?oct($c):$c; 734 push @opcode,0xc0|($1&7)|(($2&7)<<3); # ModR/M
709 @opcode; 735 @opcode;
710 } else { 736 } else {
711 (); 737 ();
712 } 738 }
739};
740
741$palignr = sub {
742 if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) {
743 my @opcode=(0x66);
744 rex(\@opcode,$3,$2);
745 push @opcode,0x0f,0x3a,0x0f;
746 push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M
747 push @opcode,$1;
748 @opcode;
749 } else {
750 ();
751 }
713}; 752};
714 753
754$pclmulqdq = sub {
755 if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) {
756 my @opcode=(0x66);
757 rex(\@opcode,$3,$2);
758 push @opcode,0x0f,0x3a,0x44;
759 push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M
760 my $c=$1;
761 push @opcode,$c=~/^0/?oct($c):$c;
762 @opcode;
763 } else {
764 ();
765 }
766};
767
768}
769
715if ($nasm) { 770if ($nasm) {
716 print <<___; 771 print <<___;
717default rel 772default rel
diff --git a/src/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl b/src/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl
index 82992f41e5..4bd53da33d 100755
--- a/src/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl
+++ b/src/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl
@@ -662,6 +662,32 @@ sub rex {
662my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3, 662my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3,
663 "%esp"=>4, "%ebp"=>5, "%esi"=>6, "%edi"=>7 ); 663 "%esp"=>4, "%ebp"=>5, "%esi"=>6, "%edi"=>7 );
664 664
665if ($flavour ne "openbsd") {
666
667$movq = sub { # elderly gas can't handle inter-register movq
668 my $arg = shift;
669 my @opcode=(0x66);
670 if ($arg =~ /%xmm([0-9]+),\s*%r(\w+)/) {
671 my ($src,$dst)=($1,$2);
672 if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; }
673 rex(\@opcode,$src,$dst,0x8);
674 push @opcode,0x0f,0x7e;
675 push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M
676 @opcode;
677 } elsif ($arg =~ /%r(\w+),\s*%xmm([0-9]+)/) {
678 my ($src,$dst)=($2,$1);
679 if ($dst !~ /[0-9]+/) { $dst = $regrm{"%e$dst"}; }
680 rex(\@opcode,$src,$dst,0x8);
681 push @opcode,0x0f,0x6e;
682 push @opcode,0xc0|(($src&7)<<3)|($dst&7); # ModR/M
683 @opcode;
684 } else {
685 ();
686 }
687};
688
689}
690
665my $pextrd = sub { 691my $pextrd = sub {
666 if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) { 692 if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*(%\w+)/) {
667 my @opcode=(0x66); 693 my @opcode=(0x66);
@@ -698,20 +724,49 @@ my $pinsrd = sub {
698 } 724 }
699}; 725};
700 726
701my $pclmulqdq = sub { 727if ($flavour ne "openbsd") {
702 if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) { 728
703 my @opcode=(0x66); 729$pshufb = sub {
704 rex(\@opcode,$3,$2); 730 if (shift =~ /%xmm([0-9]+),\s*%xmm([0-9]+)/) {
705 push @opcode,0x0f,0x3a,0x44; 731 my @opcode=(0x66);
706 push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M 732 rex(\@opcode,$2,$1);
707 my $c=$1; 733 push @opcode,0x0f,0x38,0x00;
708 push @opcode,$c=~/^0/?oct($c):$c; 734 push @opcode,0xc0|($1&7)|(($2&7)<<3); # ModR/M
709 @opcode; 735 @opcode;
710 } else { 736 } else {
711 (); 737 ();
712 } 738 }
739};
740
741$palignr = sub {
742 if (shift =~ /\$([0-9]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) {
743 my @opcode=(0x66);
744 rex(\@opcode,$3,$2);
745 push @opcode,0x0f,0x3a,0x0f;
746 push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M
747 push @opcode,$1;
748 @opcode;
749 } else {
750 ();
751 }
713}; 752};
714 753
754$pclmulqdq = sub {
755 if (shift =~ /\$([x0-9a-f]+),\s*%xmm([0-9]+),\s*%xmm([0-9]+)/) {
756 my @opcode=(0x66);
757 rex(\@opcode,$3,$2);
758 push @opcode,0x0f,0x3a,0x44;
759 push @opcode,0xc0|($2&7)|(($3&7)<<3); # ModR/M
760 my $c=$1;
761 push @opcode,$c=~/^0/?oct($c):$c;
762 @opcode;
763 } else {
764 ();
765 }
766};
767
768}
769
715if ($nasm) { 770if ($nasm) {
716 print <<___; 771 print <<___;
717default rel 772default rel