mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 02:39:44 +02:00
GP-2068: Indexing, caching, other optimizations for TraceRmi.
This commit is contained in:
parent
9c6eabfbb3
commit
a41c4ca5f7
63 changed files with 3529 additions and 1167 deletions
|
@ -356,6 +356,7 @@ public class TraceRmiHandler implements TraceRmiConnection {
|
|||
name = object.getName() + "." + nextId;
|
||||
}
|
||||
}
|
||||
name = object.getName() + "." + System.currentTimeMillis();
|
||||
// Don't catch it this last time
|
||||
return parent.createFile(name, object, monitor);
|
||||
}
|
||||
|
@ -948,9 +949,12 @@ public class TraceRmiHandler implements TraceRmiConnection {
|
|||
tx.tx.abortOnClose();
|
||||
}
|
||||
tx.tx.close();
|
||||
OpenTrace open = requireOpenTrace(tx.txId.doId);
|
||||
if (!tx.undoable) {
|
||||
requireOpenTrace(tx.txId.doId).trace.clearUndo();
|
||||
open.trace.clearUndo();
|
||||
}
|
||||
// TODO: Check for other transactions on the same trace?
|
||||
open.trace.setEventsEnabled(true);
|
||||
return ReplyEndTx.getDefaultInstance();
|
||||
}
|
||||
|
||||
|
@ -976,10 +980,11 @@ public class TraceRmiHandler implements TraceRmiConnection {
|
|||
RequestGetValuesIntersecting req) throws AddressOverflowException {
|
||||
OpenTrace open = requireOpenTrace(req.getOid());
|
||||
AddressRange range = open.toRange(req.getBox().getRange(), false);
|
||||
String key = req.getKey() == "" ? null : req.getKey();
|
||||
Collection<? extends TraceObjectValue> col = range == null
|
||||
? List.of()
|
||||
: open.trace.getObjectManager()
|
||||
.getValuesIntersecting(toLifespan(req.getBox().getSpan()), range);
|
||||
.getValuesIntersecting(toLifespan(req.getBox().getSpan()), range, key);
|
||||
return ReplyGetValues.newBuilder()
|
||||
.addAllValues(col.stream().map(TraceRmiHandler::makeValDesc).toList())
|
||||
.build();
|
||||
|
@ -1074,16 +1079,15 @@ public class TraceRmiHandler implements TraceRmiConnection {
|
|||
if (object == null) {
|
||||
return ReplyRetainValues.getDefaultInstance();
|
||||
}
|
||||
Lifespan span = toLifespan(req.getSpan());
|
||||
Collection<? extends TraceObjectValue> values = switch (req.getKinds()) {
|
||||
case VK_ELEMENTS -> object.getElements();
|
||||
case VK_ATTRIBUTES -> object.getAttributes();
|
||||
case VK_BOTH -> object.getValues();
|
||||
case VK_ELEMENTS -> object.getElements(span);
|
||||
case VK_ATTRIBUTES -> object.getAttributes(span);
|
||||
case VK_BOTH -> object.getValues(span);
|
||||
default -> throw new TraceRmiError("Protocol error: Invalid value kinds");
|
||||
};
|
||||
Lifespan span = toLifespan(req.getSpan());
|
||||
Set<String> keysToKeep = Set.copyOf(req.getKeysList());
|
||||
List<String> keysToDelete = values.stream()
|
||||
.filter(v -> v.getLifespan().intersects(span))
|
||||
.map(v -> v.getEntryKey())
|
||||
.filter(k -> !keysToKeep.contains(k))
|
||||
.distinct()
|
||||
|
@ -1123,6 +1127,7 @@ public class TraceRmiHandler implements TraceRmiConnection {
|
|||
// Implies request was to set value to null
|
||||
return ReplySetValue.newBuilder().setSpan(makeSpan(Lifespan.EMPTY)).build();
|
||||
}
|
||||
|
||||
TraceObjectValue val = object.setValue(toLifespan(value.getSpan()), value.getKey(),
|
||||
objVal, toResolution(req.getResolution()));
|
||||
return ReplySetValue.newBuilder()
|
||||
|
@ -1144,6 +1149,7 @@ public class TraceRmiHandler implements TraceRmiConnection {
|
|||
protected ReplyStartTx handleStartTx(RequestStartTx req) {
|
||||
OpenTrace open = requireOpenTrace(req.getOid());
|
||||
Tid tid = requireAvailableTid(open, req.getTxid());
|
||||
open.trace.setEventsEnabled(false);
|
||||
@SuppressWarnings("resource")
|
||||
OpenTx tx =
|
||||
new OpenTx(tid, open.trace.openTransaction(req.getDescription()), req.getUndoable());
|
||||
|
|
|
@ -847,11 +847,10 @@ public class TraceRmiTarget extends AbstractTarget {
|
|||
|
||||
protected TraceObject getProcessForSpace(AddressSpace space) {
|
||||
for (TraceObjectValue objVal : trace.getObjectManager()
|
||||
.getValuesIntersecting(Lifespan.at(getSnap()),
|
||||
new AddressRangeImpl(space.getMinAddress(), space.getMaxAddress()))) {
|
||||
if (!TargetMemoryRegion.RANGE_ATTRIBUTE_NAME.equals(objVal.getEntryKey())) {
|
||||
continue;
|
||||
}
|
||||
.getValuesIntersecting(
|
||||
Lifespan.at(getSnap()),
|
||||
new AddressRangeImpl(space.getMinAddress(), space.getMaxAddress()),
|
||||
TargetMemoryRegion.RANGE_ATTRIBUTE_NAME)) {
|
||||
TraceObject obj = objVal.getParent();
|
||||
if (!obj.getInterfaces().contains(TraceObjectMemoryRegion.class)) {
|
||||
continue;
|
||||
|
|
|
@ -361,6 +361,7 @@ message ReplyGetValues {
|
|||
message RequestGetValuesIntersecting {
|
||||
DomObjId oid = 1;
|
||||
Box box = 2;
|
||||
string key = 3;
|
||||
}
|
||||
|
||||
// Analysis operations
|
||||
|
|
|
@ -389,10 +389,10 @@ class Trace(object):
|
|||
span = Lifespan(self.snap(), self.snap())
|
||||
return self._make_values(self.client._get_values(self.id, span, pattern))
|
||||
|
||||
def get_values_intersecting(self, rng, span=None):
|
||||
def get_values_intersecting(self, rng, span=None, key=""):
|
||||
if span is None:
|
||||
span = Lifespan(self.snap(), self.snap())
|
||||
return self._make_values(self.client._get_values_intersecting(self.id, span, rng))
|
||||
return self._make_values(self.client._get_values_intersecting(self.id, span, rng, key))
|
||||
|
||||
def _activate_object(self, object):
|
||||
self.client._activate_object(self.id, object)
|
||||
|
@ -1053,11 +1053,12 @@ class Client(object):
|
|||
return self._read_values(reply)
|
||||
return self._batch_or_now(root, 'reply_get_values', _handle)
|
||||
|
||||
def _get_values_intersecting(self, id, span, rng):
|
||||
def _get_values_intersecting(self, id, span, rng, key):
|
||||
root = bufs.RootMessage()
|
||||
root.request_get_values_intersecting.oid.id = id
|
||||
self._write_span(root.request_get_values_intersecting.box.span, span)
|
||||
self._write_range(root.request_get_values_intersecting.box.range, rng)
|
||||
root.request_get_values_intersecting.key = key
|
||||
|
||||
def _handle(reply):
|
||||
return self._read_values(reply)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue