From: <mic...@us...> - 2007-06-19 12:24:54
|
Revision: 135 http://svn.sourceforge.net/pearcolator/?rev=135&view=rev Author: michael_baer Date: 2007-06-19 05:24:56 -0700 (Tue, 19 Jun 2007) Log Message: ----------- Added a Null-Object for undefined instructions, instead of returning null from the decoder. Modified Paths: -------------- src/org/binarytranslator/arch/arm/decoder/ARM_Disassembler.java src/org/binarytranslator/arch/arm/decoder/ARM_InstructionDecoder.java src/org/binarytranslator/arch/arm/decoder/ARM_Instructions.java src/org/binarytranslator/arch/arm/decoder/ARM_Translator.java Modified: src/org/binarytranslator/arch/arm/decoder/ARM_Disassembler.java =================================================================== --- src/org/binarytranslator/arch/arm/decoder/ARM_Disassembler.java 2007-06-19 09:10:03 UTC (rev 134) +++ src/org/binarytranslator/arch/arm/decoder/ARM_Disassembler.java 2007-06-19 12:24:56 UTC (rev 135) @@ -17,6 +17,7 @@ import org.binarytranslator.arch.arm.decoder.ARM_Instructions.SoftwareInterrupt; import org.binarytranslator.arch.arm.decoder.ARM_Instructions.Swap; import org.binarytranslator.arch.arm.decoder.ARM_Instructions.ARM_InstructionVisitor; +import org.binarytranslator.arch.arm.decoder.ARM_Instructions.UndefinedInstruction; import org.binarytranslator.arch.arm.decoder.ARM_Instructions.Instruction.Condition; import org.binarytranslator.arch.arm.os.process.ARM_ProcessSpace; import org.binarytranslator.generic.decoder.DisassembledInstruction; @@ -438,5 +439,9 @@ setResult(String.format("MSR%s %s, %s", cond(instr), fields, operand(instr.getSource()))); } + + public void visit(UndefinedInstruction instr) { + setResult("--- (Undefined " + (instr.isThumb ? "Thumb" : "ARM") + " instruction, code 0x" + Integer.toHexString(instr.binaryInstruction) + ")"); + } } } Modified: src/org/binarytranslator/arch/arm/decoder/ARM_InstructionDecoder.java =================================================================== --- src/org/binarytranslator/arch/arm/decoder/ARM_InstructionDecoder.java 2007-06-19 09:10:03 UTC (rev 134) +++ src/org/binarytranslator/arch/arm/decoder/ARM_InstructionDecoder.java 2007-06-19 12:24:56 UTC (rev 135) @@ -582,7 +582,7 @@ } public Instruction createUndefinedInstruction(int instr) { - return null; + return new UndefinedInstruction(instr); } public Instruction createBlockDataTransfer(short instr) { @@ -638,7 +638,7 @@ } public Instruction createUndefinedInstruction(short instr) { - return null; + return new UndefinedInstruction(instr); } public Instruction createIntMultiply(short instr) { Modified: src/org/binarytranslator/arch/arm/decoder/ARM_Instructions.java =================================================================== --- src/org/binarytranslator/arch/arm/decoder/ARM_Instructions.java 2007-06-19 09:10:03 UTC (rev 134) +++ src/org/binarytranslator/arch/arm/decoder/ARM_Instructions.java 2007-06-19 12:24:56 UTC (rev 135) @@ -47,6 +47,11 @@ this.isThumb = false; } + public Instruction(boolean isThumb) { + condition = Condition.AL; + this.isThumb = isThumb; + } + public final int size() { return isThumb ? 2 : 4; } @@ -1674,9 +1679,31 @@ } } + public static class UndefinedInstruction extends Instruction { + + protected final int binaryInstruction; + + public UndefinedInstruction(short instruction) { + super(false); + this.binaryInstruction = instruction; + } + + public UndefinedInstruction(int instruction) { + super(true); + this.binaryInstruction = instruction; + } + + @Override + public void visit(ARM_InstructionVisitor visitor) { + visitor.visit(this); + } + + } + public interface ARM_InstructionVisitor { void visit(DataProcessing instr); + void visit(UndefinedInstruction instr); void visit(SingleDataTransfer instr); void visit(IntMultiply instr); void visit(LongMultiply instr); Modified: src/org/binarytranslator/arch/arm/decoder/ARM_Translator.java =================================================================== --- src/org/binarytranslator/arch/arm/decoder/ARM_Translator.java 2007-06-19 09:10:03 UTC (rev 134) +++ src/org/binarytranslator/arch/arm/decoder/ARM_Translator.java 2007-06-19 12:24:56 UTC (rev 135) @@ -1737,16 +1737,27 @@ } public void translate() { - + + + //if we're supposed to link, then write the previous address into the link register + if (i.link) { + arm2ir.appendInstruction(Move.create(INT_MOVE, arm2ir.getRegister(ARM_Registers.LR), new OPT_IntConstantOperand(pc + 4))); + } + else { + //we should never be returning from the goto + arm2ir.getCurrentBlock().deleteNormalOut(); + } + + //can we pre-calculate to where we're branching? if (i.offset.getType() == OperandWrapper.Type.Immediate) { //we can directly resolve this branch to a fixed address if (i.link) - arm2ir.appendCall( readPC() + i.getOffset().getImmediate(), lazy, pc + i.size()); + arm2ir.appendCall(readPC() + i.getOffset().getImmediate(), lazy, pc + i.size()); else arm2ir.appendBranch(readPC() + i.getOffset().getImmediate(), lazy, BranchType.DIRECT_BRANCH); } else { - + //the branch target is not known at compile time OPT_Operand offset = ResolvedOperand.resolve(ARM_Translator.this, i.offset); OPT_RegisterOperand dest = arm2ir.getTempInt(0); @@ -1759,15 +1770,6 @@ arm2ir.appendBranch(dest, lazy, BranchType.INDIRECT_BRANCH); } } - - //if we're supposed to link, then write the previous address into the link register - if (i.link) { - arm2ir.appendInstruction(Move.create(INT_MOVE, arm2ir.getRegister(ARM_Registers.LR), new OPT_IntConstantOperand(pc + 4))); - } - else { - //we should never be returning from the goto - arm2ir.getCurrentBlock().deleteNormalOut(); - } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |