mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-06 03:50:02 +02:00
GP-704: Converting models to a push-centric comm pattern.
This commit is contained in:
parent
dd37995833
commit
5bb6f95a84
95 changed files with 2348 additions and 1635 deletions
|
@ -16,20 +16,27 @@
|
|||
package agent.dbgmodel.model.impl;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import org.jdom.JDOMException;
|
||||
|
||||
import agent.dbgeng.manager.impl.DbgManagerImpl;
|
||||
import agent.dbgeng.model.AbstractDbgModel;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetObject;
|
||||
import agent.dbgeng.model.iface2.DbgModelTargetSession;
|
||||
import agent.dbgmodel.manager.DbgManager2Impl;
|
||||
import ghidra.dbg.agent.AbstractTargetObject;
|
||||
import ghidra.dbg.agent.AbstractTargetObject.ProxyFactory;
|
||||
import ghidra.dbg.agent.SpiTargetObject;
|
||||
import ghidra.dbg.target.TargetObject;
|
||||
import ghidra.dbg.target.schema.TargetObjectSchema;
|
||||
import ghidra.dbg.target.schema.XmlSchemaContext;
|
||||
import ghidra.program.model.address.*;
|
||||
import utilities.util.ProxyUtilities;
|
||||
|
||||
public class DbgModel2Impl extends AbstractDbgModel {
|
||||
public class DbgModel2Impl extends AbstractDbgModel
|
||||
implements ProxyFactory<List<Class<? extends TargetObject>>> {
|
||||
// TODO: Need some minimal memory modeling per architecture on the model/agent side.
|
||||
// The model must convert to and from Ghidra's address space names
|
||||
protected static final String SPACE_NAME = "ram";
|
||||
|
@ -66,6 +73,15 @@ public class DbgModel2Impl extends AbstractDbgModel {
|
|||
//System.out.println(XmlSchemaContext.serialize(SCHEMA_CTX));
|
||||
this.root = new DbgModel2TargetRootImpl(this, ROOT_SCHEMA);
|
||||
this.completedRoot = CompletableFuture.completedFuture(root);
|
||||
addModelRoot(root);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SpiTargetObject createProxy(AbstractTargetObject<?> delegate,
|
||||
List<Class<? extends TargetObject>> mixins) {
|
||||
mixins.add(DbgModel2TargetProxy.class);
|
||||
return ProxyUtilities.composeOnDelegate(DbgModelTargetObject.class,
|
||||
(DbgModelTargetObject) delegate, mixins, DelegateDbgModel2TargetObject.LOOKUP);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -116,7 +132,7 @@ public class DbgModel2Impl extends AbstractDbgModel {
|
|||
public CompletableFuture<Void> close() {
|
||||
try {
|
||||
terminate();
|
||||
return CompletableFuture.completedFuture(null);
|
||||
return super.close();
|
||||
}
|
||||
catch (Throwable t) {
|
||||
return CompletableFuture.failedFuture(t);
|
||||
|
|
|
@ -59,8 +59,6 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
|
|||
|
||||
protected String DBG_PROMPT = "(kd2)"; // Used by DbgModelTargetEnvironment
|
||||
|
||||
protected boolean fireAttributesChanged = false;
|
||||
|
||||
protected static String indexObject(ModelObject obj) {
|
||||
return obj.getSearchKey();
|
||||
}
|
||||
|
@ -84,6 +82,12 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
|
|||
super(model, parent, name, typeHint, schema);
|
||||
}
|
||||
|
||||
public <I> DbgModel2TargetObjectImpl(ProxyFactory<I> proxyFactory, I proxyInfo,
|
||||
AbstractDbgModel model, TargetObject parent, String name,
|
||||
String typeHint) {
|
||||
super(proxyFactory, proxyInfo, model, parent, name, typeHint);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DbgModel2Impl getModel() {
|
||||
return (DbgModel2Impl) super.getModel();
|
||||
|
@ -127,7 +131,6 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
|
|||
|
||||
@Override
|
||||
public CompletableFuture<Void> requestAttributes(boolean refresh) {
|
||||
fireAttributesChanged = true;
|
||||
Map<String, Object> nmap = new HashMap<>();
|
||||
return requestNativeAttributes().thenCompose(map -> {
|
||||
synchronized (attributes) {
|
||||
|
@ -418,13 +421,10 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
|
|||
schemax.validateAttributeDelta(getPath(), delta, enforcesStrictSchema());
|
||||
}
|
||||
doInvalidateAttributes(delta.removed, reason);
|
||||
if (parent == null && !delta.isEmpty()) {
|
||||
if (!delta.isEmpty()) {
|
||||
listeners.fire.attributesChanged(getProxy(), delta.getKeysRemoved(), delta.added);
|
||||
return delta;
|
||||
}
|
||||
if (fireAttributesChanged && !delta.isEmpty()) {
|
||||
listeners.fire.attributesChanged(getProxy(), delta.getKeysRemoved(), delta.added);
|
||||
}
|
||||
return delta;
|
||||
}
|
||||
|
||||
|
@ -439,14 +439,9 @@ public class DbgModel2TargetObjectImpl extends DefaultTargetObject<TargetObject,
|
|||
schemax.validateAttributeDelta(getPath(), delta, enforcesStrictSchema());
|
||||
}
|
||||
doInvalidateAttributes(delta.removed, reason);
|
||||
if (fireAttributesChanged && !delta.isEmpty()) {
|
||||
if (!delta.isEmpty()) {
|
||||
listeners.fire.attributesChanged(getProxy(), delta.getKeysRemoved(), delta.added);
|
||||
}
|
||||
return delta;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean enforcesStrictSchema() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -109,7 +109,6 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
|
|||
}
|
||||
if (doFire) {
|
||||
this.focus = sel;
|
||||
fireAttributesChanged = true;
|
||||
changeAttributes(List.of(), List.of(), Map.of( //
|
||||
TargetFocusScope.FOCUS_ATTRIBUTE_NAME, focus //
|
||||
), "Focus changed");
|
||||
|
@ -492,12 +491,6 @@ public class DbgModel2TargetRootImpl extends DbgModel2DefaultTargetModelRoot
|
|||
});
|
||||
}
|
||||
|
||||
//@Override
|
||||
public void refresh() {
|
||||
// TODO ???
|
||||
System.err.println("root:refresh");
|
||||
}
|
||||
|
||||
@Override
|
||||
public TargetAccessibility getAccessibility() {
|
||||
return accessibility;
|
||||
|
|
|
@ -28,13 +28,11 @@ import agent.dbgeng.model.iface2.*;
|
|||
import agent.dbgmodel.dbgmodel.main.ModelObject;
|
||||
import agent.dbgmodel.jna.dbgmodel.DbgModelNative.ModelObjectKind;
|
||||
import ghidra.async.AsyncUtils;
|
||||
import ghidra.dbg.DebuggerObjectModel;
|
||||
import ghidra.dbg.attributes.TargetObjectRef;
|
||||
import ghidra.dbg.target.*;
|
||||
import ghidra.dbg.target.TargetBreakpointSpec.TargetBreakpointAction;
|
||||
import ghidra.dbg.util.PathUtils;
|
||||
import ghidra.util.datastruct.ListenerSet;
|
||||
import utilities.util.ProxyUtilities;
|
||||
|
||||
public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl implements //
|
||||
DbgModelTargetAccessConditioned<DelegateDbgModel2TargetObject>, //
|
||||
|
@ -160,7 +158,7 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
|
|||
mixins.add(mixin);
|
||||
}
|
||||
}
|
||||
return new DelegateDbgModel2TargetObject(model, parent, key, object, mixins).proxy;
|
||||
return new DelegateDbgModel2TargetObject(model, parent, key, object, mixins).getProxy();
|
||||
}
|
||||
|
||||
protected static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
|
||||
|
@ -170,8 +168,6 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
|
|||
protected final ProxyState state;
|
||||
protected final Cleanable cleanable;
|
||||
|
||||
private final DbgModelTargetObject proxy;
|
||||
|
||||
private boolean breakpointEnabled;
|
||||
private final ListenerSet<TargetBreakpointAction> breakpointActions =
|
||||
new ListenerSet<>(TargetBreakpointAction.class) {
|
||||
|
@ -189,15 +185,12 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
|
|||
|
||||
public DelegateDbgModel2TargetObject(DbgModel2Impl model, DbgModelTargetObject parent,
|
||||
String key, ModelObject modelObject, List<Class<? extends TargetObject>> mixins) {
|
||||
super(model, parent.getProxy(), key, getHintForObject(modelObject));
|
||||
super(model, mixins, model, parent.getProxy(), key, getHintForObject(modelObject));
|
||||
this.state = new ProxyState(model, modelObject);
|
||||
this.cleanable = CLEANER.register(this, state);
|
||||
|
||||
getManager().addStateListener(accessListener);
|
||||
|
||||
mixins.add(DbgModel2TargetProxy.class);
|
||||
this.proxy =
|
||||
ProxyUtilities.composeOnDelegate(DbgModelTargetObject.class, this, mixins, LOOKUP);
|
||||
if (proxy instanceof DbgEventsListener) {
|
||||
model.getManager().addEventsListener((DbgEventsListener) proxy);
|
||||
}
|
||||
|
@ -216,11 +209,6 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
|
|||
return delegate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends TypedTargetObject<T>> T as(Class<T> iface) {
|
||||
return DebuggerObjectModel.requireIface(iface, proxy, getPath());
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
public CompletableFuture<? extends DelegateDbgModel2TargetObject> fetch() {
|
||||
|
@ -228,8 +216,8 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
|
|||
}
|
||||
|
||||
@Override
|
||||
public TargetObject getProxy() {
|
||||
return proxy;
|
||||
public DbgModelTargetObject getProxy() {
|
||||
return (DbgModelTargetObject) proxy;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
|
@ -311,7 +299,7 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
|
|||
return;
|
||||
}
|
||||
if (proxy instanceof DbgModelTargetRegister || proxy instanceof DbgModelTargetStackFrame) {
|
||||
DbgThread thread = proxy.getParentThread().getThread();
|
||||
DbgThread thread = getProxy().getParentThread().getThread();
|
||||
if (thread.equals(getManager().getEventThread())) {
|
||||
requestAttributes(true);
|
||||
}
|
||||
|
@ -354,6 +342,7 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public DelegateDbgModel2TargetObject getDelegate() {
|
||||
return this;
|
||||
}
|
||||
|
@ -388,6 +377,7 @@ public class DelegateDbgModel2TargetObject extends DbgModel2TargetObjectImpl imp
|
|||
this.breakpointEnabled = enabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListenerSet<TargetBreakpointAction> getActions() {
|
||||
return breakpointActions;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue