diff options
author | Andy Polyakov <appro@openssl.org> | 2002-12-13 17:56:14 +0000 |
---|---|---|
committer | Andy Polyakov <appro@openssl.org> | 2002-12-13 17:56:14 +0000 |
commit | 6f7ac8e1b0654e1be7ec571f3646be6f37c34788 (patch) | |
tree | 03a69de9b2e182a1f3a6ed6cc4e4c55ff1d1c0e7 /crypto/perlasm | |
parent | a1457874c61f6da4dfe67944b8ae94fcd59bc02e (diff) |
IA-32 assembler modules (primarily DES) PIC-ification. Idea is to keep
shared libraries shared.
Diffstat (limited to 'crypto/perlasm')
-rw-r--r-- | crypto/perlasm/cbc.pl | 41 | ||||
-rw-r--r-- | crypto/perlasm/x86ms.pl | 2 | ||||
-rw-r--r-- | crypto/perlasm/x86nasm.pl | 2 | ||||
-rw-r--r-- | crypto/perlasm/x86unix.pl | 23 |
4 files changed, 49 insertions, 19 deletions
diff --git a/crypto/perlasm/cbc.pl b/crypto/perlasm/cbc.pl index 0145c4f0cc..22149c680e 100644 --- a/crypto/perlasm/cbc.pl +++ b/crypto/perlasm/cbc.pl @@ -146,9 +146,15 @@ sub cbc &mov($count, &wparam(2)); # length &and($count, 7); &jz(&label("finish")); + &call(&label("PIC_point")); +&set_label("PIC_point"); + &blindpop("edx"); + &lea("ecx",&DWP(&label("cbc_enc_jmp_table")."-".&label("PIC_point"),"edx")); + &mov($count,&DWP(0,"ecx",$count,4)) + &add($count,"edx"); &xor("ecx","ecx"); &xor("edx","edx"); - &mov($count,&DWP(&label("cbc_enc_jmp_table"),"",$count,4)); + #&mov($count,&DWP(&label("cbc_enc_jmp_table"),"",$count,4)); &jmp_ptr($count); &set_label("ej7"); @@ -318,22 +324,23 @@ sub cbc &set_label("cbc_enc_jmp_table",1); &data_word("0"); - &data_word(&label("ej1")); - &data_word(&label("ej2")); - &data_word(&label("ej3")); - &data_word(&label("ej4")); - &data_word(&label("ej5")); - &data_word(&label("ej6")); - &data_word(&label("ej7")); - &set_label("cbc_dec_jmp_table",1); - &data_word("0"); - &data_word(&label("dj1")); - &data_word(&label("dj2")); - &data_word(&label("dj3")); - &data_word(&label("dj4")); - &data_word(&label("dj5")); - &data_word(&label("dj6")); - &data_word(&label("dj7")); + &data_word(&label("ej1")."-".&label("PIC_point")); + &data_word(&label("ej2")."-".&label("PIC_point")); + &data_word(&label("ej3")."-".&label("PIC_point")); + &data_word(&label("ej4")."-".&label("PIC_point")); + &data_word(&label("ej5")."-".&label("PIC_point")); + &data_word(&label("ej6")."-".&label("PIC_point")); + &data_word(&label("ej7")."-".&label("PIC_point")); + # not used + #&set_label("cbc_dec_jmp_table",1); + #&data_word("0"); + #&data_word(&label("dj1")."-".&label("PIC_point")); + #&data_word(&label("dj2")."-".&label("PIC_point")); + #&data_word(&label("dj3")."-".&label("PIC_point")); + #&data_word(&label("dj4")."-".&label("PIC_point")); + #&data_word(&label("dj5")."-".&label("PIC_point")); + #&data_word(&label("dj6")."-".&label("PIC_point")); + #&data_word(&label("dj7")."-".&label("PIC_point")); &function_end_B($name); diff --git a/crypto/perlasm/x86ms.pl b/crypto/perlasm/x86ms.pl index 206452341d..5229afeb64 100644 --- a/crypto/perlasm/x86ms.pl +++ b/crypto/perlasm/x86ms.pl @@ -363,3 +363,5 @@ sub out1p push(@out,"\t$name\t ".&conv($p1)."\n"); } + +sub main'blindpop { &out1("pop",@_); } diff --git a/crypto/perlasm/x86nasm.pl b/crypto/perlasm/x86nasm.pl index 519d8a5867..819151c6bc 100644 --- a/crypto/perlasm/x86nasm.pl +++ b/crypto/perlasm/x86nasm.pl @@ -340,3 +340,5 @@ sub out1p push(@out,"\t$name\t ".&conv($p1)."\n"); } + +sub main'blindpop { &out1("pop",@_); } diff --git a/crypto/perlasm/x86unix.pl b/crypto/perlasm/x86unix.pl index 9ceabf0705..922d1a22ae 100644 --- a/crypto/perlasm/x86unix.pl +++ b/crypto/perlasm/x86unix.pl @@ -87,12 +87,12 @@ sub main'DWP $ret.=$addr if ($addr ne "") && ($addr ne 0); if ($reg2 ne "") { - if($idx ne "") + if($idx ne "" && $idx != 0) { $ret.="($reg1,$reg2,$idx)"; } else { $ret.="($reg1,$reg2)"; } } - else + elsif ($reg1 ne "") { $ret.="($reg1)" } return($ret); } @@ -542,3 +542,22 @@ sub popvars &main'pop("edx"); &main'popf(); } + +sub main'picmeup + { + local($dst,$sym)=@_; + local($tmp)=<<___; +#if (defined(ELF) || defined(SOL)) && defined(PIC) + .align 8 + call 1f +1: popl $regs{$dst} + addl \$_GLOBAL_OFFSET_TABLE_+[.-1b],$regs{$dst} + movl $sym\@GOT($regs{$dst}),$regs{$dst} +#else + movl \$$sym,$regs{$dst} +#endif +___ + push(@out,$tmp); + } + +sub main'blindpop { &out1("popl",@_); } |