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)));
}
}
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));
}
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)));
}
}
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"));
}
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"));
}
Aggregations