Merge remote-tracking branch 'origin/GP-2163_Dan_dbgChoosePlatformMenu--SQUASHED'

This commit is contained in:
Ryan Kurtz
2022-08-12 17:05:26 -04:00
38 changed files with 1555 additions and 134 deletions

View File

@@ -33,7 +33,9 @@ import ghidra.program.util.DefaultLanguageService;
import ghidra.trace.database.DBTraceUtils.CompilerSpecIDDBFieldCodec;
import ghidra.trace.database.DBTraceUtils.LanguageIDDBFieldCodec;
import ghidra.trace.model.Trace;
import ghidra.trace.model.Trace.TracePlatformChangeType;
import ghidra.trace.model.guest.TraceGuestPlatform;
import ghidra.trace.util.TraceChangeRecord;
import ghidra.util.LockHold;
import ghidra.util.database.*;
import ghidra.util.database.annot.*;
@@ -184,6 +186,8 @@ public class DBTraceGuestPlatform extends DBAnnotatedObject
hostAddressSet.delete(hostRange);
guestAddressSet.delete(guestRange);
}
manager.trace.setChanged(new TraceChangeRecord<>(TracePlatformChangeType.MAPPING_DELETED,
null, this, range, null));
}
@Override
@@ -211,6 +215,7 @@ public class DBTraceGuestPlatform extends DBAnnotatedObject
@Override
public DBTraceGuestPlatformMappedRange addMappedRange(Address hostStart, Address guestStart,
long length) throws AddressOverflowException {
DBTraceGuestPlatformMappedRange mappedRange;
try (LockHold hold = LockHold.lock(manager.lock.writeLock())) {
Address hostEnd = hostStart.addWrap(length - 1);
if (hostAddressSet.intersects(hostStart, hostEnd)) {
@@ -222,14 +227,16 @@ public class DBTraceGuestPlatform extends DBAnnotatedObject
if (guestAddressSet.intersects(guestStart, guestEnd)) {
throw new IllegalArgumentException("Range overlaps existing guest mapped range(s)");
}
DBTraceGuestPlatformMappedRange mappedRange = manager.rangeMappingStore.create();
mappedRange = manager.rangeMappingStore.create();
mappedRange.set(hostStart, this, guestStart, length);
rangesByHostAddress.put(hostStart, mappedRange);
rangesByGuestAddress.put(guestStart, mappedRange);
hostAddressSet.add(mappedRange.getHostRange());
guestAddressSet.add(mappedRange.getGuestRange());
return mappedRange;
}
manager.trace.setChanged(new TraceChangeRecord<>(TracePlatformChangeType.MAPPING_ADDED,
null, this, null, mappedRange));
return mappedRange;
}
@Override

View File

@@ -161,6 +161,6 @@ public class DBTraceGuestPlatformMappedRange extends DBAnnotatedObject
@Override
public void delete(TaskMonitor monitor) throws CancelledException {
manager.platformStore.getObjectAt(guestPlatformKey).deleteMappedRange(this, monitor);
platform.deleteMappedRange(this, monitor);
}
}

View File

@@ -29,7 +29,9 @@ import ghidra.trace.database.DBTrace;
import ghidra.trace.database.DBTraceManager;
import ghidra.trace.database.guest.DBTraceGuestPlatform.DBTraceGuestLanguage;
import ghidra.trace.model.Trace;
import ghidra.trace.model.Trace.TracePlatformChangeType;
import ghidra.trace.model.guest.*;
import ghidra.trace.util.TraceChangeRecord;
import ghidra.util.LockHold;
import ghidra.util.database.*;
import ghidra.util.exception.CancelledException;
@@ -261,6 +263,7 @@ public class DBTracePlatformManager implements DBTraceManager, TracePlatformMana
platformsByCompiler.remove(platform.getCompilerSpec());
platformStore.delete(platform);
}
trace.setChanged(new TraceChangeRecord<>(TracePlatformChangeType.DELETED, null, platform));
}
@Override
@@ -281,9 +284,12 @@ public class DBTracePlatformManager implements DBTraceManager, TracePlatformMana
throw new IllegalArgumentException(
"Base compiler spec cannot be a guest compiler spec");
}
DBTraceGuestPlatform platform;
try (LockHold hold = LockHold.lock(lock.writeLock())) {
return doAddGuestPlatform(compilerSpec);
platform = doAddGuestPlatform(compilerSpec);
}
trace.setChanged(new TraceChangeRecord<>(TracePlatformChangeType.ADDED, null, platform));
return platform;
}
@Override
@@ -297,18 +303,21 @@ public class DBTracePlatformManager implements DBTraceManager, TracePlatformMana
}
@Override
public DBTraceGuestPlatform getOrAddGuestPlatform(CompilerSpec compilerSpec) {
public InternalTracePlatform getOrAddPlatform(CompilerSpec compilerSpec) {
if (compilerSpec.getCompilerSpecID()
.equals(trace.getBaseCompilerSpec().getCompilerSpecID())) {
throw new IllegalArgumentException("Base language cannot be a guest language");
return hostPlatform;
}
DBTraceGuestPlatform platform;
try (LockHold hold = LockHold.lock(lock.writeLock())) {
DBTraceGuestPlatform exists = platformsByCompiler.get(compilerSpec);
if (exists != null) {
return exists;
}
return doAddGuestPlatform(compilerSpec);
platform = doAddGuestPlatform(compilerSpec);
}
trace.setChanged(new TraceChangeRecord<>(TracePlatformChangeType.ADDED, null, platform));
return platform;
}
@Override

View File

@@ -32,7 +32,7 @@ import ghidra.trace.model.breakpoint.TraceBreakpoint;
import ghidra.trace.model.breakpoint.TraceBreakpointManager;
import ghidra.trace.model.context.TraceRegisterContextManager;
import ghidra.trace.model.data.TraceBasedDataTypeManager;
import ghidra.trace.model.guest.TracePlatformManager;
import ghidra.trace.model.guest.*;
import ghidra.trace.model.listing.*;
import ghidra.trace.model.memory.*;
import ghidra.trace.model.modules.*;
@@ -379,6 +379,16 @@ public interface Trace extends DataTypeManagerDomainObject {
public static final TraceSnapshotChangeType<Void> DELETED = new TraceSnapshotChangeType<>();
}
public static final class TracePlatformChangeType<U>
extends DefaultTraceChangeType<TraceGuestPlatform, U> {
public static final TracePlatformChangeType<Void> ADDED = new TracePlatformChangeType<>();
public static final TracePlatformChangeType<Void> DELETED = new TracePlatformChangeType<>();
public static final TracePlatformChangeType<TraceGuestPlatformMappedRange> MAPPING_ADDED =
new TracePlatformChangeType<>();
public static final TracePlatformChangeType<TraceGuestPlatformMappedRange> MAPPING_DELETED =
new TracePlatformChangeType<>();
}
public interface TraceProgramViewListener {
void viewCreated(TraceProgramView view);
}

View File

@@ -33,6 +33,13 @@ public interface TracePlatformManager {
*/
TracePlatform getHostPlatform();
/**
* Get all guest platforms
*
* @return the collection of platforms
*/
Collection<TraceGuestPlatform> getGuestPlatforms();
/**
* Add a guest platform
*
@@ -53,14 +60,7 @@ public interface TracePlatformManager {
* Get or add a platform for the given compiler spec
*
* @param compilerSpec the compiler spec
* @return the new or existing platform, or null if compiler spec is the base compiler spec
* @return the new or existing platform
*/
TraceGuestPlatform getOrAddGuestPlatform(CompilerSpec compilerSpec);
/**
* Get all guest platforms
*
* @return the collection of platforms
*/
Collection<TraceGuestPlatform> getGuestPlatforms();
TracePlatform getOrAddPlatform(CompilerSpec compilerSpec);
}

View File

@@ -40,6 +40,30 @@ import ghidra.trace.model.thread.TraceObjectThread;
import ghidra.util.database.*;
public class DBTraceObjectManagerTest extends AbstractGhidraHeadlessIntegrationTest {
public static final String XML_CTX = """
<context>
<schema name='Session' elementResync='NEVER' attributeResync='ONCE'>
<attribute name='curTarget' schema='Target' />
<attribute name='Targets' schema='TargetContainer' />
</schema>
<schema name='TargetContainer' canonical='yes' elementResync='NEVER'
attributeResync='ONCE'>
<element schema='Target' />
</schema>
<schema name='Target' elementResync='NEVER' attributeResync='NEVER'>
<interface name='Process' />
<attribute name='self' schema='Target' />
<attribute name='Threads' schema='ThreadContainer' />
</schema>
<schema name='ThreadContainer' canonical='yes' elementResync='NEVER'
attributeResync='NEVER'>
<element schema='Thread' />
</schema>
<schema name='Thread' elementResync='NEVER' attributeResync='NEVER'>
<interface name='Thread' />
</schema>
</context>
""";
protected ToyDBTraceBuilder b;
protected DBTraceObjectManager manager;
@@ -54,29 +78,7 @@ public class DBTraceObjectManagerTest extends AbstractGhidraHeadlessIntegrationT
b = new ToyDBTraceBuilder("Testing", "Toy:BE:64:default");
manager = b.trace.getObjectManager();
ctx = XmlSchemaContext.deserialize("" + //
"<context>" + //
" <schema name='Session' elementResync='NEVER' attributeResync='ONCE'>" + //
" <attribute name='curTarget' schema='Target' />" + //
" <attribute name='Targets' schema='TargetContainer' />" + //
" </schema>" + //
" <schema name='TargetContainer' canonical='yes' elementResync='NEVER' " + //
" attributeResync='ONCE'>" + //
" <element schema='Target' />" + //
" </schema>" + //
" <schema name='Target' elementResync='NEVER' attributeResync='NEVER'>" + //
" <interface name='Process' />" + //
" <attribute name='self' schema='Target' />" + //
" <attribute name='Threads' schema='ThreadContainer' />" + //
" </schema>" + //
" <schema name='ThreadContainer' canonical='yes' elementResync='NEVER' " + //
" attributeResync='NEVER'>" + //
" <element schema='Thread' />" + //
" </schema>" + //
" <schema name='Thread' elementResync='NEVER' attributeResync='NEVER'>" + //
" <interface name='Thread' />" + //
" </schema>" + //
"</context>");
ctx = XmlSchemaContext.deserialize(XML_CTX);
}
protected void populateModel(int targetCount) {