From 6e12e61377daad6e9444da718b72a2612fcd2876 Mon Sep 17 00:00:00 2001 From: comex Date: Tue, 13 Jan 2015 01:13:19 -0500 Subject: add a test assembly file, not used yet --- Makefile | 7 +++++++ lib/dis-arm.inc.h | 5 ++++- test/arm-insns.S | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 test/arm-insns.S 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 -- cgit v1.2.3