From 802a7869f1f65c7c7b919f5baa98ce9799371a2b Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Wed, 28 Jul 2021 10:38:31 -0400 Subject: [PATCH] GP-1058: Adding sizein2 to PcodeArithmetic.binaryOp --- .../exec/AsyncWrappedPcodeArithmetic.java | 11 +++---- .../TraceMemoryStatePcodeArithmetic.java | 6 ++-- .../pcode/exec/AddressOfPcodeArithmetic.java | 4 +-- .../pcode/exec/BigIntegerPcodeArithmetic.java | 10 +++---- .../pcode/exec/BytesPcodeArithmetic.java | 29 ++++++++++--------- .../pcode/exec/PairedPcodeArithmetic.java | 14 ++++----- .../ghidra/pcode/exec/PcodeArithmetic.java | 4 +-- .../java/ghidra/pcode/exec/PcodeExecutor.java | 8 ++--- 8 files changed, 44 insertions(+), 42 deletions(-) diff --git a/Ghidra/Debug/Debugger/src/main/java/ghidra/pcode/exec/AsyncWrappedPcodeArithmetic.java b/Ghidra/Debug/Debugger/src/main/java/ghidra/pcode/exec/AsyncWrappedPcodeArithmetic.java index 4f2938d33b..dbe14e5c51 100644 --- a/Ghidra/Debug/Debugger/src/main/java/ghidra/pcode/exec/AsyncWrappedPcodeArithmetic.java +++ b/Ghidra/Debug/Debugger/src/main/java/ghidra/pcode/exec/AsyncWrappedPcodeArithmetic.java @@ -45,15 +45,16 @@ public class AsyncWrappedPcodeArithmetic implements PcodeArithmetic unaryOp(UnaryOpBehavior op, int sizeout, int sizein, + public CompletableFuture unaryOp(UnaryOpBehavior op, int sizeout, int sizein1, CompletableFuture in1) { - return in1.thenApply(t1 -> arithmetic.unaryOp(op, sizeout, sizein, t1)); + return in1.thenApply(t1 -> arithmetic.unaryOp(op, sizeout, sizein1, t1)); } @Override - public CompletableFuture binaryOp(BinaryOpBehavior op, int sizeout, int sizein, - CompletableFuture in1, CompletableFuture in2) { - return in1.thenCombine(in2, (t1, t2) -> arithmetic.binaryOp(op, sizeout, sizein, t1, t2)); + public CompletableFuture binaryOp(BinaryOpBehavior op, int sizeout, int sizein1, + CompletableFuture in1, int sizein2, CompletableFuture in2) { + return in1.thenCombine(in2, + (t1, t2) -> arithmetic.binaryOp(op, sizeout, sizein1, t1, sizein2, t2)); } @Override diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceMemoryStatePcodeArithmetic.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceMemoryStatePcodeArithmetic.java index e4bc75b3cd..ebe7b286ec 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceMemoryStatePcodeArithmetic.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/pcode/exec/trace/TraceMemoryStatePcodeArithmetic.java @@ -26,14 +26,14 @@ public enum TraceMemoryStatePcodeArithmetic implements PcodeArithmetic { INSTANCE; @Override - public Address unaryOp(UnaryOpBehavior op, int sizeout, int sizein, Address in1) { + public Address unaryOp(UnaryOpBehavior op, int sizeout, int sizein1, Address in1) { return null; } @Override - public Address binaryOp(BinaryOpBehavior op, int sizeout, int sizein, Address in1, + public Address binaryOp(BinaryOpBehavior op, int sizeout, int sizein1, Address in1, int sizein2, Address in2) { return null; } diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BigIntegerPcodeArithmetic.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BigIntegerPcodeArithmetic.java index 1bb18b9ab5..0a510f289b 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BigIntegerPcodeArithmetic.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BigIntegerPcodeArithmetic.java @@ -24,14 +24,14 @@ public enum BigIntegerPcodeArithmetic implements PcodeArithmetic { INSTANCE; @Override - public BigInteger unaryOp(UnaryOpBehavior op, int sizeout, int sizein, BigInteger in1) { - return op.evaluateUnary(sizeout, sizein, in1); + public BigInteger unaryOp(UnaryOpBehavior op, int sizeout, int sizein1, BigInteger in1) { + return op.evaluateUnary(sizeout, sizein1, in1); } @Override - public BigInteger binaryOp(BinaryOpBehavior op, int sizeout, int sizein, BigInteger in1, - BigInteger in2) { - return op.evaluateBinary(sizeout, sizein, in1, in2); + public BigInteger binaryOp(BinaryOpBehavior op, int sizeout, int sizein1, BigInteger in1, + int sizein2, BigInteger in2) { + return op.evaluateBinary(sizeout, sizein1, in1, in2); } @Override diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BytesPcodeArithmetic.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BytesPcodeArithmetic.java index b4ecfaf86b..0d82d0f200 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BytesPcodeArithmetic.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/BytesPcodeArithmetic.java @@ -40,31 +40,32 @@ public enum BytesPcodeArithmetic implements PcodeArithmetic { } @Override - public byte[] unaryOp(UnaryOpBehavior op, int sizeout, int sizein, byte[] in1) { - if (sizein > 8 || sizeout > 8) { - BigInteger in1Val = Utils.bytesToBigInteger(in1, sizein, isBigEndian, false); - BigInteger outVal = op.evaluateUnary(sizeout, sizein, in1Val); + public byte[] unaryOp(UnaryOpBehavior op, int sizeout, int sizein1, byte[] in1) { + if (sizein1 > 8 || sizeout > 8) { + BigInteger in1Val = Utils.bytesToBigInteger(in1, in1.length, isBigEndian, false); + BigInteger outVal = op.evaluateUnary(sizeout, sizein1, in1Val); return Utils.bigIntegerToBytes(outVal, sizeout, isBigEndian); } else { - long in1Val = Utils.bytesToLong(in1, sizein, isBigEndian); - long outVal = op.evaluateUnary(sizeout, sizein, in1Val); + long in1Val = Utils.bytesToLong(in1, sizein1, isBigEndian); + long outVal = op.evaluateUnary(sizeout, sizein1, in1Val); return Utils.longToBytes(outVal, sizeout, isBigEndian); } } @Override - public byte[] binaryOp(BinaryOpBehavior op, int sizeout, int sizein, byte[] in1, byte[] in2) { - if (sizein > 8 || sizeout > 8) { - BigInteger in1Val = Utils.bytesToBigInteger(in1, sizein, isBigEndian, false); - BigInteger in2Val = Utils.bytesToBigInteger(in2, sizein, isBigEndian, false); - BigInteger outVal = op.evaluateBinary(sizeout, sizein, in1Val, in2Val); + public byte[] binaryOp(BinaryOpBehavior op, int sizeout, int sizein1, byte[] in1, int sizein2, + byte[] in2) { + if (sizein1 > 8 || sizeout > 8) { + BigInteger in1Val = Utils.bytesToBigInteger(in1, sizein1, isBigEndian, false); + BigInteger in2Val = Utils.bytesToBigInteger(in2, sizein2, isBigEndian, false); + BigInteger outVal = op.evaluateBinary(sizeout, sizein1, in1Val, in2Val); return Utils.bigIntegerToBytes(outVal, sizeout, isBigEndian); } else { - long in1Val = Utils.bytesToLong(in1, sizein, isBigEndian); - long in2Val = Utils.bytesToLong(in2, sizein, isBigEndian); - long outVal = op.evaluateBinary(sizeout, sizein, in1Val, in2Val); + long in1Val = Utils.bytesToLong(in1, sizein1, isBigEndian); + long in2Val = Utils.bytesToLong(in2, sizein2, isBigEndian); + long outVal = op.evaluateBinary(sizeout, sizein1, in1Val, in2Val); return Utils.longToBytes(outVal, sizeout, isBigEndian); } } diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PairedPcodeArithmetic.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PairedPcodeArithmetic.java index 6b93a88509..e12fe73794 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PairedPcodeArithmetic.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PairedPcodeArithmetic.java @@ -45,18 +45,18 @@ public class PairedPcodeArithmetic implements PcodeArithmetic> } @Override - public Pair unaryOp(UnaryOpBehavior op, int sizeout, int sizein, Pair in1) { + public Pair unaryOp(UnaryOpBehavior op, int sizeout, int sizein1, Pair in1) { return new ImmutablePair<>( - leftArith.unaryOp(op, sizeout, sizein, in1.getLeft()), - rightArith.unaryOp(op, sizeout, sizein, in1.getRight())); + leftArith.unaryOp(op, sizeout, sizein1, in1.getLeft()), + rightArith.unaryOp(op, sizeout, sizein1, in1.getRight())); } @Override - public Pair binaryOp(BinaryOpBehavior op, int sizeout, int sizein, Pair in1, - Pair in2) { + public Pair binaryOp(BinaryOpBehavior op, int sizeout, int sizein1, Pair in1, + int sizein2, Pair in2) { return new ImmutablePair<>( - leftArith.binaryOp(op, sizeout, sizein, in1.getLeft(), in2.getLeft()), - rightArith.binaryOp(op, sizeout, sizein, in2.getRight(), in2.getRight())); + leftArith.binaryOp(op, sizeout, sizein1, in1.getLeft(), sizein2, in2.getLeft()), + rightArith.binaryOp(op, sizeout, sizein1, in2.getRight(), sizein2, in2.getRight())); } @Override diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PcodeArithmetic.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PcodeArithmetic.java index add7bf045d..735aa42593 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PcodeArithmetic.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PcodeArithmetic.java @@ -25,9 +25,9 @@ public interface PcodeArithmetic { PcodeArithmetic BYTES_LE = BytesPcodeArithmetic.LITTLE_ENDIAN; PcodeArithmetic BIGINT = BigIntegerPcodeArithmetic.INSTANCE; - T unaryOp(UnaryOpBehavior op, int sizeout, int sizein, T in1); + T unaryOp(UnaryOpBehavior op, int sizeout, int sizein1, T in1); - T binaryOp(BinaryOpBehavior op, int sizeout, int sizein, T in1, T in2); + T binaryOp(BinaryOpBehavior op, int sizeout, int sizein1, T in1, int sizein2, T in2); T fromConst(long value, int size); diff --git a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PcodeExecutor.java b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PcodeExecutor.java index b0365f9e68..9145bfd3cd 100644 --- a/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PcodeExecutor.java +++ b/Ghidra/Debug/ProposedUtils/src/main/java/ghidra/pcode/exec/PcodeExecutor.java @@ -105,8 +105,8 @@ public class PcodeExecutor { Varnode in1Var = op.getInput(0); Varnode outVar = op.getOutput(); T in1 = state.getVar(in1Var); - T out = - arithmetic.unaryOp((UnaryOpBehavior) b, outVar.getSize(), in1Var.getSize(), in1); + T out = arithmetic.unaryOp((UnaryOpBehavior) b, outVar.getSize(), + in1Var.getSize(), in1); state.setVar(outVar, out); return; } @@ -116,8 +116,8 @@ public class PcodeExecutor { Varnode outVar = op.getOutput(); T in1 = state.getVar(in1Var); T in2 = state.getVar(in2Var); - T out = arithmetic.binaryOp((BinaryOpBehavior) b, outVar.getSize(), in1Var.getSize(), - in1, in2); + T out = arithmetic.binaryOp((BinaryOpBehavior) b, outVar.getSize(), + in1Var.getSize(), in1, in2Var.getSize(), in2); state.setVar(outVar, out); return; }