about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/jitter/jitload.py19
-rw-r--r--miasm2/jitter/os_dep/linux_stdlib.py20
2 files changed, 24 insertions, 15 deletions
diff --git a/miasm2/jitter/jitload.py b/miasm2/jitter/jitload.py
index b597e5f4..8313c63c 100644
--- a/miasm2/jitter/jitload.py
+++ b/miasm2/jitter/jitload.py
@@ -965,21 +965,30 @@ class jitter_arm(jitter):
 
     # calling conventions
 
-    def func_args_fastcall(self, n_args):
+    def func_args_stdcall(self, n_args):
         args = []
         for i in xrange(min(n_args, 4)):
             args.append(self.cpu.vm_get_gpreg()['R%d' % i])
         for i in xrange(max(0, n_args - 4)):
             args.append(self.get_stack_arg(i))
-        log.debug('%s %s' % (whoami(), [hex(x) for x in args]))
-        return args
 
-    def func_ret_fastcall(self, ret_value=None):
-        self.pc = self.cpu.PC = self.cpu.LR
+        ret_ad = self.cpu.LR
+        log.debug('%s %s %s' % (whoami(), hex(ret_ad), [hex(x) for x in args]))
+        return ret_ad, args
+
+    def func_ret_stdcall(self, ret_addr, ret_value=None):
+        self.pc = self.cpu.PC = ret_addr
         if ret_value is not None:
             self.cpu.R0 = ret_value
         return True
 
+    def get_arg_n_stdcall(self, n):
+        if n < 4:
+            arg = self.cpu.vm_get_gpreg()['R%d' % n]
+        else:
+            arg = self.get_stack_arg(n-4)
+        return arg
+
     def add_lib_handler(self, libs):
         from miasm2.jitter.os_dep import linux_stdlib
         for offset, fname in libs.fad2cname.iteritems():
diff --git a/miasm2/jitter/os_dep/linux_stdlib.py b/miasm2/jitter/os_dep/linux_stdlib.py
index 0a1e0bfb..50208b93 100644
--- a/miasm2/jitter/os_dep/linux_stdlib.py
+++ b/miasm2/jitter/os_dep/linux_stdlib.py
@@ -12,9 +12,9 @@ def xxx_isprint(jitter):
 
     checks for any printable character including space.
     '''
-    c,  = jitter.func_args_fastcall(1)
+    ret_addr, (c,)  = jitter.func_args_stdcall(1)
     ret = chr(c & 0xFF) in printable and 1 or 0
-    return jitter.func_ret_fastcall(ret)
+    return jitter.func_ret_stdcall(ret_addr, ret)
 
 
 def xxx_memcpy(jitter):
@@ -24,9 +24,9 @@ def xxx_memcpy(jitter):
 
     copies n bytes from memory area src to memory area dest.
     '''
-    dest, src, n, = jitter.func_args_fastcall(3)
+    ret_addr, (dest, src, n) = jitter.func_args_stdcall(3)
     jitter.vm.vm_set_mem(dest, jitter.vm.vm_get_mem(src, n))
-    return jitter.func_ret_fastcall(dest)
+    return jitter.func_ret_stdcall(ret_addr, dest)
 
 
 def xxx_puts(jitter):
@@ -36,7 +36,7 @@ def xxx_puts(jitter):
 
     writes the string s and a trailing newline to stdout.
     '''
-    s, = jitter.func_args_fastcall(1)
+    ret_addr, (s,) = jitter.func_args_stdcall(1)
     while True:
         c = jitter.vm.vm_get_mem(s, 1)
         s += 1
@@ -44,7 +44,7 @@ def xxx_puts(jitter):
             break
         stdout.write(c)
     stdout.write('\n')
-    return jitter.func_ret_fastcall(1)
+    return jitter.func_ret_stdcall(ret_addr, 1)
 
 
 def xxx_snprintf(jitter):
@@ -54,8 +54,8 @@ def xxx_snprintf(jitter):
 
     writes to string str according to format format and at most size bytes.
     '''
-    str, size, format, = jitter.func_args_fastcall(3)
-    curarg, output = 4, ''
+    ret_addr, (str, size, format) = jitter.func_args_stdcall(3)
+    curarg, output = 3, ''
     while True:
         c = jitter.vm.vm_get_mem(format, 1)
         format += 1
@@ -69,10 +69,10 @@ def xxx_snprintf(jitter):
                 token += c
                 if c in '%cdfsux':
                     break
-            c = token % jitter.func_args_fastcall(curarg)[-1]
+            c = token % jitter.get_arg_n_stdcall(curarg)
             curarg += 1
         output += c
     output = output[:size - 1]
     ret = len(output)
     jitter.vm.vm_set_mem(str, output + '\x00')
-    return jitter.func_ret_fastcall(ret)
+    return jitter.func_ret_stdcall(ret_addr, ret)