コード例 #1
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
 def _(bs):
     for i in xrange(bs.flow.stack[-1].size):
         bs.code += isa.pop(registers.rax)
     assert bs.flow.stack.pop() is arg_types[0]
     for i in xrange(bs.flow.stack[-1].size):
         bs.code += isa.pop(registers.rax)
     assert bs.flow.stack.pop() is self
     bs.code += isa.push(arg_types[0].id)
     bs.flow.stack.append(type_impl.Int)
コード例 #2
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
 def _(bs):
     for i in xrange(bs.flow.stack[-1].size):
         bs.code += isa.pop(registers.rax)
     assert bs.flow.stack.pop() is arg_types[0]
     for i in xrange(bs.flow.stack[-1].size):
         bs.code += isa.pop(registers.rax)
     assert bs.flow.stack.pop() is self
     bs.code += isa.push(arg_types[0].id)
     bs.flow.stack.append(type_impl.Int)
コード例 #3
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
        def _(bs):
            assert bs.flow.stack.pop() is type_impl.Int
            bs.code += isa.pop(registers.rbx)
            assert bs.flow.stack.pop() is self
            bs.code += isa.pop(registers.rax)

            bs.code += isa.shl(registers.rbx, 3)
            bs.code += isa.add(registers.rax, registers.rbx)

            bs.code += isa.push(MemRef(registers.rax))
            bs.flow.stack.append(type_impl.Int)
コード例 #4
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
        def _(bs):
            assert bs.flow.stack.pop() is type_impl.Int
            bs.code += isa.pop(registers.rbx)
            assert bs.flow.stack.pop() is self
            bs.code += isa.pop(registers.rax)

            bs.code += isa.shl(registers.rbx, 3)
            bs.code += isa.add(registers.rax, registers.rbx)

            bs.code += isa.push(MemRef(registers.rax))
            bs.flow.stack.append(type_impl.Int)
コード例 #5
0
ファイル: main.py プロジェクト: forrestv/pyable
 def _(bs):
     assert bs.flow.stack[-1] is type_impl.Str, list(bs.flow.stack)
     bs.flow.stack.pop()
     bs.code += isa.mov(registers.rax, util.print_string_addr)
     bs.code += isa.pop(registers.rdi)
     bs.code += isa.call(registers.rax)
     bs.code += isa.mov(registers.rax, util.print_nl_addr)
     bs.code += isa.call(registers.rax)
     bs.code += isa.mov(registers.rsp, registers.rbp)
     bs.code += isa.pop(registers.rbp)
     bs.code += isa.ret()
コード例 #6
0
ファイル: main.py プロジェクト: forrestv/pyable
 def _(bs):
     assert bs.flow.stack[-1] is type_impl.Str, list(bs.flow.stack)
     bs.flow.stack.pop()
     bs.code += isa.mov(registers.rax, util.print_string_addr)
     bs.code += isa.pop(registers.rdi)
     bs.code += isa.call(registers.rax)
     bs.code += isa.mov(registers.rax, util.print_nl_addr)
     bs.code += isa.call(registers.rax)
     bs.code += isa.mov(registers.rsp, registers.rbp)
     bs.code += isa.pop(registers.rbp)
     bs.code += isa.ret()
コード例 #7
0
ファイル: myctypes.py プロジェクト: forrestv/pyable
 def _(bs):
     assert bs.flow.stack.pop() is type_impl.Int
     bs.code += isa.pop(registers.rcx)
     assert bs.flow.stack.pop() is self
     bs.code += isa.pop(registers.rbx)
     
     bs.code += isa.add(registers.rbx, registers.rcx)
     
     bs.code += isa.mov(regsisters.rax, 0)
     bs.code += isa.mov(registers.ax, MemRef(registers.rbx, data_size=8))
     bs.code += isa.shl(registers.rax, 8)
     bs.code += isa.mov(registers.ax, 2 * 1 + 1)
     
     bs.flow.stack.append(type_impl.Str)
コード例 #8
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
        def _(bs):
            assert bs.flow.stack.pop() is type_impl.Int
            bs.code += isa.pop(registers.rcx)
            assert bs.flow.stack.pop() is type_impl.Int
            bs.code += isa.pop(registers.rbx)
            assert bs.flow.stack.pop() is self
            bs.code += isa.pop(registers.rax)

            bs.code += isa.shl(registers.rbx, 3)
            bs.code += isa.add(registers.rax, registers.rbx)

            bs.code += isa.mov(MemRef(registers.rax), registers.rcx)

            type_impl.NoneType.load()(bs)
コード例 #9
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
        def _(bs):
            assert bs.flow.stack.pop() is type_impl.Int
            bs.code += isa.pop(registers.rcx)
            assert bs.flow.stack.pop() is type_impl.Int
            bs.code += isa.pop(registers.rbx)
            assert bs.flow.stack.pop() is self
            bs.code += isa.pop(registers.rax)

            bs.code += isa.shl(registers.rbx, 3)
            bs.code += isa.add(registers.rax, registers.rbx)

            bs.code += isa.mov(MemRef(registers.rax), registers.rcx)

            type_impl.NoneType.load()(bs)
コード例 #10
0
  def _synthesize_epilogue(self):
    """
    Restore the callee-save registers
    """

    # Pop callee-save regs and clean up the stack frame
    self._epilogue = [self.lbl_epilogue,
                      x86.pop(rbx, ignore_active = True),
                      x86.pop(r12, ignore_active = True),
                      x86.pop(r13, ignore_active = True),
                      x86.pop(r14, ignore_active = True),
                      x86.pop(r15, ignore_active = True),
                      x86.leave(ignore_active = True),
                      x86.ret(ignore_active = True)]
    return
コード例 #11
0
        def _(bs):
            assert bs.flow.stack.pop() is type_impl.Int
            bs.code += isa.pop(registers.rcx)
            assert bs.flow.stack.pop() is self
            bs.code += isa.pop(registers.rbx)

            bs.code += isa.add(registers.rbx, registers.rcx)

            bs.code += isa.mov(regsisters.rax, 0)
            bs.code += isa.mov(registers.ax, MemRef(registers.rbx,
                                                    data_size=8))
            bs.code += isa.shl(registers.rax, 8)
            bs.code += isa.mov(registers.ax, 2 * 1 + 1)

            bs.flow.stack.append(type_impl.Str)
コード例 #12
0
def get_asm_glue_old(dest_addr):
    program = BareProgram()
    code = program.get_stream()
    code += isa.mov(registers.rax, fake_int(dest_addr))
    code += isa.push(registers.r12)
    code += isa.mov(registers.r12, registers.rsp)
    code += isa.and_(registers.rsp, -16)
    code += isa.call(registers.rax)
    code += isa.mov(registers.rsp, registers.r12)
    code += isa.pop(registers.r12)
    code += isa.pop(registers.rax)
    code += isa.sub(registers.rax, patch_len)
    code += isa.jmp(registers.rax)
    program.add(code)
    program.cache_code()
    return program.render_code
コード例 #13
0
ファイル: util.py プロジェクト: forrestv/pyable
def unlift_noncached(bs, func, desc):
    #print desc
    @memoize
    def make_post(flow):
        return compiler.translate("unlift_post " + desc, flow, stack=list(bs.call_stack))
    
    def make_thingy(flow, data):
        return compiler.translate("unlift_thingy " + desc, flow, this=[
            func(data),
            lambda bs: add_redirection(bs.code, lambda rdi, flow=bs.flow.clone(): get_jmp(make_post(flow))),
            compiler.end,
        ])
    
    @called_from_asm
    def glue(rdi, flow=bs.flow.clone()):
        return make_thingy(flow, rdi)
    
    code = ctypes.CFUNCTYPE(ctypes.c_int64, ctypes.c_int64)(glue)
    
    bs.code += isa.pop(registers.rdi)
    bs.code += isa.mov(registers.rax, ctypes.cast(code, ctypes.c_void_p).value)
    bs.code += isa.mov(registers.r12, registers.rsp)
    bs.code += isa.and_(registers.rsp, -16)
    bs.code += isa.call(registers.rax)
    bs.code += isa.mov(registers.rsp, registers.r12)
    bs.code += isa.jmp(registers.rax)
    bs.this.append(compiler.end)
    
    bs.program.references.append(code)
コード例 #14
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
        def _(bs):
            "handler(rsp)"
            bs.code += isa.mov(registers.rdi, registers.rsp)
            bs.code += isa.mov(registers.r12, registers.rsp)
            bs.code += isa.and_(registers.rsp, -16)
            bs.code += isa.mov(registers.rax, ctypes.cast(handler_cfunc, ctypes.c_void_p).value)
            bs.code += isa.call(registers.rax)
            bs.code += isa.mov(registers.rsp, registers.r12)
            for arg in arg_types[::-1]:
                assert bs.flow.stack.pop() is arg
                for i in xrange(arg.size):
                    bs.code += isa.pop(registers.rbx)
            assert bs.flow.stack.pop() is self
            bs.code += isa.push(registers.rax)

            def _(value):
                def _(bs):
                    type = type_impl.id_to_type[value]
                    for i in xrange(type.size):
                        bs.code += isa.push(MemRef(ctypes.cast(self.return_area, ctypes.c_void_p).value + i))
                    bs.flow.stack.append(type)
                    assert bs.flow.stack[-1].size == 0

                return _

            util.unlift(bs, _, "PythonFunction.call")
コード例 #15
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
        def _(bs):
            "handler(rsp)"
            bs.code += isa.mov(registers.rdi, registers.rsp)
            bs.code += isa.mov(registers.r12, registers.rsp)
            bs.code += isa.and_(registers.rsp, -16)
            bs.code += isa.mov(
                registers.rax,
                ctypes.cast(handler_cfunc, ctypes.c_void_p).value)
            bs.code += isa.call(registers.rax)
            bs.code += isa.mov(registers.rsp, registers.r12)
            for arg in arg_types[::-1]:
                assert bs.flow.stack.pop() is arg
                for i in xrange(arg.size):
                    bs.code += isa.pop(registers.rbx)
            assert bs.flow.stack.pop() is self
            bs.code += isa.push(registers.rax)

            def _(value):
                def _(bs):
                    type = type_impl.id_to_type[value]
                    for i in xrange(type.size):
                        bs.code += isa.push(
                            MemRef(
                                ctypes.cast(self.return_area,
                                            ctypes.c_void_p).value + i))
                    bs.flow.stack.append(type)
                    assert bs.flow.stack[-1].size == 0

                return _

            util.unlift(bs, _, "PythonFunction.call")
コード例 #16
0
def CpuidAsmInit():

    import corepy.arch.x86_64.isa as x86
    import corepy.arch.x86_64.types.registers as reg
    import corepy.arch.x86_64.platform as env
    import corepy.arch.x86_64.lib.memory as mem

    global CpuidCode
    global CpuidProc
    global CpuidParams
    CpuidCode = env.InstructionStream()
    CpuidProc = env.Processor()
    CpuidParams = env.ExecParams()

    CpuidCode.add(x86.mov(reg.rax, mem.MemRef(reg.rbp, 16)))  # parameter 1
    CpuidCode.add(x86.mov(reg.rcx, mem.MemRef(reg.rbp, 24)))  # parameter 2
    CpuidCode.add(x86.mov(reg.rdi, mem.MemRef(reg.rbp, 32)))  # parameter 3

    CpuidCode.add(x86.push(reg.rax))  # save input parameter

    CpuidCode.add(x86.cpuid())

    CpuidCode.add(x86.mov(mem.MemRef(reg.edi, 0, data_size=32), reg.eax))
    CpuidCode.add(x86.mov(mem.MemRef(reg.edi, 4, data_size=32), reg.ebx))
    CpuidCode.add(x86.mov(mem.MemRef(reg.edi, 8, data_size=32), reg.ecx))
    CpuidCode.add(x86.mov(mem.MemRef(reg.edi, 12, data_size=32), reg.edx))

    CpuidCode.add(x86.pop(reg.rax))  # restore input parameter as return value
コード例 #17
0
 def _(bs):
     content = self.contents[attr]
     
     type, a = bs.flow.stack.pop2()
     #type = bs.flow.stack.pop()
     
     # we could use a watcher to modify the generated code to not require a memory access.
     skip = bs.program.get_unique_label()
     bs.code += isa.mov(registers.rax, ctypes.cast(content.id_container, ctypes.c_void_p).value)
     bs.code += isa.cmp(MemRef(registers.rax), type.id)
     bs.code += isa.je(skip)
     bs.code += isa.mov(registers.rax, ctypes.cast(content.type_setter, ctypes.c_void_p).value)
     bs.code += isa.mov(registers.rdi, type.id)
     bs.code += isa.mov(registers.r12, registers.rsp)
     bs.code += isa.and_(registers.rsp, -16)
     bs.code += isa.call(registers.rax)
     bs.code += isa.mov(registers.rsp, registers.r12)
     bs.code += skip
     
     #if type is not content.value.value: content.value.set(type)
     # i'm pretty sure we can do this - this code will immediately be executed after and this fits in with code generation
     # BUT things that use it before it have to be altered properly
     # right now they will just raise an error - render_code hasn't been defined
     # it should ignore this and wait for the asm code above to modify it.
     
     #print "storing", attr, self.desc, type, a, repr(content.container.raw)
     if type.size:
         bs.code += isa.mov(registers.rax, ctypes.cast(content.container, ctypes.c_void_p).value)
         for i in reversed(xrange(type.size)):
             bs.code += isa.pop(MemRef(registers.rax, 8 * i))
コード例 #18
0
ファイル: util.py プロジェクト: forrestv/pyable
def get_asm_glue_old(dest_addr):
    program = BareProgram()
    code = program.get_stream()
    code += isa.mov(registers.rax, fake_int(dest_addr))
    code += isa.push(registers.r12)
    code += isa.mov(registers.r12, registers.rsp)
    code += isa.and_(registers.rsp, -16)
    code += isa.call(registers.rax)
    code += isa.mov(registers.rsp, registers.r12)
    code += isa.pop(registers.r12)
    code += isa.pop(registers.rax)
    code += isa.sub(registers.rax, patch_len)
    code += isa.jmp(registers.rax)
    program.add(code)
    program.cache_code()
    return program.render_code
コード例 #19
0
ファイル: util.py プロジェクト: forrestv/pyable
def pop(bs, regs):
    res = []
    type = bs.flow.stack.pop()
    for i in xrange(type.size):
        reg = regs.pop()
        bs.code += isa.pop(reg)
        res.append(reg)
    return type, res
コード例 #20
0
ファイル: spre_linux_x86_64.py プロジェクト: forrestv/pyable
    def _synthesize_epilogue(self):
        """
    Restore the callee-save registers
    """

        # Pop callee-save regs and clean up the stack frame
        self._epilogue = [
            self.lbl_epilogue,
            x86.pop(rbx, ignore_active=True),
            x86.pop(r12, ignore_active=True),
            x86.pop(r13, ignore_active=True),
            x86.pop(r14, ignore_active=True),
            x86.pop(r15, ignore_active=True),
            x86.leave(ignore_active=True),
            x86.ret(ignore_active=True)
        ]
        return
コード例 #21
0
def pop(bs, regs):
    res = []
    type = bs.flow.stack.pop()
    for i in xrange(type.size):
        reg = regs.pop()
        bs.code += isa.pop(reg)
        res.append(reg)
    return type, res
コード例 #22
0
ファイル: myctypes.py プロジェクト: forrestv/pyable
 def _(bs):
     assert bs.flow.stack.pop() is type_impl.Int
     bs.code += isa.pop(registers.r14)
     assert bs.flow.stack.pop() is Raw
     bs.code += isa.pop(registers.r13)
     assert bs.flow.stack.pop() is self
     bs.code += isa.pop(registers.r12)
     
     bs.code += isa.shl(registers.r14, 3)
     
     bs.code += isa.mov(registers.rdi, registers.r12)
     bs.code += isa.mov(registers.rsi, registers.r13)
     bs.code += isa.mov(registers.rdx, registers.r14)
     bs.code += isa.mov(registers.rax, ctypes.cast(ctypes.memmove, ctypes.c_void_p).value)	
     bs.code += isa.call(registers.rax)
     
     bs.this.append(type_impl.NoneType.load())
コード例 #23
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
 def _(bs):
     assert bs.flow.stack.pop() is type_impl.Int
     assert bs.flow.stack.pop() is self
     bs.code += isa.pop(registers.rdi)
     bs.code += isa.shl(registers.rdi, 3)
     bs.code += isa.mov(registers.rax, util.malloc_addr)
     bs.code += isa.call(registers.rax)
     bs.code += isa.push(registers.rax)
     bs.flow.stack.append(Raw)
コード例 #24
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
 def _(bs):
     assert bs.flow.stack.pop() is type_impl.Int
     assert bs.flow.stack.pop() is self
     bs.code += isa.pop(registers.rdi)
     bs.code += isa.shl(registers.rdi, 3)
     bs.code += isa.mov(registers.rax, util.malloc_addr)
     bs.code += isa.call(registers.rax)
     bs.code += isa.push(registers.rax)
     bs.flow.stack.append(Raw)
コード例 #25
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
        def _(bs):
            assert bs.flow.stack.pop() is type_impl.Int
            bs.code += isa.pop(registers.r14)
            assert bs.flow.stack.pop() is Raw
            bs.code += isa.pop(registers.r13)
            assert bs.flow.stack.pop() is self
            bs.code += isa.pop(registers.r12)

            bs.code += isa.shl(registers.r14, 3)

            bs.code += isa.mov(registers.rdi, registers.r12)
            bs.code += isa.mov(registers.rsi, registers.r13)
            bs.code += isa.mov(registers.rdx, registers.r14)
            bs.code += isa.mov(
                registers.rax,
                ctypes.cast(ctypes.memmove, ctypes.c_void_p).value)
            bs.code += isa.call(registers.rax)

            bs.this.append(type_impl.NoneType.load())
コード例 #26
0
  def _synthesize_epilogue(self):
    """
    Save the caller-save registers
    """

    # Reset the epilogue
    self._epilogue = [self.lbl_epilogue]

    # Pop callee-save regs and clean up the stack frame
    self._epilogue.append(x86.pop(rbx, ignore_active = True))
    #self._epilogue.append(x86.pop(rsi, ignore_active = True))
    #self._epilogue.append(x86.pop(rdi, ignore_active = True))
    self._epilogue.append(x86.pop(r12, ignore_active = True))
    self._epilogue.append(x86.pop(r13, ignore_active = True))
    self._epilogue.append(x86.pop(r14, ignore_active = True))
    self._epilogue.append(x86.pop(r15, ignore_active = True))
    self._epilogue.append(x86.leave(ignore_active = True))
    self._epilogue.append(x86.ret(ignore_active = True))
    return
コード例 #27
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
        def _(bs):
            type = bs.flow.stack.pop()
            for i, reg in zip(xrange(type.size), [registers.r11, registers.r12, registers.r13, registers.r14]):
                bs.code += isa.pop(reg)
            assert bs.flow.stack.pop() is type_impl.Int
            bs.code += isa.pop(registers.rbx)
            assert bs.flow.stack.pop() is self
            bs.code += isa.pop(registers.rax)

            bs.code += isa.shl(registers.rbx, 3)
            bs.code += isa.add(registers.rax, registers.rbx)

            bs.code += isa.mov(MemRef(registers.rax), type.id)

            for i, reg in zip(xrange(type.size), [registers.r11, registers.r12, registers.r13, registers.r14]):
                bs.code += isa.mov(MemRef(registers.rax, i * 8 + 8), reg)

            bs.code += isa.push(1 + type.size)
            bs.flow.stack.append(type_impl.Int)
コード例 #28
0
ファイル: util.py プロジェクト: forrestv/pyable
 def _(bs):
     good = bs.program.get_unique_label()
     
     bs.code += isa.mov(registers.rax, data) # check if could be combined into cmp
     bs.code += isa.cmp(MemRef(registers.rsp), registers.rax)
     bs.code += isa.je(good)
     bs.code += isa.mov(registers.rdi, MemRef(registers.rsp))
     add_redirection(bs.code, lambda rdi, flow=bs.flow.clone(): get_jmp(make_thingy(flow, rdi)))
     bs.code += good
     
     bs.code += isa.pop(registers.rax)
     bs.this.append(func(data))
コード例 #29
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
        def _(bs):
            assert bs.flow.stack.pop() is type_impl.Int
            bs.code += isa.pop(registers.r13)
            assert bs.flow.stack.pop() is self
            bs.code += isa.pop(registers.r12)

            bs.code += isa.shl(registers.r13, 3)
            bs.code += isa.add(registers.r12, registers.r13)

            bs.code += isa.push(MemRef(registers.r12))

            def _(value):
                def _(bs):
                    type = type_impl.id_to_type[value]
                    for i in reversed(xrange(type.size)):
                        bs.code += isa.push(MemRef(registers.r12, i * 8 + 8))
                    bs.flow.stack.append(type)

                return _

            util.unlift(bs, _, "RawLoadObjectMeth.call")
コード例 #30
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
        def _(bs):
            assert bs.flow.stack.pop() is type_impl.Int
            bs.code += isa.pop(registers.r13)
            assert bs.flow.stack.pop() is self
            bs.code += isa.pop(registers.r12)

            bs.code += isa.shl(registers.r13, 3)
            bs.code += isa.add(registers.r12, registers.r13)

            bs.code += isa.push(MemRef(registers.r12))

            def _(value):
                def _(bs):
                    type = type_impl.id_to_type[value]
                    for i in reversed(xrange(type.size)):
                        bs.code += isa.push(MemRef(registers.r12, i * 8 + 8))
                    bs.flow.stack.append(type)

                return _

            util.unlift(bs, _, "RawLoadObjectMeth.call")
コード例 #31
0
 def getattr_raw(self, bs):
     bs.code += isa.pop(registers.r12)
     bs.code += isa.mov(registers.rdi, MemRef(registers.r12))
     bs.code += isa.add(registers.rdi, 8)
     bs.code += isa.mov(registers.rax, util.malloc_addr)
     bs.code += isa.call(registers.rax)
     bs.code += isa.push(registers.rax)
     bs.code += isa.mov(registers.rdi, registers.rax)
     bs.code += isa.mov(registers.rsi, registers.r12)
     bs.code += isa.mov(registers.rcx, MemRef(registers.r12))
     bs.code += isa.add(registers.rcx, 8)
     bs.code += isa.rep()
     bs.code += isa.movsb()
     bs.flow.stack.append(type_impl.Str)
コード例 #32
0
ファイル: myctypes.py プロジェクト: forrestv/pyable
 def getattr_raw(self, bs):
     bs.code += isa.pop(registers.r12)
     bs.code += isa.mov(registers.rdi, MemRef(registers.r12))
     bs.code += isa.add(registers.rdi, 8)
     bs.code += isa.mov(registers.rax, util.malloc_addr)
     bs.code += isa.call(registers.rax)
     bs.code += isa.push(registers.rax)
     bs.code += isa.mov(registers.rdi, registers.rax)
     bs.code += isa.mov(registers.rsi, registers.r12)
     bs.code += isa.mov(registers.rcx, MemRef(registers.r12))
     bs.code += isa.add(registers.rcx, 8)
     bs.code += isa.rep()
     bs.code += isa.movsb()
     bs.flow.stack.append(type_impl.Str)
コード例 #33
0
ファイル: mypyable.py プロジェクト: forrestv/pyable
        def _(bs):
            type = bs.flow.stack.pop()
            for i, reg in zip(
                    xrange(type.size),
                [registers.r11, registers.r12, registers.r13, registers.r14]):
                bs.code += isa.pop(reg)
            assert bs.flow.stack.pop() is type_impl.Int
            bs.code += isa.pop(registers.rbx)
            assert bs.flow.stack.pop() is self
            bs.code += isa.pop(registers.rax)

            bs.code += isa.shl(registers.rbx, 3)
            bs.code += isa.add(registers.rax, registers.rbx)

            bs.code += isa.mov(MemRef(registers.rax), type.id)

            for i, reg in zip(
                    xrange(type.size),
                [registers.r11, registers.r12, registers.r13, registers.r14]):
                bs.code += isa.mov(MemRef(registers.rax, i * 8 + 8), reg)

            bs.code += isa.push(1 + type.size)
            bs.flow.stack.append(type_impl.Int)
コード例 #34
0
ファイル: _MsrCode.py プロジェクト: melxman/UEFI-BIOS-Flasher
def MsrAsmInit():

    import corepy.arch.x86_64.isa as x86
    import corepy.arch.x86_64.types.registers as reg
    import corepy.arch.x86_64.lib.memory as mem

    # WrMsrAsm (EDX, EAX, ECX)
    # MSR[ECX] = EDX:EAX;
    global WrMsrAsm
    WrMsrAsm = env.InstructionStream()
    WrMsrAsm.add(x86.mov(reg.rdx, mem.MemRef(reg.rbp,
                                             16)))  # parameter 1, rdx, IN
    WrMsrAsm.add(x86.mov(reg.rax, mem.MemRef(reg.rbp,
                                             24)))  # parameter 2, rax, IN
    WrMsrAsm.add(x86.mov(reg.rcx, mem.MemRef(reg.rbp,
                                             32)))  # parameter 3, rcx, IN
    WrMsrAsm.add(x86.push(reg.rcx))
    WrMsrAsm.add(x86.wrmsr())
    WrMsrAsm.add(x86.pop(reg.rax))

    # RdMsrAsm (EDX, EAX, ECX)
    # EDX:EAX = MSR[ECX];
    global RdMsrAsm
    RdMsrAsm = env.InstructionStream()
    RdMsrAsm.add(x86.mov(reg.rdi, mem.MemRef(reg.rbp,
                                             16)))  # parameter 1, rdx, OUT
    RdMsrAsm.add(x86.mov(reg.rsi, mem.MemRef(reg.rbp,
                                             24)))  # parameter 2, rax, OUT
    RdMsrAsm.add(x86.mov(reg.rcx, mem.MemRef(reg.rbp,
                                             32)))  # parameter 3, rcx, IN
    WrMsrAsm.add(x86.push(reg.rcx))
    RdMsrAsm.add(x86.rdmsr())
    RdMsrAsm.add(x86.mov(mem.MemRef(reg.rdi),
                         reg.rdx))  # parameter 1, rdx, OUT
    RdMsrAsm.add(x86.mov(mem.MemRef(reg.rsi),
                         reg.rax))  # parameter 2, rax, OUT
    WrMsrAsm.add(x86.pop(reg.rax))
コード例 #35
0
        def _(bs):
            good = bs.program.get_unique_label()

            bs.code += isa.mov(registers.rax,
                               data)  # check if could be combined into cmp
            bs.code += isa.cmp(MemRef(registers.rsp), registers.rax)
            bs.code += isa.je(good)
            bs.code += isa.mov(registers.rdi, MemRef(registers.rsp))
            add_redirection(bs.code,
                            lambda rdi, flow=bs.flow.clone(): get_jmp(
                                make_thingy(flow, rdi)))
            bs.code += good

            bs.code += isa.pop(registers.rax)
            bs.this.append(func(data))
コード例 #36
0
ファイル: main.py プロジェクト: forrestv/pyable
def make_root():
    return compiler.translate("make_root", compiler.Flow(), this=[
        lambda bs: bs.code.add(isa.push(registers.rbp)),
        lambda bs: bs.code.add(isa.mov(registers.rbp, registers.rsp)),
        lambda bs: bs.flow.try_stack.append(uncaught_exception),
        #main_module.load(),
        #ast.Call(
        #    func=lambda bs: None,
        #    args=[],
        #    keywords=[],
        #    starargs=None,
        #    kwargs=None,
        #    ),
        tree.body,
        lambda bs: bs.code.add(isa.mov(registers.rsp, registers.rbp)),
        lambda bs: bs.code.add(isa.pop(registers.rbp)),
        lambda bs: bs.code.add(isa.ret()),
        compiler.end,
    ])
コード例 #37
0
ファイル: main.py プロジェクト: forrestv/pyable
def make_root():
    return compiler.translate(
        "make_root",
        compiler.Flow(),
        this=[
            lambda bs: bs.code.add(isa.push(registers.rbp)),
            lambda bs: bs.code.add(isa.mov(registers.rbp, registers.rsp)),
            lambda bs: bs.flow.try_stack.append(uncaught_exception),
            #main_module.load(),
            #ast.Call(
            #    func=lambda bs: None,
            #    args=[],
            #    keywords=[],
            #    starargs=None,
            #    kwargs=None,
            #    ),
            tree.body,
            lambda bs: bs.code.add(isa.mov(registers.rsp, registers.rbp)),
            lambda bs: bs.code.add(isa.pop(registers.rbp)),
            lambda bs: bs.code.add(isa.ret()),
            compiler.end,
        ])
コード例 #38
0
def unlift_noncached(bs, func, desc):
    #print desc
    @memoize
    def make_post(flow):
        return compiler.translate("unlift_post " + desc,
                                  flow,
                                  stack=list(bs.call_stack))

    def make_thingy(flow, data):
        return compiler.translate(
            "unlift_thingy " + desc,
            flow,
            this=[
                func(data),
                lambda bs: add_redirection(bs.code,
                                           lambda rdi, flow=bs.flow.clone():
                                           get_jmp(make_post(flow))),
                compiler.end,
            ])

    @called_from_asm
    def glue(rdi, flow=bs.flow.clone()):
        return make_thingy(flow, rdi)

    code = ctypes.CFUNCTYPE(ctypes.c_int64, ctypes.c_int64)(glue)

    bs.code += isa.pop(registers.rdi)
    bs.code += isa.mov(registers.rax, ctypes.cast(code, ctypes.c_void_p).value)
    bs.code += isa.mov(registers.r12, registers.rsp)
    bs.code += isa.and_(registers.rsp, -16)
    bs.code += isa.call(registers.rax)
    bs.code += isa.mov(registers.rsp, registers.r12)
    bs.code += isa.jmp(registers.rax)
    bs.this.append(compiler.end)

    bs.program.references.append(code)
コード例 #39
0
def Test():
    prgm = env.Program()
    code = prgm.get_stream()
    proc = env.Processor()
    params = env.ExecParams()
    params.p1 = 3

    lbl1 = prgm.get_label("lbl1")
    lbl2 = prgm.get_label("lbl2")

    code.add(x86.xor(prgm.gp_return, prgm.gp_return))

    code.add(x86.cmp(prgm.gp_return, 1))
    code.add(x86.jne(lbl1))

    code.add(x86.ud2())
    code.add(x86.ud2())

    code.add(lbl1)
    code.add(x86.cmp(prgm.gp_return, 1))
    code.add(x86.je(lbl2))
    code.add(x86.add(prgm.gp_return, 12))
    code.add(lbl2)

    prgm.add(code)
    #prgm.print_code(pro = True, epi = True, hex = True) 
    ret = proc.execute(prgm, mode = 'int')
    print "ret", ret
    assert(ret == 12)

    prgm.reset()
    code.reset()

    code.add(x86.xor(prgm.gp_return, prgm.gp_return))

    code.add(x86.cmp(prgm.gp_return, 1))
    code.add(x86.jne(28))

    code.add(x86.ud2())
    code.add(x86.ud2())

    code.add(x86.cmp(prgm.gp_return, 1))
    code.add(x86.je(37))
    code.add(x86.add(prgm.gp_return, 12))

    prgm.add(code)
    prgm.print_code(hex = True, pro = True, epi = True) 
    ret = proc.execute(prgm)
    print "ret", ret
    assert(ret == 12)

    prgm.reset()
    code.reset()

    call_lbl = prgm.get_label("call_fn")

    code.add(x86.xor(prgm.gp_return, prgm.gp_return))
    code.add(x86.call(call_lbl))
    code.add(x86.jmp(prgm.lbl_epilogue))
    code.add(x86.mov(prgm.gp_return, 75))
    code.add(x86.mov(prgm.gp_return, 42))
    code.add(call_lbl)
    code.add(x86.mov(prgm.gp_return, 15))
    code.add(x86.ret())

    prgm.add(code)
    prgm.print_code()
    ret = proc.execute(prgm, mode = 'int')
    print "ret", ret
    assert(ret == 15)


    prgm.reset()
    code.reset()

    fwd_lbl = prgm.get_label("FORWARD")
    bck_lbl = prgm.get_label("BACKWARD")

    code.add(x86.xor(prgm.gp_return, prgm.gp_return))
    code.add(bck_lbl)
    code.add(x86.cmp(prgm.gp_return, 1))
    code.add(x86.jne(fwd_lbl))
    r_foo = prgm.acquire_register()
    for i in xrange(0, 65):
      code.add(x86.pop(r_foo))
    prgm.release_register(r_foo)
    code.add(fwd_lbl)

    prgm.add(code)
    ret = proc.execute(prgm, mode = 'int')
    print "ret", ret
    assert(ret == 0)


    prgm.reset()
    code.reset()

    loop_lbl = prgm.get_label("LOOP")
    out_lbl = prgm.get_label("OUT")
    skip_lbl = prgm.get_label("SKIP")

    code.add(x86.xor(prgm.gp_return, prgm.gp_return))
    code.add(loop_lbl)
    r_foo = prgm.acquire_register()
    for i in range(0, 1):
      for i in xrange(0, 24):
        code.add(x86.add(r_foo, MemRef(rsp, 4)))

      code.add(x86.add(prgm.gp_return, 4))
      code.add(x86.cmp(prgm.gp_return, 20))
      code.add(x86.je(out_lbl))

      for i in xrange(0, 24):
        code.add(x86.add(r_foo, MemRef(rsp, 4)))

      code.add(x86.cmp(prgm.gp_return, 32))
      code.add(x86.jne(loop_lbl))

    code.add(out_lbl)

    code.add(x86.jmp(skip_lbl))
    for i in xrange(0, 2):
      code.add(x86.add(r_foo, MemRef(rsp, 4)))
    code.add(skip_lbl)

    prgm.release_register(r_foo)
    prgm.add(code)
    ret = proc.execute(prgm, mode = 'int')
    print "ret", ret
    assert(ret == 20)


    prgm.reset()
    code.reset()

    r_tmp = prgm.acquire_registers(2)

    loop_lbl = prgm.get_label("LOOP")
    else_lbl = prgm.get_label("ELSE")
    finish_lbl = prgm.get_label("finish")

    code.add(x86.mov(prgm.gp_return, 0))
    code.add(x86.mov(r_tmp[0], 0))

    code.add(loop_lbl)

    code.add(x86.add(prgm.gp_return, 1))
    code.add(x86.cmp(prgm.gp_return, 16))
    code.add(x86.jge(finish_lbl))

    code.add(x86.add(r_tmp[0], prgm.gp_return))
    code.add(x86.mov(r_tmp[1], r_tmp[0]))
    code.add(x86.and_(r_tmp[1], 0x1))
    code.add(x86.jnz(else_lbl))

    code.add(x86.add(r_tmp[0], 1))
    code.add(x86.jmp(loop_lbl))

    code.add(else_lbl)
    code.add(x86.add(r_tmp[0], r_tmp[1]))
    code.add(x86.jmp(loop_lbl))

    code.add(finish_lbl)
    code.add(x86.mov(prgm.gp_return, r_tmp[0]))

    prgm.release_registers(r_tmp)

    prgm.add(code)
    ret = proc.execute(prgm, mode = 'int')
    print "ret", ret
    assert(ret == 135)


    prgm.reset()
    code.reset()

    loop_lbl = prgm.get_label("LOOP")

    r_one = prgm.acquire_register()
    code.add(x86.xor(prgm.gp_return, prgm.gp_return))
    code.add(x86.xor(rcx, rcx))
    code.add(x86.mov(r_one, 1))

    code.add(loop_lbl)
    code.add(x86.inc(prgm.gp_return))
    code.add(x86.cmp(prgm.gp_return, 7))
    code.add(x86.cmove(rcx, r_one))
    code.add(x86.jrcxz(loop_lbl))

    prgm.release_register(r_one)

    prgm.add(code)
    prgm.print_code(hex = True)
    ret = proc.execute(prgm, mode = 'int')
    print "ret", ret
    assert(ret == 7)


    prgm.reset()
    code.reset()

    r_tmp = prgm.acquire_register()
    code.add(x86.mov(prgm.gp_return, rdi))
    code.add(x86.xor(r_tmp, r_tmp))
    code.add(x86.mov(r_tmp, -1))
    code.add(x86.mov(cl, 1))
    code.add(x86.shld(prgm.gp_return, r_tmp, cl))

    prgm.release_register(r_tmp)
    prgm.add(code)
    ret = proc.execute(prgm, params = params, mode = 'int')
    print "ret", ret
    assert(ret == 7)


    prgm.reset()
    code.reset()

    code.add(x86.add(eax, 200))
    code.add(x86.xor(eax, eax))
    code.add(x86.add(al, 32))
    code.add(x86.add(bl, 32))
    code.add(x86.xor(bl, bl))
    code.add(x86.mov(dil, al))
    code.add(x86.add(rdi, 0))
    code.add(x86.mov(eax, edi))
    code.add(x86.mov(al, dil))

    code.add(x86.imul(ax, ax, 4))
    code.add(x86.imul(eax, ebx, 10))
    code.add(x86.mov(cx, 1232))
    code.add(x86.sub(ax, cx))
    code.add(x86.xor(eax,eax))
    code.add(x86.mov(eax,ebx))
    code.add(x86.clc())
    code.add(x86.rcl(eax, 1))
    code.add(x86.rcr(eax, 1))


    prgm.add(code)
    #ret = proc.execute(prgm, debug = True, params = params)
    id1 = proc.execute(prgm, params = params, mode = 'int', async = True)
    id2 = proc.execute(prgm, params = params, mode = 'int', async = True)
    ret = proc.execute(prgm, params = params, mode = 'int')
    print "Return main thread: %d" % (ret)
    assert(ret == 1280)
    ret = proc.join(id1)
    print "Return thread 1: %d" % (ret)
    assert(ret == 1280)
    ret = proc.join(id2)
    print "Return thread 2: %d" % (ret)
    assert(ret == 1280)


    prgm.reset()
    code.reset()

    code.add(x86.fldpi())
    code.add(x86.pxor(xmm0, xmm0))
    code.add(x86.fld1())
    code.add(x86.fadd(st0, st0))
    code.add(x86.fmulp())
    code.add(x86.fsin())
    code.add(x86.fcos())
    code.add(x86.fld1())
    code.add(x86.fyl2xp1())

    # x86_64 now uses xmm0 to return floats, not st0.  So here, just make room
    # on the stack, convert the FP result to an int and store it on the stack,
    # then pop it into rax, the int return register.
    code.add(x86.push(prgm.gp_return))
    code.add(x86.fistp(MemRef(rsp)))
    code.add(x86.pop(prgm.gp_return))

    prgm.add(code)
    prgm.print_code(hex = True)
    ret = proc.execute(prgm, params = params, mode = 'int')
    assert(ret == 1)
    print "Return main thread: %d" % (ret)


    prgm.reset()
    code.reset()

    lbl_ok = prgm.get_label("OK")
    code.add(x86.emms())
    code.add(x86.movd(xmm0, edi))
    code.add(x86.mov(ebx, edi))

    code.add(x86.cmp(ebx, 3))
    code.add(x86.je(lbl_ok))
    code.add(x86.movd(eax, xmm0))
    code.add(x86.cmp(eax, 3))
    code.add(x86.je(lbl_ok))
    code.add(x86.ud2())

    code.add(lbl_ok)
    code.add(x86.xor(eax, eax))
    code.add(x86.movd(xmm1, ebx))
    code.add(x86.paddq(xmm0, xmm1))
    code.add(x86.pextrw(ecx, xmm0, 0))
    code.add(x86.pxor(mm1, mm1))
    code.add(x86.pinsrw(mm1, ecx, 0))
    code.add(x86.movq2dq(xmm0, mm1))
    code.add(x86.movdq2q(mm2, xmm0))
    code.add(x86.movd(edx,mm2))
    code.add(x86.movd(xmm5,edx))
    code.add(x86.movd(ecx, xmm5))
    code.add(x86.pxor(xmm6, xmm6))
    code.add(x86.pinsrw(xmm6, ecx, 0))
    code.add(x86.movd(eax, xmm6))

    prgm.add(code)
    prgm.print_code(hex = True)
    ret = proc.execute(prgm, params = params, mode = 'int')
    print "Return main thread: %d" % (ret)
    assert(ret == 6)


    prgm.reset()
    code.reset()

    code.add(x86.mov(edx, 0x1234))
    code.add(x86.mov(eax, 0xFFFF))
    code.add(x86.xchg(edx, eax))

    prgm.add(code)
    prgm.print_code(hex = True)
    ret = proc.execute(prgm, params = params)
    print "ret:", ret
    assert(ret == 0x1234)


    prgm.reset()
    code.reset()

    code.add(x86.mov(prgm.gp_return, rsp))
    code.add(x86.pushfq())
    code.add(x86.sub(prgm.gp_return, rsp))
    code.add(x86.add(rsp, prgm.gp_return))

    prgm.add(code)
    prgm.print_code(hex = True)
    ret = proc.execute(prgm, params = params)
    print "ret:", ret
    assert(ret == 8)


    prgm.reset()
    code.reset()

    data = extarray.extarray('H', xrange(0, 16))

    r_128 = prgm.acquire_register(reg_type = XMMRegister)
    regs = prgm.acquire_registers(4)

    code.add(x86.mov(regs[0], data.buffer_info()[0]))
    code.add(x86.movaps(r_128, MemRef(regs[0], data_size = 128)))
    code.add(x86.pextrw(prgm.gp_return, r_128, 0))
    code.add(x86.pextrw(regs[1], r_128, 1))
    code.add(x86.pextrw(regs[2], r_128, 2))
    code.add(x86.pextrw(regs[3], r_128, 3))
    code.add(x86.shl(regs[1], 16))
    code.add(x86.shl(regs[2], 32))
    code.add(x86.shl(regs[3], 48))
    code.add(x86.or_(prgm.gp_return, regs[1]))
    code.add(x86.or_(prgm.gp_return, regs[2]))
    code.add(x86.or_(prgm.gp_return, regs[3]))

    prgm.release_register(r_128)
    prgm.release_registers(regs)

    prgm.add(code)
    prgm.print_code()
    ret = proc.execute(prgm, mode = 'int')
    print "ret %x" % ret
    assert(ret == 0x0003000200010000)


    prgm.reset()
    code.reset()

    util.load_float(code, xmm0, 3.14159)

    prgm.add(code)
    ret = proc.execute(prgm, mode = 'fp')
    print "ret", ret
    assert(ret - 3.14159 < 0.00001)

    return
コード例 #40
0
def Test():
    prgm = env.Program()
    code = prgm.get_stream()
    proc = env.Processor()
    params = env.ExecParams()
    params.p1 = 3

    lbl1 = prgm.get_label("lbl1")
    lbl2 = prgm.get_label("lbl2")

    code.add(x86.xor(prgm.gp_return, prgm.gp_return))

    code.add(x86.cmp(prgm.gp_return, 1))
    code.add(x86.jne(lbl1))

    code.add(x86.ud2())
    code.add(x86.ud2())

    code.add(lbl1)
    code.add(x86.cmp(prgm.gp_return, 1))
    code.add(x86.je(lbl2))
    code.add(x86.add(prgm.gp_return, 12))
    code.add(lbl2)

    prgm.add(code)
    #prgm.print_code(pro = True, epi = True, hex = True)
    ret = proc.execute(prgm, mode='int')
    print "ret", ret
    assert (ret == 12)

    prgm.reset()
    code.reset()

    code.add(x86.xor(prgm.gp_return, prgm.gp_return))

    code.add(x86.cmp(prgm.gp_return, 1))
    code.add(x86.jne(28))

    code.add(x86.ud2())
    code.add(x86.ud2())

    code.add(x86.cmp(prgm.gp_return, 1))
    code.add(x86.je(37))
    code.add(x86.add(prgm.gp_return, 12))

    prgm.add(code)
    prgm.print_code(hex=True, pro=True, epi=True)
    ret = proc.execute(prgm)
    print "ret", ret
    assert (ret == 12)

    prgm.reset()
    code.reset()

    call_lbl = prgm.get_label("call_fn")

    code.add(x86.xor(prgm.gp_return, prgm.gp_return))
    code.add(x86.call(call_lbl))
    code.add(x86.jmp(prgm.lbl_epilogue))
    code.add(x86.mov(prgm.gp_return, 75))
    code.add(x86.mov(prgm.gp_return, 42))
    code.add(call_lbl)
    code.add(x86.mov(prgm.gp_return, 15))
    code.add(x86.ret())

    prgm.add(code)
    prgm.print_code()
    ret = proc.execute(prgm, mode='int')
    print "ret", ret
    assert (ret == 15)

    prgm.reset()
    code.reset()

    fwd_lbl = prgm.get_label("FORWARD")
    bck_lbl = prgm.get_label("BACKWARD")

    code.add(x86.xor(prgm.gp_return, prgm.gp_return))
    code.add(bck_lbl)
    code.add(x86.cmp(prgm.gp_return, 1))
    code.add(x86.jne(fwd_lbl))
    r_foo = prgm.acquire_register()
    for i in xrange(0, 65):
        code.add(x86.pop(r_foo))
    prgm.release_register(r_foo)
    code.add(fwd_lbl)

    prgm.add(code)
    ret = proc.execute(prgm, mode='int')
    print "ret", ret
    assert (ret == 0)

    prgm.reset()
    code.reset()

    loop_lbl = prgm.get_label("LOOP")
    out_lbl = prgm.get_label("OUT")
    skip_lbl = prgm.get_label("SKIP")

    code.add(x86.xor(prgm.gp_return, prgm.gp_return))
    code.add(loop_lbl)
    r_foo = prgm.acquire_register()
    for i in range(0, 1):
        for i in xrange(0, 24):
            code.add(x86.add(r_foo, MemRef(rsp, 4)))

        code.add(x86.add(prgm.gp_return, 4))
        code.add(x86.cmp(prgm.gp_return, 20))
        code.add(x86.je(out_lbl))

        for i in xrange(0, 24):
            code.add(x86.add(r_foo, MemRef(rsp, 4)))

        code.add(x86.cmp(prgm.gp_return, 32))
        code.add(x86.jne(loop_lbl))

    code.add(out_lbl)

    code.add(x86.jmp(skip_lbl))
    for i in xrange(0, 2):
        code.add(x86.add(r_foo, MemRef(rsp, 4)))
    code.add(skip_lbl)

    prgm.release_register(r_foo)
    prgm.add(code)
    ret = proc.execute(prgm, mode='int')
    print "ret", ret
    assert (ret == 20)

    prgm.reset()
    code.reset()

    r_tmp = prgm.acquire_registers(2)

    loop_lbl = prgm.get_label("LOOP")
    else_lbl = prgm.get_label("ELSE")
    finish_lbl = prgm.get_label("finish")

    code.add(x86.mov(prgm.gp_return, 0))
    code.add(x86.mov(r_tmp[0], 0))

    code.add(loop_lbl)

    code.add(x86.add(prgm.gp_return, 1))
    code.add(x86.cmp(prgm.gp_return, 16))
    code.add(x86.jge(finish_lbl))

    code.add(x86.add(r_tmp[0], prgm.gp_return))
    code.add(x86.mov(r_tmp[1], r_tmp[0]))
    code.add(x86.and_(r_tmp[1], 0x1))
    code.add(x86.jnz(else_lbl))

    code.add(x86.add(r_tmp[0], 1))
    code.add(x86.jmp(loop_lbl))

    code.add(else_lbl)
    code.add(x86.add(r_tmp[0], r_tmp[1]))
    code.add(x86.jmp(loop_lbl))

    code.add(finish_lbl)
    code.add(x86.mov(prgm.gp_return, r_tmp[0]))

    prgm.release_registers(r_tmp)

    prgm.add(code)
    ret = proc.execute(prgm, mode='int')
    print "ret", ret
    assert (ret == 135)

    prgm.reset()
    code.reset()

    loop_lbl = prgm.get_label("LOOP")

    r_one = prgm.acquire_register()
    code.add(x86.xor(prgm.gp_return, prgm.gp_return))
    code.add(x86.xor(rcx, rcx))
    code.add(x86.mov(r_one, 1))

    code.add(loop_lbl)
    code.add(x86.inc(prgm.gp_return))
    code.add(x86.cmp(prgm.gp_return, 7))
    code.add(x86.cmove(rcx, r_one))
    code.add(x86.jrcxz(loop_lbl))

    prgm.release_register(r_one)

    prgm.add(code)
    prgm.print_code(hex=True)
    ret = proc.execute(prgm, mode='int')
    print "ret", ret
    assert (ret == 7)

    prgm.reset()
    code.reset()

    r_tmp = prgm.acquire_register()
    code.add(x86.mov(prgm.gp_return, rdi))
    code.add(x86.xor(r_tmp, r_tmp))
    code.add(x86.mov(r_tmp, -1))
    code.add(x86.mov(cl, 1))
    code.add(x86.shld(prgm.gp_return, r_tmp, cl))

    prgm.release_register(r_tmp)
    prgm.add(code)
    ret = proc.execute(prgm, params=params, mode='int')
    print "ret", ret
    assert (ret == 7)

    prgm.reset()
    code.reset()

    code.add(x86.add(eax, 200))
    code.add(x86.xor(eax, eax))
    code.add(x86.add(al, 32))
    code.add(x86.add(bl, 32))
    code.add(x86.xor(bl, bl))
    code.add(x86.mov(dil, al))
    code.add(x86.add(rdi, 0))
    code.add(x86.mov(eax, edi))
    code.add(x86.mov(al, dil))

    code.add(x86.imul(ax, ax, 4))
    code.add(x86.imul(eax, ebx, 10))
    code.add(x86.mov(cx, 1232))
    code.add(x86.sub(ax, cx))
    code.add(x86.xor(eax, eax))
    code.add(x86.mov(eax, ebx))
    code.add(x86.clc())
    code.add(x86.rcl(eax, 1))
    code.add(x86.rcr(eax, 1))

    prgm.add(code)
    #ret = proc.execute(prgm, debug = True, params = params)
    id1 = proc.execute(prgm, params=params, mode='int', async=True)
    id2 = proc.execute(prgm, params=params, mode='int', async=True)
    ret = proc.execute(prgm, params=params, mode='int')
    print "Return main thread: %d" % (ret)
    assert (ret == 1280)
    ret = proc.join(id1)
    print "Return thread 1: %d" % (ret)
    assert (ret == 1280)
    ret = proc.join(id2)
    print "Return thread 2: %d" % (ret)
    assert (ret == 1280)

    prgm.reset()
    code.reset()

    code.add(x86.fldpi())
    code.add(x86.pxor(xmm0, xmm0))
    code.add(x86.fld1())
    code.add(x86.fadd(st0, st0))
    code.add(x86.fmulp())
    code.add(x86.fsin())
    code.add(x86.fcos())
    code.add(x86.fld1())
    code.add(x86.fyl2xp1())

    # x86_64 now uses xmm0 to return floats, not st0.  So here, just make room
    # on the stack, convert the FP result to an int and store it on the stack,
    # then pop it into rax, the int return register.
    code.add(x86.push(prgm.gp_return))
    code.add(x86.fistp(MemRef(rsp)))
    code.add(x86.pop(prgm.gp_return))

    prgm.add(code)
    prgm.print_code(hex=True)
    ret = proc.execute(prgm, params=params, mode='int')
    assert (ret == 1)
    print "Return main thread: %d" % (ret)

    prgm.reset()
    code.reset()

    lbl_ok = prgm.get_label("OK")
    code.add(x86.emms())
    code.add(x86.movd(xmm0, edi))
    code.add(x86.mov(ebx, edi))

    code.add(x86.cmp(ebx, 3))
    code.add(x86.je(lbl_ok))
    code.add(x86.movd(eax, xmm0))
    code.add(x86.cmp(eax, 3))
    code.add(x86.je(lbl_ok))
    code.add(x86.ud2())

    code.add(lbl_ok)
    code.add(x86.xor(eax, eax))
    code.add(x86.movd(xmm1, ebx))
    code.add(x86.paddq(xmm0, xmm1))
    code.add(x86.pextrw(ecx, xmm0, 0))
    code.add(x86.pxor(mm1, mm1))
    code.add(x86.pinsrw(mm1, ecx, 0))
    code.add(x86.movq2dq(xmm0, mm1))
    code.add(x86.movdq2q(mm2, xmm0))
    code.add(x86.movd(edx, mm2))
    code.add(x86.movd(xmm5, edx))
    code.add(x86.movd(ecx, xmm5))
    code.add(x86.pxor(xmm6, xmm6))
    code.add(x86.pinsrw(xmm6, ecx, 0))
    code.add(x86.movd(eax, xmm6))

    prgm.add(code)
    prgm.print_code(hex=True)
    ret = proc.execute(prgm, params=params, mode='int')
    print "Return main thread: %d" % (ret)
    assert (ret == 6)

    prgm.reset()
    code.reset()

    code.add(x86.mov(edx, 0x1234))
    code.add(x86.mov(eax, 0xFFFF))
    code.add(x86.xchg(edx, eax))

    prgm.add(code)
    prgm.print_code(hex=True)
    ret = proc.execute(prgm, params=params)
    print "ret:", ret
    assert (ret == 0x1234)

    prgm.reset()
    code.reset()

    code.add(x86.mov(prgm.gp_return, rsp))
    code.add(x86.pushfq())
    code.add(x86.sub(prgm.gp_return, rsp))
    code.add(x86.add(rsp, prgm.gp_return))

    prgm.add(code)
    prgm.print_code(hex=True)
    ret = proc.execute(prgm, params=params)
    print "ret:", ret
    assert (ret == 8)

    prgm.reset()
    code.reset()

    data = extarray.extarray('H', xrange(0, 16))

    r_128 = prgm.acquire_register(reg_type=XMMRegister)
    regs = prgm.acquire_registers(4)

    code.add(x86.mov(regs[0], data.buffer_info()[0]))
    code.add(x86.movaps(r_128, MemRef(regs[0], data_size=128)))
    code.add(x86.pextrw(prgm.gp_return, r_128, 0))
    code.add(x86.pextrw(regs[1], r_128, 1))
    code.add(x86.pextrw(regs[2], r_128, 2))
    code.add(x86.pextrw(regs[3], r_128, 3))
    code.add(x86.shl(regs[1], 16))
    code.add(x86.shl(regs[2], 32))
    code.add(x86.shl(regs[3], 48))
    code.add(x86.or_(prgm.gp_return, regs[1]))
    code.add(x86.or_(prgm.gp_return, regs[2]))
    code.add(x86.or_(prgm.gp_return, regs[3]))

    prgm.release_register(r_128)
    prgm.release_registers(regs)

    prgm.add(code)
    prgm.print_code()
    ret = proc.execute(prgm, mode='int')
    print "ret %x" % ret
    assert (ret == 0x0003000200010000)

    prgm.reset()
    code.reset()

    util.load_float(code, xmm0, 3.14159)

    prgm.add(code)
    ret = proc.execute(prgm, mode='fp')
    print "ret", ret
    assert (ret - 3.14159 < 0.00001)

    return
コード例 #41
0
def Test():
    code = env.InstructionStream()
    proc = env.Processor()
    params = env.ExecParams()
    params.p1 = 3
    mr32 = MemRef(rbp, 16, data_size=32)
    mr8 = MemRef(rbp, 16, data_size=8)

    lbl1 = code.get_label("lbl1")
    lbl2 = code.get_label("lbl2")

    code.add(x86.xor(rax, rax))

    code.add(x86.cmp(rax, 1))
    code.add(x86.jne(lbl1))

    code.add(x86.ud2())
    code.add(x86.ud2())

    code.add(lbl1)
    code.add(x86.cmp(rax, 1))
    code.add(x86.je(lbl2))
    code.add(x86.add(rax, 12))
    code.add(lbl2)

    # printer.PrintInstructionStream(code, printer.x86_64_Nasm(function_name="foobar"))
    ret = proc.execute(code)
    print "ret", ret
    assert (ret == 12)

    print "W00T"

    code.reset()

    code.add(x86.xor(rax, rax))

    code.add(x86.cmp(rax, 1))
    code.add(x86.jne(28))

    code.add(x86.ud2())
    code.add(x86.ud2())

    code.add(x86.cmp(eax, 1))
    code.add(x86.je(37))
    code.add(x86.add(rax, 12))

    code.print_code(hex=True, pro=True, epi=True)
    print "a"
    ret = proc.execute(code)
    print "b"
    print "ret", ret
    assert (ret == 12)

    print "w00t 2"

    code.reset()

    call_lbl = code.get_label("call_fn")

    code.add(x86.xor(rax, rax))
    code.add(x86.call(call_lbl))
    code.add(x86.jmp(code.lbl_epilogue))
    code.add(x86.mov(rax, 75))
    code.add(x86.mov(rax, 42))
    code.add(call_lbl)
    code.add(x86.mov(rax, 15))
    code.add(x86.ret())

    code.print_code()
    ret = proc.execute(code)
    print "ret", ret
    assert (ret == 15)

    code.reset()

    fwd_lbl = code.get_label("FORWARD")
    bck_lbl = code.get_label("BACKWARD")

    code.add(x86.xor(rax, rax))
    code.add(bck_lbl)
    code.add(x86.cmp(rax, 1))
    code.add(x86.jne(fwd_lbl))
    for i in xrange(0, 65):
        code.add(x86.pop(r15))
    code.add(fwd_lbl)

    ret = proc.execute(code, mode='int')
    assert (ret == 0)

    code.reset()

    loop_lbl = code.get_label("LOOP")
    out_lbl = code.get_label("OUT")
    skip_lbl = code.get_label("SKIP")

    code.add(x86.xor(rax, rax))
    code.add(loop_lbl)
    for i in range(0, 1):
        for i in xrange(0, 24):
            code.add(x86.add(r15, MemRef(rsp, 4)))

        code.add(x86.add(rax, 4))
        code.add(x86.cmp(rax, 20))
        code.add(x86.je(out_lbl))

        for i in xrange(0, 24):
            code.add(x86.add(r15, MemRef(rsp, 4)))

        code.add(x86.cmp(rax, 32))
        code.add(x86.jne(loop_lbl))

    code.add(out_lbl)

    code.add(x86.jmp(skip_lbl))
    for i in xrange(0, 2):
        code.add(x86.add(r15, MemRef(rsp, 4)))
    code.add(skip_lbl)

    ret = proc.execute(code, mode='int')
    print "ret", ret
    assert (ret == 20)

    code.reset()

    loop_lbl = code.get_label("LOOP")
    else_lbl = code.get_label("ELSE")
    finish_lbl = code.get_label("finish")

    code.add(x86.mov(rax, 0))
    code.add(x86.mov(rdx, 0))

    code.add(loop_lbl)

    code.add(x86.add(rax, 1))
    code.add(x86.cmp(rax, 16))
    code.add(x86.jge(finish_lbl))

    code.add(x86.add(rdx, rax))
    code.add(x86.mov(r8, rdx))
    code.add(x86.and_(r8, 0x1))
    code.add(x86.jnz(else_lbl))

    code.add(x86.add(rdx, 1))
    code.add(x86.jmp(loop_lbl))

    code.add(else_lbl)
    code.add(x86.add(rdx, r8))
    code.add(x86.jmp(loop_lbl))

    code.add(finish_lbl)
    code.add(x86.mov(rax, rdx))

    ret = proc.execute(code, mode='int')
    print "ret", ret
    assert (ret == 135)

    code.reset()

    loop_lbl = code.get_label("LOOP")

    code.add(x86.xor(rax, rax))
    code.add(x86.xor(rcx, rcx))
    code.add(x86.mov(rdx, 1))

    code.add(loop_lbl)
    code.add(x86.inc(rax))
    code.add(x86.cmp(rax, 7))
    code.add(x86.cmove(rcx, rdx))
    code.add(x86.jrcxz(loop_lbl))

    code.print_code(hex=True)
    ret = proc.execute(code, mode='int')
    print "ret", ret
    assert (ret == 7)

    code.reset()

    code.add(x86.mov(rax, MemRef(rbp, 16)))
    code.add(x86.xor(rbx, rbx))
    code.add(x86.mov(rbx, -1))
    code.add(x86.mov(cl, 1))
    code.add(x86.shld(rax, rbx, cl))
    code.print_code(hex=True)
    ret = proc.execute(code, params=params, mode='int')
    print "ret", ret
    assert (ret == 7)

    # code.reset()

    # code.add(x86.add(eax, 200))
    # code.add(x86.xor(eax, eax))
    # code.add(x86.add(al, 32))
    # code.add(x86.add(bl, 32))
    # code.add(x86.xor(bl, bl))
    # code.add(x86.mov(mr8, al))
    # code.add(x86.add(mr32, 0))
    # code.add(x86.mov(eax, mr32))
    # code.add(x86.mov(al, mr8))
    #
    # code.add(x86.imul(ax, ax, 4))
    # code.add(x86.imul(eax, ebx, 10))
    # code.add(x86.mov(cx, 1232))
    # code.add(x86.sub(ax, cx))
    # code.add(x86.xor(eax,eax))
    # code.add(x86.mov(eax,ebx))
    # code.add(x86.clc())
    # code.add(x86.rcl(eax, 1))
    # code.add(x86.rcr(eax, 1))

    # #ret = proc.execute(code, debug = True, params = params)
    # id1 = proc.execute(code, params = params, mode = 'int', async = True)
    # id2 = proc.execute(code, params = params, mode = 'int', async = True)
    # ret = proc.execute(code, params = params, mode = 'int')
    # print "Return main thread: %d" % (ret)
    # assert(ret == 1280)
    # ret = proc.join(id1)
    # print "Return thread 1: %d" % (ret)
    # assert(ret == 1280)
    # ret = proc.join(id2)
    # print "Return thread 2: %d" % (ret)
    # assert(ret == 1280)

    code.reset()

    code.add(x86.fldpi())
    code.add(x86.pxor(xmm0, xmm0))
    code.add(x86.fld1())
    code.add(x86.fadd(st0, st0))
    code.add(x86.fmulp())
    code.add(x86.fsin())
    code.add(x86.fcos())
    code.add(x86.fld1())
    code.add(x86.fyl2xp1())

    # x86_64 now uses xmm0 to return floats, not st0.  So here, just make room
    # on the stack, convert the FP result to an int and store it on the stack,
    # then pop it into rax, the int return register.
    code.add(x86.push(rax))
    code.add(x86.fistp(MemRef(rsp)))
    code.add(x86.pop(rax))

    code.print_code(hex=True)
    ret = proc.execute(code, params=params, mode='int')
    assert (ret == 1)
    print "Return main thread: %d" % (ret)

    code.reset()

    lbl_ok = code.get_label("OK")
    code.add(x86.emms())
    code.add(x86.movd(xmm0, mr32))
    code.add(x86.mov(ebx, mr32))

    code.add(x86.cmp(ebx, 3))
    code.add(x86.je(lbl_ok))
    code.add(x86.movd(eax, xmm0))
    code.add(x86.cmp(eax, 3))
    code.add(x86.je(lbl_ok))
    code.add(x86.ud2())

    code.add(lbl_ok)
    code.add(x86.xor(eax, eax))
    code.add(x86.movd(xmm1, ebx))
    code.add(x86.paddq(xmm0, xmm1))
    code.add(x86.pextrw(ecx, xmm0, 0))
    code.add(x86.pinsrw(mm1, ecx, 0))
    code.add(x86.movq2dq(xmm0, mm1))
    code.add(x86.movdq2q(mm2, xmm0))
    code.add(x86.movd(edx, mm2))
    code.add(x86.movd(xmm5, edx))
    code.add(x86.movd(ecx, xmm5))
    code.add(x86.pinsrw(xmm6, ecx, 0))
    code.add(x86.movd(eax, xmm6))

    code.print_code(hex=True)
    ret = proc.execute(code, params=params, mode='int')
    print "Return main thread: %d" % (ret)
    assert (ret == 6)

    code.reset()

    # Test immediate size encodings
    code.add(x86.add(eax, 300))
    code.add(x86.add(ax, 300))
    code.add(x86.add(ax, 30))
    code.add(x86.mov(eax, 16))
    code.add(x86.mov(eax, 300))

    code.reset()
    code.add(x86.add(eax, 0xDEADBEEF))
    code.add(x86.add(ebx, 0xDEADBEEF))
    code.print_code(hex=True)

    # Try the LOCK prefix
    code.reset()
    code.add(x86.xor(eax, eax))
    code.add(x86.add(mr32, eax))
    code.add(x86.add(mr32, eax, lock=True))
    #code.print_code(hex = True)

    proc.execute(code, params=params)

    code.reset()

    code.add(x86.mov(edx, 0x1234))
    code.add(x86.mov(eax, 0xFFFF))
    code.add(x86.xchg(edx, eax))

    code.print_code(hex=True)
    ret = proc.execute(code, params=params)
    print "ret:", ret
    assert (ret == 0x1234)

    code.reset()

    code.add(x86.mov(rax, rsp))
    code.add(x86.pushfq())
    code.add(x86.sub(rax, rsp))
    code.add(x86.add(rsp, rax))

    code.print_code(hex=True)
    ret = proc.execute(code, params=params)
    print "ret:", ret
    assert (ret == 8)

    code.reset()

    data = extarray.extarray('H', xrange(0, 16))

    # code.add(x86.push(rdi))
    code.add(x86.mov(rdi, data.buffer_info()[0]))
    code.add(x86.movaps(xmm1, MemRef(rdi, data_size=128)))
    code.add(x86.pextrw(rax, xmm1, 0))
    code.add(x86.pextrw(rbx, xmm1, 1))
    code.add(x86.pextrw(rcx, xmm1, 2))
    code.add(x86.pextrw(rdx, xmm1, 3))
    code.add(x86.shl(rbx, 16))
    code.add(x86.shl(rcx, 32))
    code.add(x86.shl(rdx, 48))
    code.add(x86.or_(rax, rbx))
    code.add(x86.or_(rax, rcx))
    code.add(x86.or_(rax, rdx))
    # code.add(x86.pop(rdi))

    code.print_code(hex=True)
    ret = proc.execute(code, mode='int')
    print "ret %x" % ret
    assert (ret == 0x0003000200010000)

    code.reset()
    L1 = code.get_label("L1")
    code.add(x86.xor(rax, rax))
    code.add(x86.mov(rcx, 3))
    code.add(L1)
    code.add(x86.add(rax, 1))
    code.add(x86.loop(L1))

    code.print_code(hex=True)
    ret = proc.execute(code, mode='int')
    print "ret %x" % ret
    assert (ret == 0x03)

    return