Support for indirect calls in x86 assembler modules.
authorAndy Polyakov <appro@openssl.org>
Tue, 6 Dec 2005 18:43:59 +0000 (18:43 +0000)
committerAndy Polyakov <appro@openssl.org>
Tue, 6 Dec 2005 18:43:59 +0000 (18:43 +0000)
crypto/perlasm/x86ms.pl
crypto/perlasm/x86nasm.pl
crypto/perlasm/x86unix.pl
crypto/x86cpuid.pl

index 23cb121e266056f1054d39215134627f5846c275..82538a9a9af8a5d421346a9a7dd65e0375215fe9 100644 (file)
@@ -172,6 +172,7 @@ sub main'popf       { &out0("popfd"); $stack-=4; }
 sub main'bswap { &out1("bswap",@_); &using486(); }
 sub main'not   { &out1("not",@_); }
 sub main'call  { &out1("call",($_[0]=~/^\$L/?'':'_').$_[0]); }
+sub main'call_ptr { &out1p("call",@_); }
 sub main'ret   { &out0("ret"); }
 sub main'nop   { &out0("nop"); }
 sub main'test  { &out2("test",@_); }
@@ -436,7 +437,7 @@ sub out1p
        local($name,$p1)=@_;
        local($l,$t);
 
-       push(@out,"\t$name\t ".&conv($p1)."\n");
+       push(@out,"\t$name\t".&conv($p1)."\n");
        }
 
 sub main'picmeup
@@ -452,10 +453,10 @@ sub main'initseg
        local($f)=@_;
        local($tmp)=<<___;
 OPTION DOTNAME
-.CRT\$XIU      SEGMENT DWORD PUBLIC 'DATA'
+.CRT\$XCU      SEGMENT DWORD PUBLIC 'DATA'
 EXTRN  _$f:NEAR
 DD     _$f
-.CRT\$XIU      ENDS
+.CRT\$XCU      ENDS
 ___
        push(@out,$tmp);
        }
index 78b1f94c076b736b3c71c913a4e82ef7e4da9aa2..b6dfcbdf02c66ba442e95d576c201a1de8788bac 100644 (file)
@@ -184,6 +184,7 @@ sub main'popf       { &out0("popfd"); $stack-=4; }
 sub main'bswap { &out1("bswap",@_); &using486(); }
 sub main'not   { &out1("not",@_); }
 sub main'call  { &out1("call",($_[0]=~/^\@L/?'':$under).$_[0]); }
+sub main'call_ptr { &out1p("call",@_); }
 sub main'ret   { &out0("ret"); }
 sub main'nop   { &out0("nop"); }
 sub main'test  { &out2("test",@_); }
@@ -422,7 +423,7 @@ sub out1p
        my($name,$p1)=@_;
        my($l,$t);
 
-       push(@out,"\t$name\t ".&conv($p1)."\n");
+       push(@out,"\t$name\t".&conv($p1)."\n");
        }
 
 sub main'picmeup
@@ -439,7 +440,7 @@ sub main'initseg
        if ($main'win32)
                {
                local($tmp)=<<___;
-segment        .CRT\$XIU data
+segment        .CRT\$XCU data
 extern $under$f
 DD     $under$f
 ___
index 348bf2d3574285d6d102a5d3d9922d39f43f9843..e71050b6bcb512b4f16bdc11b4fd617fd5f32028 100644 (file)
@@ -200,6 +200,7 @@ sub main'call       {       my $pre=$under;
                        { if ($label{$i} eq $_[0]) { $pre=''; last; } }
                        &out1("call",$pre.$_[0]);
                }
+sub main'call_ptr { &out1p("call",@_); }
 sub main'ret   { &out0("ret"); }
 sub main'nop   { &out0("nop"); }
 sub main'test  { &out2("testl",@_); }
index d4066e8858270217b6e4f1969c14004d9f2d203c..c53c9bc9980f6c696eb304713d2b79b5a01822e0 100644 (file)
@@ -183,7 +183,7 @@ for (@ARGV) { $sse2=1 if (/-DOPENSSL_IA32_SSE2/); }
                &mov    ("eax",&DWP(12+$i*4,"ebp"));
                &mov    (&DWP(0+$i*4,"esp"),"eax");
                }
-       &call   (&DWP(8,"ebp"));# make the call...
+       &call_ptr       (&DWP(8,"ebp"));# make the call...
        &mov    ("esp","ebp");  # ... and just restore the stack pointer
                                # without paying attention to what we called,
                                # (__cdecl *func) or (__stdcall *one).