1#!/usr/bin/env perl 2 3$output=shift; 4$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1; 5open OUT,"| \"$^X\" ${dir}../crypto/perlasm/x86_64-xlate.pl $output"; 6*STDOUT=*OUT; 7push(@INC,"${dir}."); 8 9require "uplink-common.pl"; 10 11$prefix="_lazy"; 12 13print <<___; 14.text 15.extern OPENSSL_Uplink 16.globl OPENSSL_UplinkTable 17___ 18for ($i=1;$i<=$N;$i++) { 19print <<___; 20.type $prefix${i},\@abi-omnipotent 21.align 16 22$prefix${i}: 23 .byte 0x48,0x83,0xEC,0x28 # sub rsp,40 24 mov %rcx,48(%rsp) 25 mov %rdx,56(%rsp) 26 mov %r8,64(%rsp) 27 mov %r9,72(%rsp) 28 lea OPENSSL_UplinkTable(%rip),%rcx 29 mov \$$i,%rdx 30 call OPENSSL_Uplink 31 mov 48(%rsp),%rcx 32 mov 56(%rsp),%rdx 33 mov 64(%rsp),%r8 34 mov 72(%rsp),%r9 35 lea OPENSSL_UplinkTable(%rip),%rax 36 add \$40,%rsp 37 jmp *8*$i(%rax) 38$prefix${i}_end: 39.size $prefix${i},.-$prefix${i} 40___ 41} 42print <<___; 43.data 44OPENSSL_UplinkTable: 45 .quad $N 46___ 47for ($i=1;$i<=$N;$i++) { print " .quad $prefix$i\n"; } 48print <<___; 49.section .pdata,"r" 50.align 4 51___ 52for ($i=1;$i<=$N;$i++) { 53print <<___; 54 .rva $prefix${i},$prefix${i}_end,${prefix}_unwind_info 55___ 56} 57print <<___; 58.section .xdata,"r" 59.align 8 60${prefix}_unwind_info: 61 .byte 0x01,0x04,0x01,0x00 62 .byte 0x04,0x42,0x00,0x00 63___ 64 65close STDOUT; 66