diff options
author | comex | 2015-02-23 00:41:29 -0500 |
---|---|---|
committer | comex | 2015-02-23 00:54:13 -0500 |
commit | b63f1dff9dc736f7fa66f04976436f1f3fe2ac5d (patch) | |
tree | db70eb338a0107fdc70992ea2522fd03f2ecf32e /lib/arm/dis-thumb2.inc.h | |
parent | fix some i386 stuff (diff) | |
download | substitute-b63f1dff9dc736f7fa66f04976436f1f3fe2ac5d.tar.gz |
Ban calls within transform regions in threadsafe mode.
Diffstat (limited to '')
-rw-r--r-- | lib/arm/dis-thumb2.inc.h | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/arm/dis-thumb2.inc.h b/lib/arm/dis-thumb2.inc.h index 43ca4ab..5f699c9 100644 --- a/lib/arm/dis-thumb2.inc.h +++ b/lib/arm/dis-thumb2.inc.h @@ -170,6 +170,24 @@ static INLINE void P(unk_Rm_B_2_t2TBB)(tdis_ctx ctx, UNUSED struct bitslice Rm) static INLINE void P(unk_Rt_13_VMOVRRD)(tdis_ctx ctx, UNUSED struct bitslice Rt) { return P(unidentified)(ctx); } +static INLINE void P(t_bltarget_func_1_tBL)(tdis_ctx ctx, struct bitslice func) { + unsigned crap = bs_get(func, ctx->base.op) << 1; + unsigned S = crap >> 24 & 1; + if (S) + crap ^= (3 << 22); + return P(branch)(ctx, ctx->base.pc + 4 + 2 * sext(crap, 25), CC_CALL); + +} +static INLINE void P(t_blxtarget_func_1_tBLXi)(tdis_ctx ctx, struct bitslice func) { + unsigned crap = bs_get(func, ctx->base.op); + unsigned S = crap >> 24 & 1; + if (S) + crap ^= (3 << 22); + return P(branch)(ctx, ctx->base.pc + 4 + 2 * sext(crap, 25), CC_CALL); +} +static INLINE void P(rGPR_func_1_t2BXJ)(tdis_ctx ctx, UNUSED struct bitslice func) { + return P(unidentified)(ctx); +} static INLINE void P(thumb2_do_it)(tdis_ctx ctx) { uint32_t op = ctx->base.op; |