IA-32 assembler modules (primarily DES) PIC-ification. Idea is to keep
authorAndy Polyakov <appro@openssl.org>
Fri, 13 Dec 2002 17:56:14 +0000 (17:56 +0000)
committerAndy Polyakov <appro@openssl.org>
Fri, 13 Dec 2002 17:56:14 +0000 (17:56 +0000)
shared libraries shared.

Configure
crypto/des/Makefile.ssl
crypto/des/asm/crypt586.pl
crypto/des/asm/des-586.pl
crypto/perlasm/cbc.pl
crypto/perlasm/x86ms.pl
crypto/perlasm/x86nasm.pl
crypto/perlasm/x86unix.pl

index 44848b5..eb7b588 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -1104,6 +1104,11 @@ if ($no_asm)
        $sha1_obj=$md5_obj=$rmd160_obj="";
        }
 
+if (!$no_shared)
+       {
+       $cast_obj="";   # CAST assembler is not PIC
+       }
+
 if ($threads)
        {
        $cflags=$thread_cflags;
@@ -1119,20 +1124,16 @@ if ($zlib)
 
 # You will find shlib_mark1 and shlib_mark2 explained in Makefile.org
 my $shared_mark = "";
-if ($shared_target ne "")
+if ($shared_target eq "")
+       {
+       $no_shared = 1;
+       }
+if (!$no_shared)
        {
        if ($shared_cflag ne "")
                {
                $cflags = "$shared_cflag $cflags";
                }
-       if (!$no_shared)
-               {
-               #$shared_mark = "\$(SHARED_LIBS)";
-               }
-       }
-else
-       {
-       $no_shared = 1;
        }
 
 if ($no_shared)
index ebf0806..aedfbb4 100644 (file)
@@ -67,19 +67,27 @@ des: des.o cbc3_enc.o lib
 
 # elf
 asm/dx86-elf.o: asm/dx86unix.cpp
-       $(CPP) -DELF -x c asm/dx86unix.cpp | as -o asm/dx86-elf.o
+       $(CPP) -DELF    \
+               `(echo $(CFLAGS) | egrep -ie '-[fK]PIC') > /dev/null 2>&1 && echo -DPIC`\
+               -x c asm/dx86unix.cpp | as -o asm/dx86-elf.o
 
 asm/yx86-elf.o: asm/yx86unix.cpp
-       $(CPP) -DELF -x c asm/yx86unix.cpp | as -o asm/yx86-elf.o
+       $(CPP) -DELF    \
+               `(echo $(CFLAGS) | egrep -ie '-[fK]PIC') > /dev/null 2>&1 && echo -DPIC`\
+               -x c asm/yx86unix.cpp | as -o asm/yx86-elf.o
 
 # solaris
 asm/dx86-sol.o: asm/dx86unix.cpp
-       $(CC) -E -DSOL asm/dx86unix.cpp | sed 's/^#.*//' > asm/dx86-sol.s
+       $(CC) -E -DSOL  \
+               `(echo $(CFLAGS) | egrep -ie '-[fK]PIC') > /dev/null 2>&1 && echo -DPIC`\
+               asm/dx86unix.cpp | sed 's/^#.*//' > asm/dx86-sol.s
        as -o asm/dx86-sol.o asm/dx86-sol.s
        rm -f asm/dx86-sol.s
 
 asm/yx86-sol.o: asm/yx86unix.cpp
-       $(CC) -E -DSOL asm/yx86unix.cpp | sed 's/^#.*//' > asm/yx86-sol.s
+       $(CC) -E -DSOL  \
+               `(echo $(CFLAGS) | egrep -ie '-[fK]PIC') > /dev/null 2>&1 && echo -DPIC`\
+               asm/yx86unix.cpp | sed 's/^#.*//' > asm/yx86-sol.s
        as -o asm/yx86-sol.o asm/yx86-sol.s
        rm -f asm/yx86-sol.s
 
index 3d41d82..51fb3dd 100644 (file)
@@ -26,11 +26,17 @@ sub fcrypt_body
 
        &comment("");
        &comment("Load the 2 words");
-       $ks="ebp";
+       $trans="ebp";
 
        &xor(   $L,     $L);
        &xor(   $R,     $R);
-       &mov($ks,&wparam(1));
+
+       # PIC-ification:-)
+       if ($cpp)       { &picmeup("edx","DES_SPtrans");   }
+       else            { &lea("edx",&DWP("DES_SPtrans")); }
+       &push("edx");   # becomes &swtmp(1)
+       #
+       &mov($trans,&wparam(1)); # reloaded with DES_SPtrans in D_ENCRYPT
 
        &push(&DWC(25)); # add a variable
 
@@ -39,11 +45,11 @@ sub fcrypt_body
                {
                &comment("");
                &comment("Round $i");
-               &D_ENCRYPT($i,$L,$R,$i*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
+               &D_ENCRYPT($i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx");
 
                &comment("");
                &comment("Round ".sprintf("%d",$i+1));
-               &D_ENCRYPT($i+1,$R,$L,($i+1)*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
+               &D_ENCRYPT($i+1,$R,$L,($i+1)*2,$trans,"eax","ebx","ecx","edx");
                }
         &mov("ebx",    &swtmp(0));
        &mov("eax",     $L);
@@ -61,14 +67,14 @@ sub fcrypt_body
        &mov(&DWP(0,"edx","",0),"eax");
        &mov(&DWP(4,"edx","",0),$L);
 
-       &pop("ecx");    # remove variable
+       &add("esp",8);  # remove variables
 
        &function_end($name);
        }
 
 sub D_ENCRYPT
        {
-       local($r,$L,$R,$S,$ks,$desSP,$u,$tmp1,$tmp2,$t)=@_;
+       local($r,$L,$R,$S,$trans,$u,$tmp1,$tmp2,$t)=@_;
 
        &mov(   $u,             &wparam(2));                    # 2
        &mov(   $t,             $R);
@@ -85,9 +91,9 @@ sub D_ENCRYPT
        &shl(   $tmp2,          16);                            # 1
        &xor(   $u,             $tmp1);                         # 2
        &xor(   $t,             $tmp2);                         # 2
-       &mov(   $tmp1,          &DWP(&n2a($S*4),$ks,"",0));     # 2
+       &mov(   $tmp1,          &DWP(&n2a($S*4),$trans,"",0));  # 2
        &xor(   $u,             $tmp1);
-       &mov(   $tmp2,          &DWP(&n2a(($S+1)*4),$ks,"",0)); # 2
+       &mov(   $tmp2,          &DWP(&n2a(($S+1)*4),$trans,"",0));      # 2
        &xor(   $u,             $R);
        &xor(   $t,             $R);
        &xor(   $t,             $tmp2);
@@ -99,31 +105,28 @@ sub D_ENCRYPT
        &movb(  &LB($tmp1),     &LB($u) );
        &movb(  &LB($tmp2),     &HB($u) );
        &rotr(  $t,             4               );
-       &mov(   $ks,            &DWP("      $desSP",$tmp1,"",0));
+       &mov(   $trans,         &swtmp(1));
+       &xor(   $L,             &DWP("     ",$trans,$tmp1,0));
        &movb(  &LB($tmp1),     &LB($t) );
-       &xor(   $L,             $ks);
-       &mov(   $ks,            &DWP("0x200+$desSP",$tmp2,"",0));
-       &xor(   $L,             $ks);
+       &xor(   $L,             &DWP("0x200",$trans,$tmp2,0));
        &movb(  &LB($tmp2),     &HB($t) );
        &shr(   $u,             16);
-       &mov(   $ks,            &DWP("0x100+$desSP",$tmp1,"",0));
-       &xor(   $L,             $ks); 
+       &xor(   $L,             &DWP("0x100",$trans,$tmp1,0));
        &movb(  &LB($tmp1),     &HB($u) );
        &shr(   $t,             16);
-       &mov(   $ks,            &DWP("0x300+$desSP",$tmp2,"",0));
-       &xor(   $L,             $ks);
-       &mov(   $ks,            &wparam(1));
+       &xor(   $L,             &DWP("0x300",$trans,$tmp2,0));
        &movb(  &LB($tmp2),     &HB($t) );
        &and(   $u,             "0xff"  );
        &and(   $t,             "0xff"  );
-       &mov(   $tmp1,          &DWP("0x600+$desSP",$tmp1,"",0));
+       &mov(   $tmp1,          &DWP("0x600",$trans,$tmp1,0));
        &xor(   $L,             $tmp1);
-       &mov(   $tmp1,          &DWP("0x700+$desSP",$tmp2,"",0));
+       &mov(   $tmp1,          &DWP("0x700",$trans,$tmp2,0));
        &xor(   $L,             $tmp1);
-       &mov(   $tmp1,          &DWP("0x400+$desSP",$u,"",0));
+       &mov(   $tmp1,          &DWP("0x400",$trans,$u,0));
        &xor(   $L,             $tmp1);
-       &mov(   $tmp1,          &DWP("0x500+$desSP",$t,"",0));
+       &mov(   $tmp1,          &DWP("0x500",$trans,$t,0));
        &xor(   $L,             $tmp1);
+       &mov(   $trans,         &wparam(1));
        }
 
 sub n2a
index 0d08e8a..7a58869 100644 (file)
@@ -40,7 +40,7 @@ sub DES_encrypt
 
        &comment("");
        &comment("Load the 2 words");
-       $ks="ebp";
+       $trans="ebp";
 
        if ($do_ip)
                {
@@ -72,7 +72,11 @@ sub DES_encrypt
                &rotl($L,3);
                }
 
-       &mov(   $ks,            &wparam(1)      );
+       # PIC-ification:-)
+       if ($cpp)       { &picmeup($trans,"DES_SPtrans");   }
+       else            { &lea($trans,&DWP("DES_SPtrans")); }
+
+       &mov(   "ecx",  &wparam(1)      );
        &cmp("ebx","0");
        &je(&label("start_decrypt"));
 
@@ -80,11 +84,11 @@ sub DES_encrypt
                {
                &comment("");
                &comment("Round $i");
-               &D_ENCRYPT($i,$L,$R,$i*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
+               &D_ENCRYPT($i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx");
 
                &comment("");
                &comment("Round ".sprintf("%d",$i+1));
-               &D_ENCRYPT($i+1,$R,$L,($i+1)*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
+               &D_ENCRYPT($i+1,$R,$L,($i+1)*2,$trans,"eax","ebx","ecx","edx");
                }
        &jmp(&label("end"));
 
@@ -94,10 +98,10 @@ sub DES_encrypt
                {
                &comment("");
                &comment("Round $i");
-               &D_ENCRYPT(15-$i,$L,$R,$i*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
+               &D_ENCRYPT(15-$i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx");
                &comment("");
                &comment("Round ".sprintf("%d",$i-1));
-               &D_ENCRYPT(15-$i+1,$R,$L,($i-1)*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx");
+               &D_ENCRYPT(15-$i+1,$R,$L,($i-1)*2,$trans,"eax","ebx","ecx","edx");
                }
 
        &set_label("end");
@@ -134,43 +138,36 @@ sub DES_encrypt
 
 sub D_ENCRYPT
        {
-       local($r,$L,$R,$S,$ks,$desSP,$u,$tmp1,$tmp2,$t)=@_;
+       local($r,$L,$R,$S,$trans,$u,$tmp1,$tmp2,$t)=@_;
 
-        &mov(  $u,             &DWP(&n2a($S*4),$ks,"",0));
+        &mov(  $u,             &DWP(&n2a($S*4),$tmp2,"",0));
        &xor(   $tmp1,          $tmp1);
-        &mov(  $t,             &DWP(&n2a(($S+1)*4),$ks,"",0));
+        &mov(  $t,             &DWP(&n2a(($S+1)*4),$tmp2,"",0));
        &xor(   $u,             $R);
+       &xor(   $tmp2,          $tmp2);
         &xor(  $t,             $R);
        &and(   $u,             "0xfcfcfcfc"    );
         &and(  $t,             "0xcfcfcfcf"    );
        &movb(  &LB($tmp1),     &LB($u) );
         &movb( &LB($tmp2),     &HB($u) );
        &rotr(  $t,             4               );
-       &mov(   $ks,            &DWP("      $desSP",$tmp1,"",0));
+       &xor(   $L,             &DWP("     ",$trans,$tmp1,0));
         &movb( &LB($tmp1),     &LB($t) );
-       &xor(   $L,             $ks);
-        &mov(  $ks,            &DWP("0x200+$desSP",$tmp2,"",0));
-       &xor(   $L,             $ks); ######
+        &xor(  $L,             &DWP("0x200",$trans,$tmp2,0));
         &movb( &LB($tmp2),     &HB($t) );
        &shr(   $u,             16);
-        &mov(  $ks,            &DWP("0x100+$desSP",$tmp1,"",0));
-       &xor(   $L,             $ks); ######
+        &xor(  $L,             &DWP("0x100",$trans,$tmp1,0));
         &movb( &LB($tmp1),     &HB($u) );
        &shr(   $t,             16);
-        &mov(  $ks,            &DWP("0x300+$desSP",$tmp2,"",0));
-       &xor(   $L,             $ks);
-        &mov(  $ks,            &wparam(1)      );
+        &xor(  $L,             &DWP("0x300",$trans,$tmp2,0));
        &movb(  &LB($tmp2),     &HB($t) );
         &and(  $u,             "0xff"  );
        &and(   $t,             "0xff"  );
-        &mov(  $tmp1,          &DWP("0x600+$desSP",$tmp1,"",0));
-       &xor(   $L,             $tmp1);
-        &mov(  $tmp1,          &DWP("0x700+$desSP",$tmp2,"",0));
-       &xor(   $L,             $tmp1);
-        &mov(  $tmp1,          &DWP("0x400+$desSP",$u,"",0));
-       &xor(   $L,             $tmp1);
-        &mov(  $tmp1,          &DWP("0x500+$desSP",$t,"",0));
-       &xor(   $L,             $tmp1);
+        &xor(  $L,             &DWP("0x600",$trans,$tmp1,0));
+        &xor(  $L,             &DWP("0x700",$trans,$tmp2,0));
+       &mov(   $tmp2,          &wparam(1)      );
+        &xor(  $L,             &DWP("0x400",$trans,$u,0));
+        &xor(  $L,             &DWP("0x500",$trans,$t,0));
        }
 
 sub n2a
index 0145c4f..22149c6 100644 (file)
@@ -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);
        
index 2064523..5229afe 100644 (file)
@@ -363,3 +363,5 @@ sub out1p
 
        push(@out,"\t$name\t ".&conv($p1)."\n");
        }
+
+sub main'blindpop { &out1("pop",@_); }
index 519d8a5..819151c 100644 (file)
@@ -340,3 +340,5 @@ sub out1p
 
        push(@out,"\t$name\t ".&conv($p1)."\n");
        }
+
+sub main'blindpop { &out1("pop",@_); }
index 9ceabf0..922d1a2 100644 (file)
@@ -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",@_); }