mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-28 17:11:11 -09:00
Merge remote-tracking branch 'origin/GP-2163_Dan_dbgChoosePlatformMenu--SQUASHED'
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user