mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
GP-1650: Introduce Reason for reading state. Fix spurrious uninit warnings.
This commit is contained in:
parent
45165ea167
commit
dcd54c6695
44 changed files with 224 additions and 151 deletions
|
@ -41,14 +41,14 @@ public abstract class AbstractCheckedTraceCachedWriteBytesPcodeExecutorStatePiec
|
|||
}
|
||||
|
||||
@Override
|
||||
public byte[] read(long offset, int size) {
|
||||
public byte[] read(long offset, int size, Reason reason) {
|
||||
RangeSet<UnsignedLong> uninitialized =
|
||||
bytes.getUninitialized(offset, offset + size - 1);
|
||||
if (!uninitialized.isEmpty()) {
|
||||
size = checkUninitialized(backing, space.getAddress(offset), size,
|
||||
addrSet(uninitialized));
|
||||
}
|
||||
return super.read(offset, size);
|
||||
return super.read(offset, size, reason);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ public class DirectBytesTracePcodeExecutorStatePiece
|
|||
}
|
||||
|
||||
@Override
|
||||
protected byte[] getUnique(long offset, int size) {
|
||||
protected byte[] getUnique(long offset, int size, Reason reason) {
|
||||
byte[] data = new byte[size];
|
||||
unique.getData(offset, data);
|
||||
return data;
|
||||
|
@ -120,7 +120,7 @@ public class DirectBytesTracePcodeExecutorStatePiece
|
|||
}
|
||||
|
||||
@Override
|
||||
protected byte[] getFromSpace(AddressSpace space, long offset, int size) {
|
||||
protected byte[] getFromSpace(AddressSpace space, long offset, int size, Reason reason) {
|
||||
ByteBuffer buf = ByteBuffer.allocate(size);
|
||||
int read = data.getBytes(space.getAddress(offset), buf);
|
||||
if (read != size) {
|
||||
|
|
|
@ -78,7 +78,7 @@ public class TraceMemoryStatePcodeExecutorStatePiece extends
|
|||
}
|
||||
|
||||
@Override
|
||||
protected TraceMemoryState getUnique(long offset, int size) {
|
||||
protected TraceMemoryState getUnique(long offset, int size, Reason reason) {
|
||||
RangeSet<UnsignedLong> remains = TreeRangeSet.create();
|
||||
Range<UnsignedLong> range = range(offset, size);
|
||||
remains.add(range);
|
||||
|
@ -106,12 +106,13 @@ public class TraceMemoryStatePcodeExecutorStatePiece extends
|
|||
}
|
||||
|
||||
@Override
|
||||
protected TraceMemoryState getFromSpace(AddressSpace space, long offset, int size) {
|
||||
protected TraceMemoryState getFromSpace(AddressSpace space, long offset, int size,
|
||||
Reason reason) {
|
||||
return data.getViewportState(range(space, offset, size));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TraceMemoryState getFromNullSpace(int size) {
|
||||
protected TraceMemoryState getFromNullSpace(int size, Reason reason) {
|
||||
return TraceMemoryState.UNKNOWN;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||
|
||||
import ghidra.app.plugin.processors.sleigh.SleighLanguage;
|
||||
import ghidra.pcode.exec.*;
|
||||
import ghidra.pcode.exec.PcodeExecutorStatePiece.Reason;
|
||||
import ghidra.pcode.utils.Utils;
|
||||
import ghidra.program.model.address.AddressRange;
|
||||
import ghidra.program.model.address.AddressSpace;
|
||||
|
@ -61,7 +62,7 @@ public enum TraceSleighUtils {
|
|||
throw new IllegalArgumentException("TracePlatform must use a SLEIGH language");
|
||||
}
|
||||
return new PcodeExecutor<>((SleighLanguage) language,
|
||||
BytesPcodeArithmetic.forLanguage(language), state);
|
||||
BytesPcodeArithmetic.forLanguage(language), state, Reason.INSPECT);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -102,7 +103,7 @@ public enum TraceSleighUtils {
|
|||
}
|
||||
return new PcodeExecutor<>((SleighLanguage) language, new PairedPcodeArithmetic<>(
|
||||
BytesPcodeArithmetic.forLanguage(language), TraceMemoryStatePcodeArithmetic.INSTANCE),
|
||||
paired);
|
||||
paired, Reason.INSPECT);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -29,13 +29,12 @@ import com.google.common.collect.Range;
|
|||
|
||||
import ghidra.app.plugin.assembler.*;
|
||||
import ghidra.app.plugin.assembler.sleigh.sem.AssemblyPatternBlock;
|
||||
import ghidra.app.plugin.processors.sleigh.SleighLanguage;
|
||||
import ghidra.dbg.target.schema.SchemaContext;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema.SchemaName;
|
||||
import ghidra.dbg.target.schema.XmlSchemaContext;
|
||||
import ghidra.lifecycle.Unfinished;
|
||||
import ghidra.pcode.emu.PcodeThread;
|
||||
import ghidra.pcode.exec.*;
|
||||
import ghidra.pcode.exec.PcodeExecutorStatePiece.Reason;
|
||||
import ghidra.pcode.exec.trace.data.PcodeTraceDataAccess;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.address.AddressRangeImpl;
|
||||
|
@ -158,7 +157,7 @@ public class BytesTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest
|
|||
|
||||
assertEquals(tb.addr(0x00400007), emuThread.getCounter());
|
||||
assertArrayEquals(tb.arr(0x07, 0, 0x40, 0, 0, 0, 0, 0),
|
||||
emuThread.getState().getVar(pc));
|
||||
emuThread.getState().getVar(pc, Reason.INSPECT));
|
||||
|
||||
emuThread.stepInstruction();
|
||||
|
||||
|
@ -220,11 +219,11 @@ public class BytesTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest
|
|||
|
||||
assertEquals(tb.addr(0x00401000), emuThread.getCounter());
|
||||
assertArrayEquals(tb.arr(0, 0x10, 0x40, 0),
|
||||
emuThread.getState().getVar(pc));
|
||||
emuThread.getState().getVar(pc, Reason.INSPECT));
|
||||
assertEquals(new RegisterValue(ctxreg, BigInteger.valueOf(0x8000_0000_0000_0000L)),
|
||||
emuThread.getContext());
|
||||
assertArrayEquals(tb.arr(0x80, 0, 0, 0, 0, 0, 0, 0),
|
||||
emuThread.getState().getVar(ctxreg));
|
||||
emuThread.getState().getVar(ctxreg, Reason.INSPECT));
|
||||
|
||||
emuThread.stepInstruction();
|
||||
|
||||
|
@ -610,7 +609,7 @@ public class BytesTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest
|
|||
|
||||
assertEquals(tb.addr(0x00400007), emuThread.getCounter());
|
||||
assertArrayEquals(tb.arr(0x07, 0, 0x40, 0, 0, 0, 0, 0),
|
||||
emuThread.getState().getVar(pc));
|
||||
emuThread.getState().getVar(pc, Reason.INSPECT));
|
||||
|
||||
try (UndoableTransaction tid = tb.startTransaction()) {
|
||||
emu.writeDown(tb.host, 1, 1);
|
||||
|
@ -647,7 +646,7 @@ public class BytesTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest
|
|||
|
||||
assertEquals(tb.addr(0x00400002), emuThread.getCounter());
|
||||
assertArrayEquals(tb.arr(0x02, 0, 0x40, 0, 0, 0, 0, 0),
|
||||
emuThread.getState().getVar(pc));
|
||||
emuThread.getState().getVar(pc, Reason.INSPECT));
|
||||
|
||||
try (UndoableTransaction tid = tb.startTransaction()) {
|
||||
emu.writeDown(tb.host, 1, 1);
|
||||
|
|
|
@ -26,6 +26,7 @@ import org.junit.Test;
|
|||
|
||||
import ghidra.app.plugin.processors.sleigh.SleighLanguage;
|
||||
import ghidra.pcode.exec.*;
|
||||
import ghidra.pcode.exec.PcodeExecutorStatePiece.Reason;
|
||||
import ghidra.program.model.lang.*;
|
||||
import ghidra.program.util.DefaultLanguageService;
|
||||
import ghidra.test.AbstractGhidraHeadlessIntegrationTest;
|
||||
|
@ -220,7 +221,8 @@ public class TraceSleighUtilsTest extends AbstractGhidraHeadlessIntegrationTest
|
|||
PcodeExecutor<byte[]> executor =
|
||||
new PcodeExecutor<>(sp.getLanguage(),
|
||||
BytesPcodeArithmetic.forLanguage(b.language),
|
||||
new DirectBytesTracePcodeExecutorState(b.host, 0, thread, 0));
|
||||
new DirectBytesTracePcodeExecutorState(b.host, 0, thread, 0),
|
||||
Reason.EXECUTE);
|
||||
sp.execute(executor, PcodeUseropLibrary.nil());
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ import ghidra.app.plugin.processors.sleigh.SleighLanguage;
|
|||
import ghidra.pcode.emu.PcodeThread;
|
||||
import ghidra.pcode.emu.ThreadPcodeExecutorState;
|
||||
import ghidra.pcode.exec.*;
|
||||
import ghidra.pcode.exec.PcodeExecutorStatePiece.Reason;
|
||||
import ghidra.program.model.address.Address;
|
||||
import ghidra.program.model.lang.RegisterValue;
|
||||
import ghidra.program.model.listing.Instruction;
|
||||
|
@ -61,7 +62,7 @@ class TestThread implements PcodeThread<Void> {
|
|||
@Override
|
||||
public PcodeExecutor<Void> getExecutor() {
|
||||
return new PcodeExecutor<>(TraceScheduleTest.TOY_BE_64_LANG, machine.getArithmetic(),
|
||||
getState()) {
|
||||
getState(), Reason.EXECUTE) {
|
||||
public PcodeFrame execute(PcodeProgram program, PcodeUseropLibrary<Void> library) {
|
||||
machine.record.add("x:" + name);
|
||||
// TODO: Verify the actual effect
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue