From c50a4e282a7394eb4e728a35cb27d9cf21156312 Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Mon, 2 Aug 2021 12:33:50 -0400 Subject: [PATCH] GP-1058: Added another test case. --- .../exec/trace/TracePcodeEmulatorTest.java | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/pcode/exec/trace/TracePcodeEmulatorTest.java b/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/pcode/exec/trace/TracePcodeEmulatorTest.java index 619ef81d4f..568c3ad71f 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/pcode/exec/trace/TracePcodeEmulatorTest.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/test/java/ghidra/pcode/exec/trace/TracePcodeEmulatorTest.java @@ -329,7 +329,6 @@ public class TracePcodeEmulatorTest extends AbstractGhidraHeadlessIntegrationTes @Test public void testBRDS() throws Throwable { try (ToyDBTraceBuilder tb = new ToyDBTraceBuilder("Test", "Toy:BE:64:default")) { - Assembler asm = Assemblers.getAssembler(tb.trace.getFixedProgramView(0)); TraceThread thread = initTrace(tb, List.of( "pc = 0x00400000;", @@ -668,4 +667,42 @@ public class TracePcodeEmulatorTest extends AbstractGhidraHeadlessIntegrationTes TraceSleighUtils.evaluate("XMM0", tb.trace, 1, thread, 0)); } } + + /** + * ( Test x86's SAR instruction + * + *

+ * This test hits an INT_SRIGHT p-code op where the two input operands have differing sizes. + */ + @Test + public void testSAR() throws Throwable { + try (ToyDBTraceBuilder tb = new ToyDBTraceBuilder("Test", "x86:LE:64:default")) { + Register pc = tb.language.getProgramCounter(); + + TraceThread thread = initTrace(tb, + List.of( + "RIP = 0x00400000;", + "RSP = 0x00110000;", + "RAX = 0x7fffffff;", + "RCX = 4;"), + List.of( + "SAR EAX, CL")); + + TracePcodeEmulator emu = new TracePcodeEmulator(tb.trace, 0); + PcodeThread emuThread = emu.newThread(thread.getPath()); + emuThread.overrideContextWithDefault(); + emuThread.stepInstruction(); + + assertEquals(tb.addr(0x00400002), emuThread.getCounter()); + assertArrayEquals(tb.arr(0x02, 0, 0x40, 0, 0, 0, 0, 0), + emuThread.getState().getVar(pc)); + + try (UndoableTransaction tid = tb.startTransaction()) { + emu.writeDown(tb.trace, 1, 1, false); + } + + assertEquals(BigInteger.valueOf(0x7ffffff), + TraceSleighUtils.evaluate("RAX", tb.trace, 1, thread, 0)); + } + } }