diff options
Diffstat (limited to 'src/miasm/arch/aarch64/jit.py')
| -rw-r--r-- | src/miasm/arch/aarch64/jit.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/miasm/arch/aarch64/jit.py b/src/miasm/arch/aarch64/jit.py new file mode 100644 index 00000000..f71ecae4 --- /dev/null +++ b/src/miasm/arch/aarch64/jit.py @@ -0,0 +1,79 @@ +from builtins import range +import logging + +from miasm.jitter.jitload import Jitter, named_arguments +from miasm.core.utils import pck64, upck64 +from miasm.arch.aarch64.sem import Lifter_Aarch64b, Lifter_Aarch64l + +log = logging.getLogger('jit_aarch64') +hnd = logging.StreamHandler() +hnd.setFormatter(logging.Formatter("[%(levelname)-8s]: %(message)s")) +log.addHandler(hnd) +log.setLevel(logging.CRITICAL) + +class jitter_aarch64l(Jitter): + max_reg_arg = 8 + + def __init__(self, loc_db, *args, **kwargs): + Jitter.__init__(self, Lifter_Aarch64l(loc_db), *args, **kwargs) + self.vm.set_little_endian() + + def push_uint64_t(self, value): + self.cpu.SP -= 8 + self.vm.set_mem(self.cpu.SP, pck64(value)) + + def pop_uint64_t(self): + value = self.vm.get_u64(self.cpu.SP) + self.cpu.SP += 8 + return value + + def get_stack_arg(self, index): + return self.vm.get_u64(self.cpu.SP + 8 * index) + + # calling conventions + + @named_arguments + def func_args_stdcall(self, n_args): + args = [] + for i in range(min(n_args, self.max_reg_arg)): + args.append(getattr(self.cpu, 'X%d' % i)) + for i in range(max(0, n_args - self.max_reg_arg)): + args.append(self.get_stack_arg(i)) + ret_ad = self.cpu.LR + 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.X0 = ret_value + return True + + def get_arg_n_stdcall(self, index): + if index < self.max_reg_arg: + arg = self.cpu.get_gpreg()['X%d' % index] + else: + arg = self.get_stack_arg(index - self.max_reg_arg) + return arg + + def func_prepare_stdcall(self, ret_addr, *args): + for index in range(min(len(args), 4)): + setattr(self.cpu, 'X%d' % index, args[index]) + for index in range(4, len(args)): + self.vm.set_mem(self.cpu.SP + 8 * (index - 4), pck64(args[index])) + self.cpu.LR = ret_addr + + func_args_systemv = func_args_stdcall + func_ret_systemv = func_ret_stdcall + get_arg_n_systemv = get_arg_n_stdcall + func_prepare_systemv = func_prepare_stdcall + + def init_run(self, *args, **kwargs): + Jitter.init_run(self, *args, **kwargs) + self.cpu.PC = self.pc + + +class jitter_aarch64b(jitter_aarch64l): + + def __init__(self, loc_db, *args, **kwargs): + Jitter.__init__(self, Lifter_Aarch64b(loc_db), *args, **kwargs) + self.vm.set_big_endian() |