From c85c5c408af0996daa5f807c488f921e7e7ad524 Mon Sep 17 00:00:00 2001 From: Andy Polyakov Date: Thu, 9 Sep 2004 14:50:32 +0000 Subject: x86 assembler updates: more instructions, new OPENSSL_instrument_halt [for DJGPP]... --- crypto/perlasm/x86ms.pl | 6 ++++-- crypto/perlasm/x86nasm.pl | 6 ++++-- crypto/perlasm/x86unix.pl | 6 ++++-- crypto/x86cpuid.pl | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/crypto/perlasm/x86ms.pl b/crypto/perlasm/x86ms.pl index 1de1277920..3764760585 100644 --- a/crypto/perlasm/x86ms.pl +++ b/crypto/perlasm/x86ms.pl @@ -133,6 +133,7 @@ sub main'xorb { &out2("xor",@_); } sub main'add { &out2("add",@_); } sub main'adc { &out2("adc",@_); } sub main'sub { &out2("sub",@_); } +sub main'sbb { &out2("sbb",@_); } sub main'rotl { &out2("rol",@_); } sub main'rotr { &out2("ror",@_); } sub main'exch { &out2("xchg",@_); } @@ -160,8 +161,8 @@ sub main'jne { &out1("jne",@_); } sub main'jno { &out1("jno",@_); } sub main'push { &out1("push",@_); $stack+=4; } sub main'pop { &out1("pop",@_); $stack-=4; } -sub main'pushf { &out0("pushf"); $stack+=4; } -sub main'popf { &out0("popf"); $stack-=4; } +sub main'pushf { &out0("pushfd"); $stack+=4; } +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]); } @@ -172,6 +173,7 @@ sub main'bt { &out2("bt",@_); } sub main'leave { &out0("leave"); } sub main'cpuid { &out0("DW\t0A20Fh"); } sub main'rdtsc { &out0("DW\t0310Fh"); } +sub main'halt { &out0("hlt"); } # SSE2 sub main'emms { &out0("emms"); } diff --git a/crypto/perlasm/x86nasm.pl b/crypto/perlasm/x86nasm.pl index b02de6452a..27080a0f83 100644 --- a/crypto/perlasm/x86nasm.pl +++ b/crypto/perlasm/x86nasm.pl @@ -147,6 +147,7 @@ sub main'xorb { &out2("xor",@_); } sub main'add { &out2("add",@_); } sub main'adc { &out2("adc",@_); } sub main'sub { &out2("sub",@_); } +sub main'sbb { &out2("sbb",@_); } sub main'rotl { &out2("rol",@_); } sub main'rotr { &out2("ror",@_); } sub main'exch { &out2("xchg",@_); } @@ -178,8 +179,8 @@ sub main'jno { &out1("jno $near",@_); } sub main'push { &out1("push",@_); $stack+=4; } sub main'pop { &out1("pop",@_); $stack-=4; } -sub main'pushf { &out0("pushf"); $stack+=4; } -sub main'popf { &out0("popf"); $stack-=4; } +sub main'pushf { &out0("pushfd"); $stack+=4; } +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]); } @@ -190,6 +191,7 @@ sub main'bt { &out2("bt",@_); } sub main'leave { &out0("leave"); } sub main'cpuid { &out0("cpuid"); } sub main'rdtsc { &out0("rdtsc"); } +sub main'halt { &out0("hlt"); } # SSE2 sub main'emms { &out0("emms"); } diff --git a/crypto/perlasm/x86unix.pl b/crypto/perlasm/x86unix.pl index c34cd74b7a..79c1abb99d 100644 --- a/crypto/perlasm/x86unix.pl +++ b/crypto/perlasm/x86unix.pl @@ -164,6 +164,7 @@ sub main'xorb { &out2("xorb",@_); } sub main'add { &out2("addl",@_); } sub main'adc { &out2("adcl",@_); } sub main'sub { &out2("subl",@_); } +sub main'sbb { &out2("sbbl",@_); } sub main'rotl { &out2("roll",@_); } sub main'rotr { &out2("rorl",@_); } sub main'exch { &out2("xchg",@_); } @@ -191,8 +192,8 @@ sub main'dec { &out1("decl",@_); } sub main'inc { &out1("incl",@_); } sub main'push { &out1("pushl",@_); $stack+=4; } sub main'pop { &out1("popl",@_); $stack-=4; } -sub main'pushf { &out0("pushf"); $stack+=4; } -sub main'popf { &out0("popf"); $stack-=4; } +sub main'pushf { &out0("pushfl"); $stack+=4; } +sub main'popf { &out0("popfl"); $stack-=4; } sub main'not { &out1("notl",@_); } sub main'call { my $pre=$under; foreach $i (%label) @@ -206,6 +207,7 @@ sub main'bt { &out2("btl",@_); } sub main'leave { &out0("leave"); } sub main'cpuid { &out0(".word\t0xa20f"); } sub main'rdtsc { &out0(".word\t0x310f"); } +sub main'halt { &out0("hlt"); } # SSE2 sub main'emms { &out0("emms"); } diff --git a/crypto/x86cpuid.pl b/crypto/x86cpuid.pl index da3e5bcaca..894c49c0a3 100644 --- a/crypto/x86cpuid.pl +++ b/crypto/x86cpuid.pl @@ -38,6 +38,40 @@ require "x86asm.pl"; &ret (); &function_end_B("OPENSSL_rdtsc"); +# This works in Ring 0 only [read DJGPP+MS-DOS+privileged DPMI host], +# but it's safe to call it on any [supported] 32-bit platform... +# Just check for [non-]zero return value... +&function_begin_B("OPENSSL_instrument_halt","EXTRN\t_OPENSSL_ia32cap_P:DWORD"); + &picmeup("ecx","OPENSSL_ia32cap_P"); + &bt (&DWP(0,"ecx"),4); + &jnc (&label("nohalt")); # no TSC + + &data_word(0x9058900e); # push %cs; pop %eax + &and ("eax",3); + &jnz (&label("nohalt")); # not enough privileges + + &pushf (); + &pop ("eax") + &bt ("eax",9); + &jnc (&label("nohalt")); # interrupts are disabled + + &rdtsc (); + &push ("edx"); + &push ("eax"); + &halt (); + &rdtsc (); + + &sub ("eax",&DWP(0,"esp")); + &sbb ("edx",&DWP(4,"esp")); + &add ("esp",8); + &ret (); + +&set_label("nohalt"); + &xor ("eax","eax"); + &xor ("edx","edx"); + &ret (); +&function_end_B("OPENSSL_instrument_halt"); + &initseg("OPENSSL_cpuid_setup"); &asm_finish(); -- cgit v1.2.3