diff options
author | miod <> | 2015-09-11 14:57:29 +0000 |
---|---|---|
committer | miod <> | 2015-09-11 14:57:29 +0000 |
commit | 3e95ffd0c2d6060a71ec897ae9459ffd2fce63ab (patch) | |
tree | 690535d57046faa98c31f6e44079f382e1cc83d4 | |
parent | 0d2b8753e4416642fc3ae7d5871b1e4bcc856d35 (diff) | |
download | openbsd-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-x | src/lib/libcrypto/perlasm/x86_64-xlate.pl | 79 | ||||
-rwxr-xr-x | src/lib/libssl/src/crypto/perlasm/x86_64-xlate.pl | 79 |
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 { | |||
662 | my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3, | 662 | my %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 | ||
665 | if ($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 | |||
665 | my $pextrd = sub { | 691 | my $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 | ||
701 | my $pclmulqdq = sub { | 727 | if ($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 | |||
715 | if ($nasm) { | 770 | if ($nasm) { |
716 | print <<___; | 771 | print <<___; |
717 | default rel | 772 | default 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 { | |||
662 | my %regrm = ( "%eax"=>0, "%ecx"=>1, "%edx"=>2, "%ebx"=>3, | 662 | my %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 | ||
665 | if ($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 | |||
665 | my $pextrd = sub { | 691 | my $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 | ||
701 | my $pclmulqdq = sub { | 727 | if ($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 | |||
715 | if ($nasm) { | 770 | if ($nasm) { |
716 | print <<___; | 771 | print <<___; |
717 | default rel | 772 | default rel |