aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcomex2015-01-13 01:13:19 -0500
committercomex2015-01-13 01:16:42 -0500
commit6e12e61377daad6e9444da718b72a2612fcd2876 (patch)
treec82b1db95b1a1a55ddf468a5364480e1697198aa
parentsmall thumb fixes for Rdn and stuff (diff)
downloadsubstitute-6e12e61377daad6e9444da718b72a2612fcd2876.tar.gz
add a test assembly file, not used yet
-rw-r--r--Makefile7
-rw-r--r--lib/dis-arm.inc.h5
-rw-r--r--test/arm-insns.S48
3 files changed, 59 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 0d26c40..7ec6e53 100644
--- a/Makefile
+++ b/Makefile
@@ -51,6 +51,13 @@ $(eval $(call define_test,find-syms,find-syms,$(CC) -std=c89))
$(eval $(call define_test,find-syms-cpp,find-syms,$(CXX) -x c++ -std=c++98))
$(eval $(call define_test,substrate,substrate,$(CXX) -std=c++98))
+out/arm-insns.o: test/arm-insns.S Makefile
+ clang -arch armv7 -c -o $@ $<
+out/thumb2-insns.o: test/arm-insns.S Makefile
+ clang -arch armv7 -DTHUMB2 -c -o $@ $<
+out/%-insns.bin: out/%-insns.o Makefile
+ segedit -extract __TEXT __text $@ $<
+
generated: Makefile
rm -rf generated
mkdir generated
diff --git a/lib/dis-arm.inc.h b/lib/dis-arm.inc.h
index 88fefb8..68f5015 100644
--- a/lib/dis-arm.inc.h
+++ b/lib/dis-arm.inc.h
@@ -171,11 +171,14 @@ static INLINE tdis_ret P(unk_Rt_13_MRC)(tdis_ctx ctx, struct bitslice Rt) {
}
static INLINE tdis_ret P(GPR_Rn_reglist_regs_16_LDMDA)(tdis_ctx ctx, struct bitslice regs, UNUSED struct bitslice Rn) {
unsigned regs_val = bs_get(regs, ctx->op);
- if(regs_val & (1 << 15))
+ if (regs_val & (1 << 15))
return P(ret)(ctx);
return P(unidentified)(ctx);
}
static INLINE tdis_ret P(GPR_Rn_reglist_regs_S_16_STMDA)(tdis_ctx ctx, UNUSED struct bitslice regs, UNUSED struct bitslice Rn) {
+ unsigned regs_val = bs_get(regs, ctx->op);
+ if (regs_val & (1 << 15))
+ return P(bad)(ctx);
return P(unidentified)(ctx);
}
static INLINE tdis_ret P(GPR_Rt_addr_offset_none_addr_unk_Rd_S_6_STLEX)(tdis_ctx ctx, struct bitslice Rt, struct bitslice Rd, struct bitslice addr) {
diff --git a/test/arm-insns.S b/test/arm-insns.S
new file mode 100644
index 0000000..62b4b48
--- /dev/null
+++ b/test/arm-insns.S
@@ -0,0 +1,48 @@
+#ifdef THUMB2
+.thumb
+.thumb_func
+.syntax unified
+#endif
+.global foo
+foo:
+strex r0, r1, [pc]
+mov r0, pc
+#ifndef THUMB2
+add r0, pc, r1
+add r0, r1, pc
+str pc, [r0], #5
+str pc, [r0], r3
+#endif
+add r0, pc, #123
+mcr p15,0,pc,c14,c3,0
+str r3, [pc, #5]
+str pc, [pc, #5]
+#ifdef THUMB2 // it shouldn't be, though
+strht r0, [r3]
+#endif
+ldr r0, [pc]
+ldr r0, [pc, #5]
+ldr pc, [r0], #5
+ldr pc, [pc]
+#ifndef THUMB2
+ldr pc, [r2], r7
+adr pc, 1f
+#endif
+adr r3, 1f
+
+ldrb r1, [pc]
+ldrsb r1, [pc]
+ldrh r1, [pc]
+ldrsh r1, [pc]
+ldr r1, [pc]
+ldrd r1, r2, [pc]
+str r1, [pc]
+strd r1, r2, [pc]
+
+push {r0-r3, pc}
+push {r0-r3, lr}
+pop {r0-r3, pc}
+
+1:
+.long 0xdeadbeef
+.long 0xdeadbeef