Ejemplo n.º 1
0
def get_instrs_fix_NaN(is_dp, fp_reg, isARM, reinit=False):
    instrs = []
    if is_dp:
        regs = range(12)
        ra = random.choice(regs)
        regs.remove(ra)
        rb = random.choice(regs)
        instrs.append(('vcmp.f64', 'd%d, 0' % fp_reg))
        instrs.append(('vmrs', 'apsr_nzcv, fpscr'))
        if not isARM:
            instrs.append(('itttt', 'vs'))
        instrs.append(('vmovvs', 'r%d, r%d, d%d' % (ra, rb, fp_reg)))
        #instrs.append(('orrvs', 'r1, r1, #0x80000000'))
        if reinit:
            instrs.append(('ldrvs', 'r%d, =0x%x' % (ra, code.getRandRegVal())))
            instrs.append(('ldrvs', 'r%d, =0x%x' % (rb, code.getRandRegVal())))
        else:
            instrs.append(('mvnvs', 'r%d, #0' % ra))
            instrs.append(('mvnvs', 'r%d, #0' % rb))
        instrs.append(('vmovvs', 'd%d, r%d, r%d' % (fp_reg, ra, rb)))
    else:
        regs = range(12)
        ra = random.choice(regs)
        instrs.append(('vcmp.f32', 's%d, 0' % fp_reg))
        instrs.append(('vmrs', 'apsr_nzcv, fpscr'))
        if not isARM:
            instrs.append(('ittt', 'vs'))
        instrs.append(('vmovvs', 'r%d, s%d' % (ra, fp_reg)))
        #instrs.append(('orrvs', 'r1, r1, #0x80000000'))
        if reinit:
            instrs.append(('ldrvs', 'r%d, =0x%x' % (ra, code.getRandRegVal())))
        else:
            instrs.append(('mvnvs', 'r%d, #0' % ra))
        instrs.append(('vmovvs', 's%d, r%d' % (fp_reg, ra)))
    #return [Instr(i[0], i[1]) for i in instrs]
    return instrs
Ejemplo n.º 2
0
def genSTREX(isARM, ctx, isconditional, selfLabelPrefix, ExclSize=None, cond=None):
    esinst = []
    if ExclSize is None:
        esinst.append(('clrex', ''))
        return esinst
    if isconditional:
        if cond is None:
            cond = random.choice(arminfo.CONDCODE)
    else:
        cond = ''

    if isARM:
        wsize_suffix = ''
    else:
        wsize_suffix = '.w'

    reglist = range(15)
    if not isARM:
        reglist.remove(13)
    rs = random.choice(reglist)
    esinst.append(('mrs', 'r%d, APSR' % (rs)))
    reglist.remove(rs)
    rw = random.choice(reglist)
    reglist.remove(rw)
    rn = random.choice(reglist)
    reglist.remove(rn)
    rv = random.choice(reglist)

    esinst.append(('ldr'+wsize_suffix, 'r%d, =excladdr+0' % (rw)))
    esinst.append(('ldr'+wsize_suffix, 'r%d, [r%d]' % (rn, rw)))
    esinst.append(('cmp'+wsize_suffix, 'r%d, #0' % (rn)))
    esinst.append(('beq'+wsize_suffix, selfLabelPrefix+'_excl_stub'))
    esinst.append(('mov'+wsize_suffix, 'r%d, #0' % (rv)))
    esinst.append(('str'+wsize_suffix, 'r%d, [r%d]' % (rv, rw)))
    esinst.append(('msr', 'APSR_nzcvqg, r%d' % (rs)))


    imm_offset = random.choice([True, False])
    if not isARM and imm_offset and ExclSize == 'w':
            imm = ( random.randint(0x0, 0xff) << 2 )
            esinst.append(('sub'+wsize_suffix, 'r%d, r%d, #0x%x' % (rn, rn, imm)))

    reglist = range(15)
    rt = random.choice(reglist)
    if isARM:
        if ExclSize == 'd':
            regtmp = reglist
            regtmp.remove(14)
            regtmp = [i for i in regtmp if i&1==0]
            rt = random.choice(regtmp)
    else:
        reglist.remove(13)
        rt = random.choice(reglist)
    reglist.remove(rt)
    if isARM:
        rt2 = rt + 1
    else:
        rt2 = random.choice(reglist)
    if rt2 in reglist:
        reglist.remove(rt2)
    if rn in reglist:
        reglist.remove(rn)
    rd = random.choice(reglist)
    esinst.append(('mov'+wsize_suffix, 'r%d, #0' % (rd)))

    if cond != '':
        uncond = arminfo.INVCONDCODE[arminfo.CONDCODE.index(cond)]
        if not isARM:
            esinst.append(('ite', cond))

    if ExclSize == 'b':
        esinst.append(('strexb'+cond, 'r%d, r%d, [r%d]' % (rd, rt, rn)))
    elif ExclSize == 'h':
        esinst.append(('strexh'+cond, 'r%d, r%d, [r%d]' % (rd, rt, rn)))
    elif ExclSize == 'w':
        if isARM or not imm_offset:
            esinst.append(('strex'+cond, 'r%d, r%d, [r%d]' % (rd, rt, rn)))
        else:
            esinst.append(('strex'+cond, 'r%d, r%d, [r%d , #%d]' % (rd, rt, rn, imm)))
    elif ExclSize == 'd':
        esinst.append(('strexd'+cond, 'r%d, r%d, r%d, [r%d]' % (rd, rt, rt2, rn)))
    else:
        pass

    if cond != '':
        esinst.append(('b'+uncond, selfLabelPrefix+'_excl_fill_lock_mem'))
    esinst.append(('cmp'+wsize_suffix, 'r%d, #0' % (rd)))

    reglist = range(15)
    if rn in reglist:
        reglist.remove(rn)
    rz1 = random.choice(reglist)
    reglist.remove(rz1)
    rz2 = random.choice(reglist)
    reglist.remove(rz2)

    esinst.append(('ldr'+wsize_suffix, 'r%d, =exclcnt+0' % (rz1)))
    esinst.append(('ldr'+wsize_suffix, 'r%d, [r%d]' % (rz2, rz1)))
    esinst.append(('sub'+wsize_suffix, 'r%d, r%d, #0x%x' % (rz2, rz2, 1)))
    esinst.append(('str'+wsize_suffix, 'r%d, [r%d]' % (rz2, rz1)))

    if not isARM:
        esinst.append(('it', 'ne'))
    esinst.append(('cmp'+'ne'+wsize_suffix, 'r%d, #0' % (rz2)))

    esinst.append(('bne', selfLabelPrefix+'_excl_back_edge'))
    esinst.append((selfLabelPrefix+'_excl_fill_lock_mem', ':'))
    if not isARM and imm_offset and ExclSize == 'w':
        esinst.append(('add'+wsize_suffix, 'r%d, r%d, #0x%x' % (rn, rn, imm)))

    reg_lm = range(13)
    if rt in reg_lm:
        reg_lm.remove(rt)
    if (ExclSize == 'd') and (rt2 in reg_lm):
        reg_lm.remove(rt2)
    if not (rn in reg_lm):
        rm = random.choice(reg_lm)
        esinst.append(('mov'+wsize_suffix, 'r%d, r%d' % (rm, rn)))
        rn = rm
    esinst.append(('ldr'+wsize_suffix, 'r%d, =0x%x' % (rt, code.getRandRegVal(rt))))
    if ExclSize == 'd':
        esinst.append(('ldr'+wsize_suffix, 'r%d, =0x%x' % (rt2, code.getRandRegVal(rt2))))
        esinst.append(('strd'+wsize_suffix, 'r%d, r%d, [r%d, #0]' % (rt, rt2, rn)))
    else:
        esinst.append(('str'+wsize_suffix, 'r%d, [r%d]' % (rt, rn)))

    esinst.append((selfLabelPrefix+'_excl_stub', ':'))
    esinst.append(('ldr'+wsize_suffix, 'r%d, =0x%x' % (rs, code.getRandRegVal(rs))))
    esinst.append(('ldr'+wsize_suffix, 'r%d, =0x%x' % (rn, code.getRandRegVal(rn))))
    esinst.append(('mov'+wsize_suffix, 'r%d, #0' % (rd)))
    esinst.append(('cmp'+wsize_suffix, 'r%d, #0' % (rd)))
    esinst.append(('ldr'+wsize_suffix, 'r%d, =exclcnt+0' % (rz1)))
    esinst.append(('ldr'+wsize_suffix, 'r%d, =0x%x' % (rz2, arminfo.EXCL_CNT)))
    esinst.append(('str'+wsize_suffix, 'r%d, [r%d]' % (rz2, rz1)))
    return esinst
Ejemplo n.º 3
0
def genLDREX(isARM, ctx, isconditional, selfLabelPrefix, ExclSize=None, cond=None):
    elinst = []
    if isconditional:
        if cond is None:
            cond = random.choice(arminfo.CONDCODE)
    else:
        cond = ''

    if isARM:
        wsize_suffix = ''
    else:
        wsize_suffix = '.w'   

    m_lo, m_hi = getMemLimit()
    rval = random.randint(m_lo, m_hi)
    if ExclSize is None:
        ExclSize = random.choice(arminfo.OP_SIZE)
    if ExclSize == 'h':
        rval = rval >> 1 << 1
    elif ExclSize == 'w':
        rval = rval >> 2 << 2
    elif ExclSize == 'd':
        rval = rval >> 3 << 3

    reglist = range(15)
    rn = random.choice(reglist)
    if isARM:
        if ExclSize == 'd':
            reglist.remove(14)
            reglist = [i for i in reglist if i&1==0]
    else:
        reglist.remove(13)
    rt = random.choice(reglist)
    if 13 in reglist:
        reglist.remove(13)
    rp = random.choice(reglist)
    reglist.remove(rp)
    rq = random.choice(reglist)
    
    elinst.append(('mrs', 'r%d, APSR' % (rp)))
    elinst.append(('ldr'+wsize_suffix, 'r%d, =exclflag+0' % (rq)))
    elinst.append(('str'+wsize_suffix, 'r%d, [r%d]' % (rp, rq)))
    elinst.append((selfLabelPrefix+'_excl_back_edge', ':'))
    elinst.append(('ldr'+wsize_suffix, 'r%d, =exclflag+0' % (rq)))
    elinst.append(('ldr'+wsize_suffix, 'r%d, [r%d]' % (rp, rq)))
    elinst.append(('msr', 'APSR_nzcvqg, r%d' % (rp)))
    if isARM:
        elinst.append(('ldr'+cond, 'r%d, =0x%x' % (rn, rval)))
    else:
        if cond != '':
            elinst.append(('itttt', cond))
        imm_offset = random.choice([True, False])
        if ExclSize == 'w' and imm_offset:
            imm = ( random.randint(0x0, 0xff) << 2 )
            elinst.append(('ldr'+cond+wsize_suffix, 'r%d, =0x%x' % (rn, rval - imm)))
        else:
            elinst.append(('ldr'+cond+wsize_suffix, 'r%d, =0x%x' % (rn, rval)))

    if ExclSize == 'b':
        elinst.append(('ldrexb'+cond, 'r%d, [r%d]' % (rt, rn)))
    elif ExclSize == 'h':
        elinst.append(('ldrexh'+cond, 'r%d, [r%d]' % (rt, rn)))
    elif ExclSize == 'w':
        if isARM or not imm_offset:
            elinst.append(('ldrex'+cond, 'r%d, [r%d]' % (rt, rn)))
        else:
            elinst.append(('ldrex'+cond, 'r%d, [r%d, #%d]' % (rt, rn, imm)))
    elif ExclSize == 'd':
        if isARM:
            rt2 = rt + 1
        else:
            if rt in reglist:
                reglist.remove(rt)
            rt2 = random.choice(reglist)
        elinst.append(('ldrexd'+cond, 'r%d, r%d, [r%d]' % (rt, rt2, rn)))
    else:
        pass

    regtmp = range(13)
    rx = random.choice(regtmp)
    regtmp.remove(rx)
    ry = random.choice(regtmp)
    elinst.append(('ldr'+cond+wsize_suffix, 'r%d, =excladdr+0' % (rx)))
    elinst.append(('ldr'+cond+wsize_suffix, 'r%d, =0x%x' % (ry, rval)))

    if not isARM and cond != '':
        if ExclSize == 'd':
            elinst.append(('ittt', cond))
        else:
            elinst.append(('itt', cond))

    elinst.append(('str'+cond+wsize_suffix, 'r%d, [r%d]' % (ry, rx)))
    elinst.append(('ldr'+cond+wsize_suffix, 'r%d, =0x%x' % (rt, code.getRandRegVal(rt))))
    if ExclSize == 'd':
        elinst.append(('ldr'+cond+wsize_suffix, 'r%d, =0x%x' % (rt2, code.getRandRegVal(rt2))))

    return (elinst, ExclSize)