about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorserpilliere <serpilliere@users.noreply.github.com>2017-04-24 18:42:37 +0200
committerGitHub <noreply@github.com>2017-04-24 18:42:37 +0200
commit860aba480c8a71e06154454f2957593856613af2 (patch)
tree60c942a77ef3b9e247ea3fb9cf6cedc9fda6b763
parent7ce0b4f473b2830ccc4d720455ba62c438e973c0 (diff)
parent001e2b61406702c7ace4785d63a6055899693705 (diff)
downloadmiasm-860aba480c8a71e06154454f2957593856613af2.tar.gz
miasm-860aba480c8a71e06154454f2957593856613af2.zip
Merge pull request #539 from commial/feature/prepare-stdcall-x86_64
Feature/prepare stdcall x86 64
Diffstat (limited to '')
-rw-r--r--miasm2/arch/x86/jit.py15
1 files changed, 13 insertions, 2 deletions
diff --git a/miasm2/arch/x86/jit.py b/miasm2/arch/x86/jit.py
index e64c610b..1329d7a4 100644
--- a/miasm2/arch/x86/jit.py
+++ b/miasm2/arch/x86/jit.py
@@ -152,12 +152,12 @@ class jitter_x86_32(jitter):
 
     def func_prepare_fastcall(self, ret_addr, *args):
         args_regs = ['ECX', 'EDX']
-        self.push_uint32_t(ret_addr)
         for i in xrange(min(len(args), len(args_regs))):
             setattr(self.cpu, args_regs[i], args[i])
         remaining_args = args[len(args_regs):]
         for arg in reversed(remaining_args):
             self.push_uint32_t(arg)
+        self.push_uint32_t(ret_addr)
 
     def get_arg_n_fastcall(self, index):
         args_regs = ['ECX', 'EDX']
@@ -171,6 +171,7 @@ class jitter_x86_64(jitter):
 
     C_Gen = x86_64_CGen
     args_regs_systemv = ['RDI', 'RSI', 'RDX', 'RCX', 'R8', 'R9']
+    args_regs_stdcall = ['RCX', 'RDX', 'R8', 'R9']
 
     def __init__(self, *args, **kwargs):
         sp = asmblock.AsmSymbolPool()
@@ -205,7 +206,7 @@ class jitter_x86_64(jitter):
     # stdcall
     @named_arguments
     def func_args_stdcall(self, n_args):
-        args_regs = ['RCX', 'RDX', 'R8', 'R9']
+        args_regs = self.args_regs_stdcall
         ret_ad = self.pop_uint64_t()
         args = []
         for i in xrange(min(n_args, 4)):
@@ -214,6 +215,15 @@ class jitter_x86_64(jitter):
             args.append(self.get_stack_arg(i))
         return ret_ad, args
 
+    def func_prepare_stdcall(self, ret_addr, *args):
+        args_regs = self.args_regs_stdcall
+        for i in xrange(min(len(args), len(args_regs))):
+            setattr(self.cpu, args_regs[i], args[i])
+        remaining_args = args[len(args_regs):]
+        for arg in reversed(remaining_args):
+            self.push_uint64_t(arg)
+        self.push_uint64_t(ret_addr)
+
     def func_ret_stdcall(self, ret_addr, ret_value=None):
         self.pc = self.cpu.RIP = ret_addr
         if ret_value is not None:
@@ -223,6 +233,7 @@ class jitter_x86_64(jitter):
     # cdecl
     func_args_cdecl = func_args_stdcall
     func_ret_cdecl = func_ret_stdcall
+    func_prepare_cdecl = func_prepare_stdcall
 
     # System V