Exemple #1
0
def dw_memarg(obj, data):
    data = pack(data)
    obj.a, blen1 = read_leb128(data, 1, 0)
    obj.bytes += data[0:blen]
    obj.o, blen2 = read_leb128(data, 1, blen1)
    obj.bytes += data[blen:blen1 + blen2]
    obj.type = type_data_processing
Exemple #2
0
def dw_table(obj, data):
    data = pack(data)
    v, blen = read_uleb128(data)
    obj.bytes += data[0:blen]
    obj.type = type_data_processing
    if v > 17:
        raise InstructionError(obj)
    if v < 8:
        obj.mntype = "i32" if v < 4 else "i64"
        post = "f32" if v in (0, 2, 4, 5) else "f64"
        su = "_s" if v % 2 == 0 else "_u"
        obj.mnemonic = "trunc_sat_" + post + su
    if v == 10:
        obj.mnemonic = "memory"
        obj.action = "copy"
        if data[blen:blen + 2] != b'\x00\x00':
            raise InstructionError(obj)
        obj.bytes += data[blen:blen + 2]
        return
    elif v == 11:
        obj.mnemonic = "memory"
        obj.action = "fill"
        if data[blen:blen + 1] != b'\x00':
            raise InstructionError(obj)
        obj.bytes += data[blen:blen + 1]
        return
    data = data[blen:]
    obj.x, blen1 = read_leb128(data, 1, 0)
    obj.bytes += data[0:blen1]
    if v == 8:
        obj.mnemonic = "memory"
        obj.action = "init"
        if data[blen1:blen1 + 1] != b'\x00':
            raise InstructionError(obj)
        obj.bytes += data[blen1:blen1 + 1]
    elif v == 9:
        obj.mnemonic = "data"
        obj.action = "drop"
    elif v == 12:
        obj.y = obj.x
        obj.x, blen2 = read_leb128(data, 1, blen1)
        obj.bytes += data[blen1:blen1 + blen2]
        obj.action = "init"
    elif v == 13:
        obj.mnemonic = "elem"
        obj.action = "drop"
    elif v == 14:
        obj.y, blen2 = read_leb128(data, 1, blen1)
        obj.bytes += data[blen1:blen1 + blen2]
        obj.action = "copy"
    else:
        obj.action = {15: "grow", 16: "size", 17: "fill"}[v]
Exemple #3
0
def xdata_br_table(obj, **kargs):
    addr = kargs['address']
    code = kargs['code']
    obj.labels = []
    addr += len(obj.bytes)
    off = 0
    for l in range(obj.l):
        n, sz = read_leb128(code, 1, addr + off)
        obj.labels.append(n)
        off += sz
    n, sz = read_leb128(code, 1, addr + off)
    obj.default = n
    off += sz
    obj.bytes += code[addr:addr + off]
Exemple #4
0
def dw_op_regx(obj, data):
    data = pack(data)
    indx, blen = read_leb128(data)
    sz = env.op_ptr.size
    r = env.reg("reg%d" % indx, sz)
    obj.operands = [r]
    obj.bytes += data[:blen]
    obj.type = type_data_processing
Exemple #5
0
def dw_op_const(obj, data):
    sz = env.op_ptr.size
    if data.size < sz: raise InstructionError(obj)
    data = pack(data)
    result, blen = read_leb128(data, obj.sign)
    obj.operands = [env.cst(result, WORD)]
    obj.bytes += data[:blen]
    obj.type = type_data_processing
Exemple #6
0
def xdata_call_indirect(obj, **kargs):
    addr = kargs['address']
    code = kargs['code']
    off = 0
    n, sz = read_leb128(code, 1, addr + off)
    obj.y = n
    obj.operands.append(obj.y)
    off += sz
    obj.bytes += code[addr:addr + off]
Exemple #7
0
def xdata_select(obj, **kargs):
    addr = kargs['address']
    code = kargs['code']
    obj.t = []
    addr = addr + len(obj.bytes)
    off = 0
    for l in range(obj.x):
        n, sz = read_leb128(code, 1, addr + off)
        obj.t.append(n)
        off += sz
    obj.operands[0] = obj.t
    obj.bytes += code[addr:addr + off]
Exemple #8
0
def dw_op_bregx(obj, data):
    data = pack(data)
    indx, blen = read_leb128(data)
    sz = env.op_ptr.size
    r = env.reg("reg%d" % indx, sz)
    obj.bytes += data[:blen]
    data = data[blen:]
    result, blen = read_sleb128(data)
    offset = env.cst(result, blen * 8).signextend(sz)
    obj.operands = [r + offset]
    obj.bytes += data[:blen]
    obj.type = type_data_processing
Exemple #9
0
 def unpack(self, data, offset=0, psize=0):
     "returns a vector of count element(s) of its self.type"
     n,sz = read_leb128(data,1,offset)
     offset += sz
     vec = []
     for _ in range(n):
         e = self.type()
         blob = e.unpack(data, offset)
         vec.append(blob)
         if isinstance(blob,StructCore):
             l = len(blob)
         else:
             l = e.size()
         sz += l
         offset += l
     self.count = n
     self._sz = sz
     return vec
Exemple #10
0
def dw_op_leb128(obj, data):
    data = pack(data)
    result, blen = read_leb128(data)
    obj.operands = [env.cst(result, WORD)]
    obj.bytes += data[:blen]
    obj.type = type_data_processing