Merge remote-tracking branch 'origin/GP-2490_Dan_fixEmuAccessEdgeRanges'

This commit is contained in:
Ryan Kurtz 2022-08-23 11:39:14 -04:00
commit 74591aab76

View file

@ -23,8 +23,7 @@ import com.google.common.primitives.UnsignedLong;
import ghidra.pcode.exec.AbstractBytesPcodeExecutorStatePiece; import ghidra.pcode.exec.AbstractBytesPcodeExecutorStatePiece;
import ghidra.pcode.exec.BytesPcodeExecutorStateSpace; import ghidra.pcode.exec.BytesPcodeExecutorStateSpace;
import ghidra.pcode.exec.trace.BytesTracePcodeExecutorStatePiece.CachedSpace; import ghidra.pcode.exec.trace.BytesTracePcodeExecutorStatePiece.CachedSpace;
import ghidra.program.model.address.AddressSet; import ghidra.program.model.address.*;
import ghidra.program.model.address.AddressSpace;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.trace.model.memory.TraceMemorySpace; import ghidra.trace.model.memory.TraceMemorySpace;
@ -58,7 +57,7 @@ public class BytesTracePcodeExecutorStatePiece
} }
protected static class CachedSpace extends BytesPcodeExecutorStateSpace<TraceMemorySpace> { protected static class CachedSpace extends BytesPcodeExecutorStateSpace<TraceMemorySpace> {
protected final RangeSet<UnsignedLong> written = TreeRangeSet.create(); protected final AddressSet written = new AddressSet();
protected final long snap; protected final long snap;
public CachedSpace(Language language, AddressSpace space, TraceMemorySpace backing, public CachedSpace(Language language, AddressSpace space, TraceMemorySpace backing,
@ -70,9 +69,15 @@ public class BytesTracePcodeExecutorStatePiece
@Override @Override
public void write(long offset, byte[] val, int srcOffset, int length) { public void write(long offset, byte[] val, int srcOffset, int length) {
super.write(offset, val, srcOffset, length); super.write(offset, val, srcOffset, length);
UnsignedLong uLoc = UnsignedLong.fromLongBits(offset); Address loc = space.getAddress(offset);
UnsignedLong uEnd = UnsignedLong.fromLongBits(offset + length); Address end = loc.addWrap(length);
written.add(Range.closedOpen(uLoc, uEnd)); if (loc.compareTo(end) <= 0) {
written.add(loc, end);
}
else {
written.add(loc, space.getMaxAddress());
written.add(space.getMinAddress(), end);
}
} }
@Override @Override
@ -108,11 +113,9 @@ public class BytesTracePcodeExecutorStatePiece
ByteBuffer buf = ByteBuffer.wrap(data); ByteBuffer buf = ByteBuffer.wrap(data);
TraceMemorySpace mem = TraceMemorySpace mem =
TraceSleighUtils.getSpaceForExecution(space, trace, thread, frame, true); TraceSleighUtils.getSpaceForExecution(space, trace, thread, frame, true);
for (Range<UnsignedLong> range : written.asRanges()) { for (AddressRange range : written) {
assert range.lowerBoundType() == BoundType.CLOSED; long lower = range.getMinAddress().getOffset();
assert range.upperBoundType() == BoundType.OPEN; long fullLen = range.getLength();
long lower = range.lowerEndpoint().longValue();
long fullLen = range.upperEndpoint().longValue() - lower;
while (fullLen > 0) { while (fullLen > 0) {
int len = MathUtilities.unsignedMin(data.length, fullLen); int len = MathUtilities.unsignedMin(data.length, fullLen);
bytes.getData(lower, data, 0, len); bytes.getData(lower, data, 0, len);