diff options
Diffstat (limited to 'miasm2')
| -rw-r--r-- | miasm2/arch/x86/sem.py | 13 | ||||
| -rw-r--r-- | miasm2/jitter/arch/JitCore_x86.c | 3 | ||||
| -rw-r--r-- | miasm2/jitter/llvmconvert.py | 30 |
3 files changed, 42 insertions, 4 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index 152208d4..ea5830e3 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -1732,9 +1732,11 @@ def float_pop(avoid_flt=None, popcount=1): if avoid_flt != float_list[i]: e.append(m2_expr.ExprAff(float_list[i], float_list[i + popcount])) + fill_value = m2_expr.ExprOp("int_64_to_double", + m2_expr.ExprInt(0, float_list[i].size)) for i in xrange(8 - popcount, 8): e.append(m2_expr.ExprAff(float_list[i], - m2_expr.ExprInt(0, float_list[i].size))) + fill_value)) e.append( m2_expr.ExprAff(float_stack_ptr, float_stack_ptr - m2_expr.ExprInt(popcount, 3))) @@ -2906,13 +2908,20 @@ def bittest_get(a, b): b_mask = {16: 4, 32: 5, 64: 6} b_decal = {16: 1, 32: 3, 64: 7} ptr = a.arg + segm = a.is_op_segm() + if segm: + ptr = ptr.args[1] + off_bit = b.zeroExtend( a.size) & m2_expr.ExprInt((1 << b_mask[a.size]) - 1, a.size) off_byte = ((b.zeroExtend(ptr.size) >> m2_expr.ExprInt(3, ptr.size)) & m2_expr.ExprInt(((1 << a.size) - 1) ^ b_decal[a.size], ptr.size)) - d = m2_expr.ExprMem(ptr + off_byte, a.size) + addr = ptr + off_byte + if segm: + addr = m2_expr.ExprOp("segm", a.arg.args[0], addr) + d = m2_expr.ExprMem(addr, a.size) else: off_bit = m2_expr.ExprOp('&', b, m2_expr.ExprInt(a.size - 1, a.size)) d = a diff --git a/miasm2/jitter/arch/JitCore_x86.c b/miasm2/jitter/arch/JitCore_x86.c index 66c3fb56..461e2224 100644 --- a/miasm2/jitter/arch/JitCore_x86.c +++ b/miasm2/jitter/arch/JitCore_x86.c @@ -603,6 +603,9 @@ PyObject* get_gpreg_offset_all(void) get_reg_off(exception_flags); get_reg_off(float_stack_ptr); + get_reg_off(reg_float_cs); + get_reg_off(reg_float_eip); + get_reg_off(reg_float_control); return dict; } diff --git a/miasm2/jitter/llvmconvert.py b/miasm2/jitter/llvmconvert.py index 08b1986b..cfe89059 100644 --- a/miasm2/jitter/llvmconvert.py +++ b/miasm2/jitter/llvmconvert.py @@ -228,6 +228,9 @@ class LLVMContext_JIT(LLVMContext): "args": [p8, itype, itype]}}) + self.add_fc({"cpuid": {"ret": itype, + "args": [itype, + itype]}}) for k in [8, 16]: self.add_fc({"bcdadd_%s" % k: {"ret": LLVMType.IntType(k), @@ -327,6 +330,7 @@ class LLVMFunction(): # Operation translation ## Basics op_translate = {'parity': 'parity', + 'cpuid': 'cpuid', } ## Add the size as first argument op_translate_with_size = {'<<<': 'rot_left', @@ -418,9 +422,13 @@ class LLVMFunction(): ptr = builder.gep(self.local_vars["vmcpu"], [llvm_ir.Constant(LLVMType.IntType(), offset)]) - int_size = LLVMType.IntType(expr.size) + regs = self.llvm_context.ir_arch.arch.regs + if hasattr(regs, "float_list") and expr in regs.float_list: + pointee_type = llvm_ir.DoubleType() + else: + pointee_type = LLVMType.IntType(expr.size) ptr_casted = builder.bitcast(ptr, - llvm_ir.PointerType(int_size)) + llvm_ir.PointerType(pointee_type)) # Store in cache self.local_vars_pointers[name] = ptr_casted @@ -702,6 +710,20 @@ class LLVMFunction(): self.update_cache(expr, ret) return ret + if op in ["int_16_to_double", "int_32_to_double", "int_64_to_double", + "mem_16_to_double", "mem_32_to_double", "mem_64_to_double"]: + arg = self.add_ir(expr.args[0]) + ret = builder.uitofp(arg, llvm_ir.DoubleType()) + self.update_cache(expr, ret) + return ret + + if op in ["double_to_int_16", "double_to_int_32", "double_to_int_64", + "double_to_mem_16", "double_to_mem_32", "double_to_mem_64"]: + arg = self.add_ir(expr.args[0]) + ret = builder.fptoui(arg, llvm_ir.IntType(expr.size)) + self.update_cache(expr, ret) + return ret + if len(expr.args) > 1: if op == "*": @@ -718,6 +740,10 @@ class LLVMFunction(): callback = builder.urem elif op == "/": callback = builder.udiv + elif op == "fadd": + callback = builder.fadd + elif op == "fdiv": + callback = builder.fdiv else: raise NotImplementedError('Unknown op: %s' % op) |