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 23cb121..82538a9 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 78b1f94..b6dfcbd 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 348bf2d..e71050b 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 d4066e8..c53c9bc 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).