Search in sources :

Example 96 with OperandSize

use of com.google.security.zynamics.reil.OperandSize in project binnavi by google.

the class MtcrfTranslator method translate.

@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
    TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "mtcrf");
    final IOperandTreeNode sourceRegister = instruction.getOperands().get(1).getRootNode().getChildren().get(0);
    final IOperandTreeNode crMask = instruction.getOperands().get(0).getRootNode().getChildren().get(0);
    Long baseOffset = instruction.getAddress().toLong() * 0x100;
    final OperandSize bt = OperandSize.BYTE;
    final OperandSize dw = OperandSize.DWORD;
    final String maskVar1 = environment.getNextVariableString();
    final String andVar1 = environment.getNextVariableString();
    final String andVar2 = environment.getNextVariableString();
    final String andVar3 = environment.getNextVariableString();
    final String orVar1 = environment.getNextVariableString();
    final String orVar2 = environment.getNextVariableString();
    final String inverseMask = environment.getNextVariableString();
    // construct mask and inverse mask
    instructions.add(ReilHelpers.createAnd(baseOffset++, dw, sourceRegister.getValue(), dw, Helpers.getCRM(Integer.decode(crMask.getValue())), dw, maskVar1));
    instructions.add(ReilHelpers.createXor(baseOffset++, dw, Helpers.getCRM(Integer.decode(crMask.getValue())), dw, String.valueOf(0xFFFFFFFFL), dw, inverseMask));
    for (int i = 0; i < 31; i++) {
        // compute cr & inverse mask to preserve bits in cr
        instructions.add(ReilHelpers.createBsh(baseOffset++, dw, inverseMask, bt, String.valueOf(i - 31), dw, andVar2));
        instructions.add(ReilHelpers.createAnd(baseOffset++, dw, andVar2, dw, String.valueOf(1L), dw, andVar3));
        instructions.add(ReilHelpers.createAnd(baseOffset++, bt, Helpers.getCRBit(i), bt, andVar3, bt, orVar1));
        // compute reg & mask to propagate only the right bits to cr
        instructions.add(ReilHelpers.createBsh(baseOffset++, dw, maskVar1, bt, String.valueOf(i - 31), dw, andVar1));
        instructions.add(ReilHelpers.createAnd(baseOffset++, dw, andVar1, dw, String.valueOf(1L), dw, orVar2));
        // fill cr
        instructions.add(ReilHelpers.createOr(baseOffset++, bt, orVar1, bt, orVar2, bt, Helpers.getCRBit(i)));
    }
}
Also used : IOperandTreeNode(com.google.security.zynamics.zylib.disassembly.IOperandTreeNode) OperandSize(com.google.security.zynamics.reil.OperandSize)

Example 97 with OperandSize

use of com.google.security.zynamics.reil.OperandSize in project binnavi by google.

the class MtctrTranslator method translate.

@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
    TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "mtctr");
    final IOperandTreeNode sourceRegister = instruction.getOperands().get(1).getRootNode().getChildren().get(0);
    Long baseOffset = instruction.getAddress().toLong() * 0x100;
    final OperandSize dw = OperandSize.DWORD;
    instructions.add(ReilHelpers.createStr(baseOffset++, dw, sourceRegister.getValue(), dw, Helpers.COUNT_REGISTER));
}
Also used : IOperandTreeNode(com.google.security.zynamics.zylib.disassembly.IOperandTreeNode) OperandSize(com.google.security.zynamics.reil.OperandSize)

Example 98 with OperandSize

use of com.google.security.zynamics.reil.OperandSize in project binnavi by google.

the class MtocrfTranslator method translate.

@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
    TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "mtocrf");
    final IOperandTreeNode sourceRegister = instruction.getOperands().get(1).getRootNode().getChildren().get(0);
    final IOperandTreeNode crMask = instruction.getOperands().get(0).getRootNode().getChildren().get(0);
    Long baseOffset = instruction.getAddress().toLong() * 0x100;
    final OperandSize bt = OperandSize.BYTE;
    final OperandSize dw = OperandSize.DWORD;
    final String maskVar1 = environment.getNextVariableString();
    final String andVar1 = environment.getNextVariableString();
    final String andVar2 = environment.getNextVariableString();
    final String andVar3 = environment.getNextVariableString();
    final String orVar1 = environment.getNextVariableString();
    final String orVar2 = environment.getNextVariableString();
    final String inverseMask = environment.getNextVariableString();
    // construct mask and inverse mask
    instructions.add(ReilHelpers.createAnd(baseOffset++, dw, sourceRegister.getValue(), dw, Helpers.getCRM(Integer.decode(crMask.getValue())), dw, maskVar1));
    instructions.add(ReilHelpers.createXor(baseOffset++, dw, Helpers.getCRM(Integer.decode(crMask.getValue())), dw, String.valueOf(0xFFFFFFFFL), dw, inverseMask));
    for (int i = 0; i < 31; i++) {
        // compute cr & inverse mask to preserve bits in cr
        instructions.add(ReilHelpers.createBsh(baseOffset++, dw, inverseMask, bt, String.valueOf(i - 31), dw, andVar2));
        instructions.add(ReilHelpers.createAnd(baseOffset++, dw, andVar2, dw, String.valueOf(1L), dw, andVar3));
        instructions.add(ReilHelpers.createAnd(baseOffset++, bt, Helpers.getCRBit(i), bt, andVar3, bt, orVar1));
        // compute reg & mask to propagate only the right bits to cr
        instructions.add(ReilHelpers.createBsh(baseOffset++, dw, maskVar1, bt, String.valueOf(i - 31), dw, andVar1));
        instructions.add(ReilHelpers.createAnd(baseOffset++, dw, andVar1, dw, String.valueOf(1L), dw, orVar2));
        // fill cr
        instructions.add(ReilHelpers.createOr(baseOffset++, bt, orVar1, bt, orVar2, bt, Helpers.getCRBit(i)));
    }
}
Also used : IOperandTreeNode(com.google.security.zynamics.zylib.disassembly.IOperandTreeNode) OperandSize(com.google.security.zynamics.reil.OperandSize)

Example 99 with OperandSize

use of com.google.security.zynamics.reil.OperandSize in project binnavi by google.

the class Mtsprg0Translator method translate.

@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
    TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "mtsprg0");
    final IOperandTreeNode sourceRegister = instruction.getOperands().get(0).getRootNode().getChildren().get(0);
    Long baseOffset = instruction.getAddress().toLong() * 0x100;
    final OperandSize dw = OperandSize.DWORD;
    instructions.add(ReilHelpers.createStr(baseOffset++, dw, sourceRegister.getValue(), dw, "SPRG0"));
}
Also used : IOperandTreeNode(com.google.security.zynamics.zylib.disassembly.IOperandTreeNode) OperandSize(com.google.security.zynamics.reil.OperandSize)

Example 100 with OperandSize

use of com.google.security.zynamics.reil.OperandSize in project binnavi by google.

the class Mtsrr1Translator method translate.

@Override
public void translate(final ITranslationEnvironment environment, final IInstruction instruction, final List<ReilInstruction> instructions) throws InternalTranslationException {
    TranslationHelpers.checkTranslationArguments(environment, instruction, instructions, "mtsrr1");
    final IOperandTreeNode sourceRegister = instruction.getOperands().get(0).getRootNode().getChildren().get(0);
    Long baseOffset = instruction.getAddress().toLong() * 0x100;
    final OperandSize dw = OperandSize.DWORD;
    instructions.add(ReilHelpers.createStr(baseOffset++, dw, sourceRegister.getValue(), dw, "SRR1"));
}
Also used : IOperandTreeNode(com.google.security.zynamics.zylib.disassembly.IOperandTreeNode) OperandSize(com.google.security.zynamics.reil.OperandSize)

Aggregations

OperandSize (com.google.security.zynamics.reil.OperandSize)442 IOperandTreeNode (com.google.security.zynamics.zylib.disassembly.IOperandTreeNode)257 IOperandTree (com.google.security.zynamics.zylib.disassembly.IOperandTree)53 InternalTranslationException (com.google.security.zynamics.reil.translators.InternalTranslationException)46 TranslationResult (com.google.security.zynamics.reil.translators.TranslationResult)45 ReilInstruction (com.google.security.zynamics.reil.ReilInstruction)16 ArrayList (java.util.ArrayList)15 BigInteger (java.math.BigInteger)12 CAddress (com.google.security.zynamics.zylib.disassembly.CAddress)5 OperandType (com.google.security.zynamics.reil.OperandType)2 ReilOperandNode (com.google.security.zynamics.reil.ReilOperandNode)2 TranslationResultType (com.google.security.zynamics.reil.translators.TranslationResultType)2 ReilBlock (com.google.security.zynamics.reil.ReilBlock)1 ReilEdge (com.google.security.zynamics.reil.ReilEdge)1 ReilGraph (com.google.security.zynamics.reil.ReilGraph)1 ReilOperand (com.google.security.zynamics.reil.ReilOperand)1 Pair (com.google.security.zynamics.zylib.general.Pair)1 EdgeType (com.google.security.zynamics.zylib.gui.zygraph.edges.EdgeType)1 HashMap (java.util.HashMap)1 StringTokenizer (java.util.StringTokenizer)1