mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
GP-1560: Add 'Watch' memory and register context actions
This commit is contained in:
parent
4830d035b3
commit
adeefc58c8
14 changed files with 473 additions and 89 deletions
|
@ -24,6 +24,7 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||
import ghidra.app.plugin.processors.sleigh.SleighLanguage;
|
||||
import ghidra.pcode.exec.*;
|
||||
import ghidra.pcode.utils.Utils;
|
||||
import ghidra.program.model.address.AddressRange;
|
||||
import ghidra.program.model.address.AddressSpace;
|
||||
import ghidra.program.model.lang.Language;
|
||||
import ghidra.trace.model.Trace;
|
||||
|
@ -155,4 +156,15 @@ public enum TraceSleighUtils {
|
|||
SleighProgramCompiler.compileExpression((SleighLanguage) language, expr),
|
||||
trace, snap, thread, frame);
|
||||
}
|
||||
|
||||
public static String generateExpressionForRange(Language language, AddressRange range) {
|
||||
AddressSpace space = range.getAddressSpace();
|
||||
long length = range.getLength();
|
||||
long offset = range.getMinAddress().getOffset();
|
||||
int ptrSize = space.getPointerSize();
|
||||
if (language != null && language.getDefaultSpace() == space) {
|
||||
return String.format("*:%d 0x%08x:%d", length, offset, ptrSize);
|
||||
}
|
||||
return String.format("*[%s]:%d 0x%08x:%d", space.getName(), length, offset, ptrSize);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,18 +17,26 @@ package ghidra.trace.model;
|
|||
|
||||
import java.util.Objects;
|
||||
|
||||
import com.google.common.collect.Range;
|
||||
|
||||
import ghidra.trace.database.DBTraceUtils;
|
||||
|
||||
/**
|
||||
* NOTE: This is used to mark <trace,snap>; regardless of whether that snapshot is actually in the
|
||||
* database.... Cannot just use TraceSnapshot here.
|
||||
*/
|
||||
public class DefaultTraceSnap implements TraceSnap {
|
||||
public class DefaultTraceSpan implements TraceSpan {
|
||||
|
||||
private final Trace trace;
|
||||
private final long snap;
|
||||
private final Range<Long> span;
|
||||
|
||||
public DefaultTraceSnap(Trace trace, long snap) {
|
||||
private final int hash;
|
||||
|
||||
public DefaultTraceSpan(Trace trace, Range<Long> span) {
|
||||
this.trace = trace;
|
||||
this.snap = snap;
|
||||
this.span = span;
|
||||
|
||||
this.hash = Objects.hash(trace, span);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -37,13 +45,13 @@ public class DefaultTraceSnap implements TraceSnap {
|
|||
}
|
||||
|
||||
@Override
|
||||
public long getSnap() {
|
||||
return snap;
|
||||
public Range<Long> getSpan() {
|
||||
return span;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TraceSnap<" + trace + ": " + snap + ">";
|
||||
return "TraceSnap<" + trace + ": " + span + ">";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -51,14 +59,14 @@ public class DefaultTraceSnap implements TraceSnap {
|
|||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (!(obj instanceof DefaultTraceSnap)) {
|
||||
if (!(obj instanceof DefaultTraceSpan)) {
|
||||
return false;
|
||||
}
|
||||
DefaultTraceSnap that = (DefaultTraceSnap) obj;
|
||||
DefaultTraceSpan that = (DefaultTraceSpan) obj;
|
||||
if (this.trace != that.trace) {
|
||||
return false;
|
||||
}
|
||||
if (this.snap != that.snap) {
|
||||
if (!Objects.equals(this.span, that.span)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -66,11 +74,11 @@ public class DefaultTraceSnap implements TraceSnap {
|
|||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(trace, snap);
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(TraceSnap that) {
|
||||
public int compareTo(TraceSpan that) {
|
||||
if (this == that) {
|
||||
return 0;
|
||||
}
|
||||
|
@ -79,7 +87,13 @@ public class DefaultTraceSnap implements TraceSnap {
|
|||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
result = Long.compareUnsigned(this.snap, that.getSnap());
|
||||
result = Long.compare(DBTraceUtils.lowerEndpoint(this.span),
|
||||
DBTraceUtils.lowerEndpoint(that.getSpan()));
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
||||
result = Long.compare(DBTraceUtils.upperEndpoint(this.span),
|
||||
DBTraceUtils.upperEndpoint(that.getSpan()));
|
||||
if (result != 0) {
|
||||
return result;
|
||||
}
|
|
@ -15,8 +15,10 @@
|
|||
*/
|
||||
package ghidra.trace.model;
|
||||
|
||||
public interface TraceSnap extends Comparable<TraceSnap> {
|
||||
import com.google.common.collect.Range;
|
||||
|
||||
public interface TraceSpan extends Comparable<TraceSpan> {
|
||||
Trace getTrace();
|
||||
|
||||
long getSnap();
|
||||
Range<Long> getSpan();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue