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