mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 10:49:34 +02:00
Merge remote-tracking branch 'origin/GP-2490_Dan_fixEmuAccessEdgeRanges'
This commit is contained in:
commit
74591aab76
1 changed files with 14 additions and 11 deletions
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue