diff options
author | Andy Polyakov <appro@openssl.org> | 2009-12-27 21:38:32 +0100 |
---|---|---|
committer | Andy Polyakov <appro@openssl.org> | 2009-12-27 21:38:32 +0100 |
commit | beef7145997c1183c8c154076d3fa3a7148ada60 (patch) | |
tree | 45792236bc9a9fd3b2342536be01cb0cd3343a92 /ms | |
parent | ppccap.c: tidy up. (diff) | |
download | openssl-beef7145997c1183c8c154076d3fa3a7148ada60.tar.xz openssl-beef7145997c1183c8c154076d3fa3a7148ada60.zip |
Switch to new uplink assembler.
Diffstat (limited to 'ms')
-rwxr-xr-x | ms/do_win64a.bat | 14 | ||||
-rwxr-xr-x | ms/do_win64i.bat | 2 | ||||
-rwxr-xr-x | ms/uplink.pl | 204 |
3 files changed, 13 insertions, 207 deletions
diff --git a/ms/do_win64a.bat b/ms/do_win64a.bat index 825c690221..2a63f85c88 100755 --- a/ms/do_win64a.bat +++ b/ms/do_win64a.bat @@ -1,7 +1,17 @@ -
perl util\mkfiles.pl >MINFO
-perl ms\uplink.pl win64a > ms\uptable.asm
+
+cmd /c "nasm -f win64 -v" >NUL: 2>&1
+if %errorlevel% neq 0 goto ml64
+
+perl ms\uplink-x86_64.pl nasm > ms\uptable.asm
+nasm -f win64 -o ms\uptable.obj ms\uptable.asm
+goto proceed
+
+:ml64
+perl ms\uplink-x86_64.pl masm > ms\uptable.asm
ml64 -c -Foms\uptable.obj ms\uptable.asm
+
+:proceed
perl util\mk1mf.pl no-asm VC-WIN64A >ms\nt.mak
perl util\mk1mf.pl dll no-asm VC-WIN64A >ms\ntdll.mak
diff --git a/ms/do_win64i.bat b/ms/do_win64i.bat index 7bfc2f1818..4e56eac92c 100755 --- a/ms/do_win64i.bat +++ b/ms/do_win64i.bat @@ -1,6 +1,6 @@ perl util\mkfiles.pl >MINFO
-perl ms\uplink.pl win64i > ms\uptable.asm
+perl ms\uplink-ia64.pl > ms\uptable.asm
ias -o ms\uptable.obj ms\uptable.asm
perl util\mk1mf.pl no-asm VC-WIN64I >ms\nt.mak
perl util\mk1mf.pl dll no-asm VC-WIN64I >ms\ntdll.mak
diff --git a/ms/uplink.pl b/ms/uplink.pl deleted file mode 100755 index 102400e880..0000000000 --- a/ms/uplink.pl +++ /dev/null @@ -1,204 +0,0 @@ -#!/usr/bin/env perl -# -# For Microsoft CL this is implemented as inline assembler. So that -# even though this script can generate even Win32 code, we'll be -# using it primarily to generate Win64 modules. Both IA-64 and AMD64 -# are supported... - -# pull APPLINK_MAX value from applink.c... -$applink_c=$0; -$applink_c=~s|[^/\\]+$||g; -$applink_c.="applink.c"; -open(INPUT,$applink_c) || die "can't open $applink_c: $!"; -@max=grep {/APPLINK_MAX\s+(\d+)/} <INPUT>; -close(INPUT); -($#max==0) or die "can't find APPLINK_MAX in $applink_c"; - -$max[0]=~/APPLINK_MAX\s+(\d+)/; -$N=$1; # number of entries in OPENSSL_UplinkTable not including - # OPENSSL_UplinkTable[0], which contains this value... - -# Idea is to fill the OPENSSL_UplinkTable with pointers to stubs -# which invoke 'void OPENSSL_Uplink (ULONG_PTR *table,int index)'; -# and then dereference themselves. Latter shall result in endless -# loop *unless* OPENSSL_Uplink does not replace 'table[index]' with -# something else, e.g. as 'table[index]=unimplemented;'... - -$arg = shift; -#( defined shift || open STDOUT,">$arg" ) || die "can't open $arg: $!"; - -if ($arg =~ /win32n/) { ia32nasm(); } -elsif ($arg =~ /win32/) { ia32masm(); } -elsif ($arg =~ /coff/) { ia32gas(); } -elsif ($arg =~ /win64i/ or $arg =~ /ia64/) { ia64ias(); } -elsif ($arg =~ /win64a/ or $arg =~ /amd64/) { amd64masm(); } -else { die "nonsense $arg"; } - -sub ia32gas() { -print <<___; -.text -___ -for ($i=1;$i<=$N;$i++) { -print <<___; -.def .Lazy$i; .scl 3; .type 32; .endef -.align 4 -.Lazy$i: - pushl \$$i - pushl \$_OPENSSL_UplinkTable - call _OPENSSL_Uplink - addl \$8,%esp - jmp *(_OPENSSL_UplinkTable+4*$i) -___ -} -print <<___; -.data -.align 4 -.globl _OPENSSL_UplinkTable -_OPENSSL_UplinkTable: - .long $N -___ -for ($i=1;$i<=$N;$i++) { print " .long .Lazy$i\n"; } -} - -sub ia32masm() { -print <<___; -.386P -.model FLAT - -_DATA SEGMENT -PUBLIC _OPENSSL_UplinkTable -_OPENSSL_UplinkTable DD $N ; amount of following entries -___ -for ($i=1;$i<=$N;$i++) { print " DD FLAT:\$lazy$i\n"; } -print <<___; -_DATA ENDS - -_TEXT SEGMENT -EXTRN _OPENSSL_Uplink:NEAR -___ -for ($i=1;$i<=$N;$i++) { -print <<___; -ALIGN 4 -\$lazy$i PROC NEAR - push $i - push OFFSET FLAT:_OPENSSL_UplinkTable - call _OPENSSL_Uplink - add esp,8 - jmp DWORD PTR _OPENSSL_UplinkTable+4*$i -\$lazy$i ENDP -___ -} -print <<___; -ALIGN 4 -_TEXT ENDS -END -___ -} - -sub ia32nasm() { -print <<___; -SEGMENT .data -GLOBAL _OPENSSL_UplinkTable -_OPENSSL_UplinkTable DD $N ; amount of following entries -___ -for ($i=1;$i<=$N;$i++) { print " DD \$lazy$i\n"; } -print <<___; - -SEGMENT .text -EXTERN _OPENSSL_Uplink -___ -for ($i=1;$i<=$N;$i++) { -print <<___; -ALIGN 4 -\$lazy$i: - push $i - push _OPENSSL_UplinkTable - call _OPENSSL_Uplink - add esp,8 - jmp [_OPENSSL_UplinkTable+4*$i] -___ -} -print <<___; -ALIGN 4 -END -___ -} - -sub ia64ias () { -local $V=8; # max number of args uplink functions may accept... -print <<___; -.data -.global OPENSSL_UplinkTable# -OPENSSL_UplinkTable: data8 $N // amount of following entries -___ -for ($i=1;$i<=$N;$i++) { print " data8 \@fptr(lazy$i#)\n"; } -print <<___; -.size OPENSSL_UplinkTable,.-OPENSSL_UplinkTable# - -.text -.global OPENSSL_Uplink# -.type OPENSSL_Uplink#,\@function -___ -for ($i=1;$i<=$N;$i++) { -print <<___; -.proc lazy$i -lazy$i: -{ .mii; alloc loc0=ar.pfs,$V,3,2,0 - mov loc1=b0 - addl loc2=\@ltoff(OPENSSL_UplinkTable#),gp };; -{ .mmi; ld8 out0=[loc2] - mov out1=$i };; -{ .mib; adds loc2=8*$i,out0 - br.call.sptk.many b0=OPENSSL_Uplink# };; -{ .mmi; ld8 r31=[loc2];; - ld8 r30=[r31],8 };; -{ .mii; ld8 gp=[r31] - mov b6=r30 - mov b0=loc1 };; -{ .mib; mov ar.pfs=loc0 - br.many b6 };; -.endp lazy$i# -___ -} -} - -sub amd64masm() { -print <<___; -_DATA SEGMENT -PUBLIC OPENSSL_UplinkTable -OPENSSL_UplinkTable DQ $N -___ -for ($i=1;$i<=$N;$i++) { print " DQ \$lazy$i\n"; } -print <<___; -_DATA ENDS - -_TEXT SEGMENT -EXTERN OPENSSL_Uplink:PROC -___ -for ($i=1;$i<=$N;$i++) { -print <<___; -ALIGN 4 -\$lazy$i PROC - push r9 - push r8 - push rdx - push rcx - sub rsp,40 - lea rcx,OFFSET OPENSSL_UplinkTable - mov rdx,$i - call OPENSSL_Uplink - add rsp,40 - pop rcx - pop rdx - pop r8 - pop r9 - jmp QWORD PTR OPENSSL_UplinkTable+8*$i -\$lazy$i ENDP -___ -} -print <<___; -_TEXT ENDS -END -___ -} - |