Index: openssl/ms/uplink-x86_64.pl |
=================================================================== |
--- openssl/ms/uplink-x86_64.pl (revision 0) |
+++ openssl/ms/uplink-x86_64.pl (revision 0) |
@@ -0,0 +1,64 @@ |
+#!/usr/bin/env perl |
+ |
+$output=shift; |
+$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; |
+open STDOUT,"| $^X ${dir}../crypto/perlasm/x86_64-xlate.pl $output"; |
+push(@INC,"${dir}."); |
+ |
+require "uplink-common.pl"; |
+ |
+$prefix="_lazy"; |
+ |
+print <<___; |
+.text |
+.extern OPENSSL_Uplink |
+.globl OPENSSL_UplinkTable |
+___ |
+for ($i=1;$i<=$N;$i++) { |
+print <<___; |
+.type $prefix${i},\@abi-omnipotent |
+.align 16 |
+$prefix${i}: |
+ .byte 0x48,0x83,0xEC,0x28 # sub rsp,40 |
+ mov %rcx,48(%rsp) |
+ mov %rdx,56(%rsp) |
+ mov %r8,64(%rsp) |
+ mov %r9,72(%rsp) |
+ lea OPENSSL_UplinkTable(%rip),%rcx |
+ mov \$$i,%rdx |
+ call OPENSSL_Uplink |
+ mov 48(%rsp),%rcx |
+ mov 56(%rsp),%rdx |
+ mov 64(%rsp),%r8 |
+ mov 72(%rsp),%r9 |
+ lea OPENSSL_UplinkTable(%rip),%rax |
+ add \$40,%rsp |
+ jmp *8*$i(%rax) |
+$prefix${i}_end: |
+.size $prefix${i},.-$prefix${i} |
+___ |
+} |
+print <<___; |
+.data |
+OPENSSL_UplinkTable: |
+ .quad $N |
+___ |
+for ($i=1;$i<=$N;$i++) { print " .quad $prefix$i\n"; } |
+print <<___; |
+.section .pdata,"r" |
+.align 4 |
+___ |
+for ($i=1;$i<=$N;$i++) { |
+print <<___; |
+ .rva $prefix${i},$prefix${i}_end,${prefix}_unwind_info |
+___ |
+} |
+print <<___; |
+.section .xdata,"r" |
+.align 8 |
+${prefix}_unwind_info: |
+ .byte 0x01,0x04,0x01,0x00 |
+ .byte 0x04,0x42,0x00,0x00 |
+___ |
+ |
+close STDOUT; |