OpenSSL 1.1.1-pre2
This commit is contained in:
@@ -9,7 +9,7 @@ require "x86asm.pl";
|
||||
|
||||
The first thing we do is setup the file and type of assembler
|
||||
|
||||
&asm_init($ARGV[0],$0);
|
||||
&asm_init($ARGV[0]);
|
||||
|
||||
The first argument is the 'type'. Currently
|
||||
'cpp', 'sol', 'a.out', 'elf' or 'win32'.
|
||||
@@ -62,7 +62,7 @@ So a very simple version of this function could be coded as
|
||||
push(@INC,"perlasm","../../perlasm");
|
||||
require "x86asm.pl";
|
||||
|
||||
&asm_init($ARGV[0],"cacl.pl");
|
||||
&asm_init($ARGV[0]);
|
||||
|
||||
&external_label("other");
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
# des_cblock (*ivec);
|
||||
# int enc;
|
||||
#
|
||||
# calls
|
||||
# calls
|
||||
# des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT);
|
||||
#
|
||||
|
||||
@@ -36,7 +36,7 @@ sub cbc
|
||||
# name is the function name
|
||||
# enc_func and dec_func and the functions to call for encrypt/decrypt
|
||||
# swap is true if byte order needs to be reversed
|
||||
# iv_off is parameter number for the iv
|
||||
# iv_off is parameter number for the iv
|
||||
# enc_off is parameter number for the encrypt/decrypt flag
|
||||
# p1,p2,p3 are the offsets for parameters to be passed to the
|
||||
# underlying calls.
|
||||
@@ -114,7 +114,7 @@ sub cbc
|
||||
#############################################################
|
||||
|
||||
&set_label("encrypt_loop");
|
||||
# encrypt start
|
||||
# encrypt start
|
||||
# "eax" and "ebx" hold iv (or the last cipher text)
|
||||
|
||||
&mov("ecx", &DWP(0,$in,"",0)); # load first 4 bytes
|
||||
@@ -208,7 +208,7 @@ sub cbc
|
||||
#############################################################
|
||||
#############################################################
|
||||
&set_label("decrypt",1);
|
||||
# decrypt start
|
||||
# decrypt start
|
||||
&and($count,0xfffffff8);
|
||||
# The next 2 instructions are only for if the jz is taken
|
||||
&mov("eax", &DWP($data_off+8,"esp","",0)); # get iv[0]
|
||||
@@ -350,7 +350,7 @@ sub cbc
|
||||
&align(64);
|
||||
|
||||
&function_end_B($name);
|
||||
|
||||
|
||||
}
|
||||
|
||||
1;
|
||||
+82
-22
@@ -11,40 +11,65 @@ my $output = shift;
|
||||
open STDOUT,">$output" || die "can't open $output: $!";
|
||||
|
||||
my %GLOBALS;
|
||||
my %TYPES;
|
||||
my $dotinlocallabels=($flavour=~/linux/)?1:0;
|
||||
|
||||
################################################################
|
||||
# directives which need special treatment on different platforms
|
||||
################################################################
|
||||
my $type = sub {
|
||||
my ($dir,$name,$type) = @_;
|
||||
|
||||
$TYPES{$name} = $type;
|
||||
if ($flavour =~ /linux/) {
|
||||
$name =~ s|^\.||;
|
||||
".type $name,$type";
|
||||
} else {
|
||||
"";
|
||||
}
|
||||
};
|
||||
my $globl = sub {
|
||||
my $junk = shift;
|
||||
my $name = shift;
|
||||
my $global = \$GLOBALS{$name};
|
||||
my $type = \$TYPES{$name};
|
||||
my $ret;
|
||||
|
||||
$name =~ s|^[\.\_]||;
|
||||
|
||||
$name =~ s|^\.||;
|
||||
|
||||
SWITCH: for ($flavour) {
|
||||
/aix/ && do { $name = ".$name";
|
||||
/aix/ && do { if (!$$type) {
|
||||
$$type = "\@function";
|
||||
}
|
||||
if ($$type =~ /function/) {
|
||||
$name = ".$name";
|
||||
}
|
||||
last;
|
||||
};
|
||||
/osx/ && do { $name = "_$name";
|
||||
last;
|
||||
};
|
||||
/linux.*(32|64le)/
|
||||
&& do { $ret .= ".globl $name\n";
|
||||
$ret .= ".type $name,\@function";
|
||||
&& do { $ret .= ".globl $name";
|
||||
if (!$$type) {
|
||||
$ret .= "\n.type $name,\@function";
|
||||
$$type = "\@function";
|
||||
}
|
||||
last;
|
||||
};
|
||||
/linux.*64/ && do { $ret .= ".globl $name\n";
|
||||
$ret .= ".type $name,\@function\n";
|
||||
$ret .= ".section \".opd\",\"aw\"\n";
|
||||
$ret .= ".align 3\n";
|
||||
$ret .= "$name:\n";
|
||||
$ret .= ".quad .$name,.TOC.\@tocbase,0\n";
|
||||
$ret .= ".previous\n";
|
||||
|
||||
$name = ".$name";
|
||||
/linux.*64/ && do { $ret .= ".globl $name";
|
||||
if (!$$type) {
|
||||
$ret .= "\n.type $name,\@function";
|
||||
$$type = "\@function";
|
||||
}
|
||||
if ($$type =~ /function/) {
|
||||
$ret .= "\n.section \".opd\",\"aw\"";
|
||||
$ret .= "\n.align 3";
|
||||
$ret .= "\n$name:";
|
||||
$ret .= "\n.quad .$name,.TOC.\@tocbase,0";
|
||||
$ret .= "\n.previous";
|
||||
$name = ".$name";
|
||||
}
|
||||
last;
|
||||
};
|
||||
}
|
||||
@@ -70,9 +95,13 @@ my $machine = sub {
|
||||
my $size = sub {
|
||||
if ($flavour =~ /linux/)
|
||||
{ shift;
|
||||
my $name = shift; $name =~ s|^[\.\_]||;
|
||||
my $ret = ".size $name,.-".($flavour=~/64$/?".":"").$name;
|
||||
$ret .= "\n.size .$name,.-.$name" if ($flavour=~/64$/);
|
||||
my $name = shift;
|
||||
my $real = $GLOBALS{$name} ? \$GLOBALS{$name} : \$name;
|
||||
my $ret = ".size $$real,.-$$real";
|
||||
$name =~ s|^\.||;
|
||||
if ($$real ne $name) {
|
||||
$ret .= "\n.size $name,.-$$real";
|
||||
}
|
||||
$ret;
|
||||
}
|
||||
else
|
||||
@@ -187,6 +216,12 @@ my $lvdx_u = sub { vsxmem_op(@_, 588); }; # lxsdx
|
||||
my $stvdx_u = sub { vsxmem_op(@_, 716); }; # stxsdx
|
||||
my $lvx_4w = sub { vsxmem_op(@_, 780); }; # lxvw4x
|
||||
my $stvx_4w = sub { vsxmem_op(@_, 908); }; # stxvw4x
|
||||
my $lvx_splt = sub { vsxmem_op(@_, 332); }; # lxvdsx
|
||||
my $vpermdi = sub { # xxpermdi
|
||||
my ($f, $vrt, $vra, $vrb, $dm) = @_;
|
||||
$dm = oct($dm) if ($dm =~ /^0/);
|
||||
" .long ".sprintf "0x%X",(60<<26)|($vrt<<21)|($vra<<16)|($vrb<<11)|($dm<<8)|(10<<3)|7;
|
||||
};
|
||||
|
||||
# PowerISA 2.07 stuff
|
||||
sub vcrypto_op {
|
||||
@@ -204,7 +239,14 @@ my $vpmsumb = sub { vcrypto_op(@_, 1032); };
|
||||
my $vpmsumd = sub { vcrypto_op(@_, 1224); };
|
||||
my $vpmsubh = sub { vcrypto_op(@_, 1096); };
|
||||
my $vpmsumw = sub { vcrypto_op(@_, 1160); };
|
||||
# These are not really crypto, but one can use vcrypto_op
|
||||
my $vaddudm = sub { vcrypto_op(@_, 192); };
|
||||
my $vadduqm = sub { vcrypto_op(@_, 256); };
|
||||
my $vmuleuw = sub { vcrypto_op(@_, 648); };
|
||||
my $vmulouw = sub { vcrypto_op(@_, 136); };
|
||||
my $vrld = sub { vcrypto_op(@_, 196); };
|
||||
my $vsld = sub { vcrypto_op(@_, 1476); };
|
||||
my $vsrd = sub { vcrypto_op(@_, 1732); };
|
||||
|
||||
my $mtsle = sub {
|
||||
my ($f, $arg) = @_;
|
||||
@@ -220,11 +262,24 @@ my $maddld = sub {
|
||||
my ($f, $rt, $ra, $rb, $rc) = @_;
|
||||
" .long ".sprintf "0x%X",(4<<26)|($rt<<21)|($ra<<16)|($rb<<11)|($rc<<6)|51;
|
||||
};
|
||||
|
||||
my $darn = sub {
|
||||
my ($f, $rt, $l) = @_;
|
||||
" .long ".sprintf "0x%X",(31<<26)|($rt<<21)|($l<<16)|(755<<1);
|
||||
};
|
||||
my $iseleq = sub {
|
||||
my ($f, $rt, $ra, $rb) = @_;
|
||||
" .long ".sprintf "0x%X",(31<<26)|($rt<<21)|($ra<<16)|($rb<<11)|(2<<6)|30;
|
||||
};
|
||||
|
||||
# PowerISA 3.0B stuff
|
||||
my $addex = sub {
|
||||
my ($f, $rt, $ra, $rb, $cy) = @_; # only cy==0 is specified in 3.0B
|
||||
" .long ".sprintf "0x%X",(31<<26)|($rt<<21)|($ra<<16)|($rb<<11)|($cy<<9)|(170<<1);
|
||||
};
|
||||
my $vmsumudm = sub {
|
||||
my ($f, $vrt, $vra, $vrb, $vrc) = @_;
|
||||
" .long ".sprintf "0x%X",(4<<26)|($vrt<<21)|($vra<<16)|($vrb<<11)|($vrc<<6)|35;
|
||||
};
|
||||
|
||||
while($line=<>) {
|
||||
|
||||
@@ -234,7 +289,7 @@ while($line=<>) {
|
||||
$line =~ s|\s+$||; # ... and at the end
|
||||
|
||||
{
|
||||
$line =~ s|\b\.L(\w+)|L$1|g; # common denominator for Locallabel
|
||||
$line =~ s|\.L(\w+)|L$1|g; # common denominator for Locallabel
|
||||
$line =~ s|\bL(\w+)|\.L$1|g if ($dotinlocallabels);
|
||||
}
|
||||
|
||||
@@ -242,8 +297,13 @@ while($line=<>) {
|
||||
$line =~ s|(^[\.\w]+)\:\s*||;
|
||||
my $label = $1;
|
||||
if ($label) {
|
||||
printf "%s:",($GLOBALS{$label} or $label);
|
||||
printf "\n.localentry\t$GLOBALS{$label},0" if ($GLOBALS{$label} && $flavour =~ /linux.*64le/);
|
||||
my $xlated = ($GLOBALS{$label} or $label);
|
||||
print "$xlated:";
|
||||
if ($flavour =~ /linux.*64le/) {
|
||||
if ($TYPES{$label} =~ /function/) {
|
||||
printf "\n.localentry %s,0\n",$xlated;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -254,7 +314,7 @@ while($line=<>) {
|
||||
my $f = $3;
|
||||
my $opcode = eval("\$$mnemonic");
|
||||
$line =~ s/\b(c?[rf]|v|vs)([0-9]+)\b/$2/g if ($c ne "." and $flavour !~ /osx/);
|
||||
if (ref($opcode) eq 'CODE') { $line = &$opcode($f,split(',',$line)); }
|
||||
if (ref($opcode) eq 'CODE') { $line = &$opcode($f,split(/,\s*/,$line)); }
|
||||
elsif ($mnemonic) { $line = $c.$mnemonic.$f."\t".$line; }
|
||||
}
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ $::code.=<<___;
|
||||
|
||||
brnz,pn $ooff, 2f
|
||||
sub $len, 1, $len
|
||||
|
||||
|
||||
std %f0, [$out + 0]
|
||||
std %f2, [$out + 8]
|
||||
brnz,pt $len, .L${bits}_cbc_enc_loop
|
||||
@@ -224,7 +224,7 @@ $::code.=<<___;
|
||||
call _${alg}${bits}_encrypt_1x
|
||||
add $inp, 16, $inp
|
||||
sub $len, 1, $len
|
||||
|
||||
|
||||
stda %f0, [$out]0xe2 ! ASI_BLK_INIT, T4-specific
|
||||
add $out, 8, $out
|
||||
stda %f2, [$out]0xe2 ! ASI_BLK_INIT, T4-specific
|
||||
@@ -339,7 +339,7 @@ $::code.=<<___;
|
||||
|
||||
brnz,pn $ooff, 2f
|
||||
sub $len, 1, $len
|
||||
|
||||
|
||||
std %f0, [$out + 0]
|
||||
std %f2, [$out + 8]
|
||||
brnz,pt $len, .L${bits}_cbc_dec_loop2x
|
||||
@@ -445,7 +445,7 @@ $::code.=<<___;
|
||||
|
||||
brnz,pn $ooff, 2f
|
||||
sub $len, 2, $len
|
||||
|
||||
|
||||
std %f0, [$out + 0]
|
||||
std %f2, [$out + 8]
|
||||
std %f4, [$out + 16]
|
||||
@@ -702,7 +702,7 @@ $::code.=<<___;
|
||||
|
||||
brnz,pn $ooff, 2f
|
||||
sub $len, 1, $len
|
||||
|
||||
|
||||
std %f0, [$out + 0]
|
||||
std %f2, [$out + 8]
|
||||
brnz,pt $len, .L${bits}_ctr32_loop2x
|
||||
@@ -791,7 +791,7 @@ $::code.=<<___;
|
||||
|
||||
brnz,pn $ooff, 2f
|
||||
sub $len, 2, $len
|
||||
|
||||
|
||||
std %f0, [$out + 0]
|
||||
std %f2, [$out + 8]
|
||||
std %f4, [$out + 16]
|
||||
@@ -1024,7 +1024,7 @@ $code.=<<___;
|
||||
|
||||
brnz,pn $ooff, 2f
|
||||
sub $len, 1, $len
|
||||
|
||||
|
||||
std %f0, [$out + 0]
|
||||
std %f2, [$out + 8]
|
||||
brnz,pt $len, .L${bits}_xts_${dir}loop2x
|
||||
@@ -1135,7 +1135,7 @@ $code.=<<___;
|
||||
|
||||
brnz,pn $ooff, 2f
|
||||
sub $len, 2, $len
|
||||
|
||||
|
||||
std %f0, [$out + 0]
|
||||
std %f2, [$out + 8]
|
||||
std %f4, [$out + 16]
|
||||
|
||||
@@ -1430,4 +1430,3 @@ close STDOUT;
|
||||
# Unix. "Unlike" refers to the fact that on Unix signal handler
|
||||
# will always be invoked, core dumped and appropriate exit code
|
||||
# returned to parent (for user notification).
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#! /usr/bin/env perl
|
||||
# Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
# Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
#
|
||||
# Licensed under the OpenSSL license (the "License"). You may not use
|
||||
# this file except in compliance with the License. You can obtain a copy
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
|
||||
# require 'x86asm.pl';
|
||||
# &asm_init(<flavor>,"des-586.pl"[,$i386only]);
|
||||
# &asm_init(<flavor>[,$i386only]);
|
||||
# &function_begin("foo");
|
||||
# ...
|
||||
# &function_end("foo");
|
||||
@@ -259,12 +259,11 @@ sub ::asm_finish
|
||||
}
|
||||
|
||||
sub ::asm_init
|
||||
{ my ($type,$fn,$cpu)=@_;
|
||||
{ my ($type,$cpu)=@_;
|
||||
|
||||
$filename=$fn;
|
||||
$i386=$cpu;
|
||||
|
||||
$elf=$cpp=$coff=$aout=$macosx=$win32=$netware=$mwerks=$android=0;
|
||||
$elf=$cpp=$coff=$aout=$macosx=$win32=$mwerks=$android=0;
|
||||
if (($type eq "elf"))
|
||||
{ $elf=1; require "x86gas.pl"; }
|
||||
elsif (($type eq "elf-1"))
|
||||
@@ -275,10 +274,6 @@ sub ::asm_init
|
||||
{ $coff=1; require "x86gas.pl"; }
|
||||
elsif (($type eq "win32n"))
|
||||
{ $win32=1; require "x86nasm.pl"; }
|
||||
elsif (($type eq "nw-nasm"))
|
||||
{ $netware=1; require "x86nasm.pl"; }
|
||||
#elsif (($type eq "nw-mwasm"))
|
||||
#{ $netware=1; $mwerks=1; require "x86nasm.pl"; }
|
||||
elsif (($type eq "win32"))
|
||||
{ $win32=1; require "x86masm.pl"; }
|
||||
elsif (($type eq "macosx"))
|
||||
@@ -292,7 +287,6 @@ Pick one target type from
|
||||
a.out - DJGPP, elder OpenBSD, etc.
|
||||
coff - GAS/COFF such as Win32 targets
|
||||
win32n - Windows 95/Windows NT NASM format
|
||||
nw-nasm - NetWare NASM format
|
||||
macosx - Mac OS X
|
||||
EOF
|
||||
exit(1);
|
||||
@@ -301,8 +295,7 @@ EOF
|
||||
$pic=0;
|
||||
for (@ARGV) { $pic=1 if (/\-[fK]PIC/i); }
|
||||
|
||||
$filename =~ s/\.pl$//;
|
||||
&file($filename);
|
||||
&file();
|
||||
}
|
||||
|
||||
sub ::hidden {}
|
||||
|
||||
@@ -104,7 +104,7 @@ sub ::BC { @_; }
|
||||
sub ::DWC { @_; }
|
||||
|
||||
sub ::file
|
||||
{ push(@out,".file\t\"$_[0].s\"\n.text\n"); }
|
||||
{ push(@out,".text\n"); }
|
||||
|
||||
sub ::function_begin_B
|
||||
{ my $func=shift;
|
||||
|
||||
@@ -85,7 +85,6 @@ sub ::DWC { "@_"; }
|
||||
|
||||
sub ::file
|
||||
{ my $tmp=<<___;
|
||||
TITLE $_[0].asm
|
||||
IF \@Version LT 800
|
||||
ECHO MASM version 8.00 or later is strongly recommended.
|
||||
ENDIF
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#! /usr/bin/env perl
|
||||
# Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
# Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
#
|
||||
# Licensed under the OpenSSL license (the "License"). You may not use
|
||||
# this file except in compliance with the License. You can obtain a copy
|
||||
@@ -12,7 +12,7 @@ package x86nasm;
|
||||
*out=\@::out;
|
||||
|
||||
$::lbdecor="L\$"; # local label decoration
|
||||
$nmdecor=$::netware?"":"_"; # external name decoration
|
||||
$nmdecor="_"; # external name decoration
|
||||
$drdecor=$::mwerks?".":""; # directive decoration
|
||||
|
||||
$initseg="";
|
||||
@@ -132,7 +132,7 @@ ___
|
||||
grep {s/(^extern\s+${nmdecor}OPENSSL_ia32cap_P)/\;$1/} @out;
|
||||
push (@out,$comm)
|
||||
}
|
||||
push (@out,$initseg) if ($initseg);
|
||||
push (@out,$initseg) if ($initseg);
|
||||
}
|
||||
|
||||
sub ::comment { foreach (@_) { push(@out,"\t; $_\n"); } }
|
||||
|
||||
Reference in New Issue
Block a user