mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2024-10-22 21:21:02 +00:00
Merge remote-tracking branch 'origin/patch'
This commit is contained in:
commit
e83e7004a3
|
@ -30,11 +30,11 @@ This guide includes instructions for obtaining many of these at the relevant ste
|
|||
You may not need all of these, depending on which portions you are building or developing.
|
||||
#### At minimum you will need all of the following
|
||||
* Java JDK 11 (64-bit) - Free long term support (LTS) versions of JDK 11 are provided by:
|
||||
- AdoptOpenJDK
|
||||
- https://adoptopenjdk.net/releases.html?variant=openjdk11&jvmVariant=hotspot
|
||||
- Adoptium Temurin
|
||||
- https://adoptium.net/releases.html?variant=openjdk11&jvmVariant=hotspot
|
||||
- Amazon Corretto
|
||||
- https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html
|
||||
* Gradle 6.0 or later - We use version 6.9, and tested with up to 7.0.1.
|
||||
* Gradle 6 or 7
|
||||
- https://gradle.org/releases/
|
||||
* A C/C++ compiler - We use GCC on Linux, Xcode (Clang) on macOS, and Visual Studio (2017 or later) on Windows.
|
||||
- https://gcc.gnu.org/
|
||||
|
|
|
@ -24,6 +24,7 @@ import ghidra.program.model.symbol.RefType;
|
|||
import ghidra.program.model.symbol.SourceType;
|
||||
import ghidra.trace.database.data.DBTraceDataSettingsOperations;
|
||||
import ghidra.trace.database.symbol.DBTraceReference;
|
||||
import ghidra.trace.model.Trace.TraceCodeChangeType;
|
||||
import ghidra.trace.model.listing.TraceData;
|
||||
import ghidra.trace.model.symbol.TraceReference;
|
||||
import ghidra.trace.util.*;
|
||||
|
@ -38,150 +39,198 @@ public interface DBTraceDataAdapter extends DBTraceCodeUnitAdapter, DataAdapterM
|
|||
|
||||
@Override
|
||||
default TraceReference[] getValueReferences() {
|
||||
return (TraceReference[]) DataAdapterMinimal.super.getValueReferences();
|
||||
try (LockHold hold = getTrace().lockRead()) {
|
||||
return (TraceReference[]) DataAdapterMinimal.super.getValueReferences();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
default void addValueReference(Address refAddr, RefType type) {
|
||||
getTrace().getReferenceManager()
|
||||
.addMemoryReference(getLifespan(), getAddress(), refAddr,
|
||||
type, SourceType.USER_DEFINED, DATA_OP_INDEX);
|
||||
try (LockHold hold = getTrace().lockWrite()) {
|
||||
getTrace().getReferenceManager()
|
||||
.addMemoryReference(getLifespan(), getAddress(), refAddr,
|
||||
type, SourceType.USER_DEFINED, DATA_OP_INDEX);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
default void removeValueReference(Address refAddr) {
|
||||
DBTraceReference ref = getTrace().getReferenceManager()
|
||||
.getReference(getStartSnap(),
|
||||
getAddress(), refAddr, DATA_OP_INDEX);
|
||||
if (ref == null) {
|
||||
return;
|
||||
try (LockHold hold = getTrace().lockWrite()) {
|
||||
DBTraceReference ref = getTrace().getReferenceManager()
|
||||
.getReference(getStartSnap(),
|
||||
getAddress(), refAddr, DATA_OP_INDEX);
|
||||
if (ref == null) {
|
||||
return;
|
||||
}
|
||||
ref.delete();
|
||||
}
|
||||
ref.delete();
|
||||
}
|
||||
|
||||
DBTraceDataSettingsOperations getSettingsSpace(boolean createIfAbsent);
|
||||
|
||||
@Override
|
||||
default void setLong(String name, long value) {
|
||||
getSettingsSpace(true).setLong(getLifespan(), getAddress(), name, value);
|
||||
try (LockHold hold = getTrace().lockWrite()) {
|
||||
getSettingsSpace(true).setLong(getLifespan(), getAddress(), name, value);
|
||||
}
|
||||
getTrace().setChanged(new TraceChangeRecord<>(
|
||||
TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED, getTraceSpace(), this.getBounds(), null,
|
||||
null));
|
||||
}
|
||||
|
||||
@Override
|
||||
default Long getLong(String name) {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space != null) {
|
||||
Long value = space.getLong(getStartSnap(), getAddress(), name);
|
||||
if (value != null) {
|
||||
return value;
|
||||
try (LockHold hold = getTrace().lockRead()) {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space != null) {
|
||||
Long value = space.getLong(getStartSnap(), getAddress(), name);
|
||||
if (value != null) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
Settings defaultSettings = getDefaultSettings();
|
||||
return defaultSettings == null ? null : defaultSettings.getLong(name);
|
||||
}
|
||||
Settings defaultSettings = getDefaultSettings();
|
||||
return defaultSettings == null ? null : defaultSettings.getLong(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setString(String name, String value) {
|
||||
getSettingsSpace(true).setString(getLifespan(), getAddress(), name, value);
|
||||
try (LockHold hold = getTrace().lockWrite()) {
|
||||
getSettingsSpace(true).setString(getLifespan(), getAddress(), name, value);
|
||||
}
|
||||
getTrace().setChanged(new TraceChangeRecord<>(
|
||||
TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED, getTraceSpace(), this.getBounds(), null,
|
||||
null));
|
||||
}
|
||||
|
||||
@Override
|
||||
default String getString(String name) {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space != null) {
|
||||
String value = space.getString(getStartSnap(), getAddress(), name);
|
||||
if (value != null) {
|
||||
return value;
|
||||
try (LockHold hold = getTrace().lockRead()) {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space != null) {
|
||||
String value = space.getString(getStartSnap(), getAddress(), name);
|
||||
if (value != null) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
Settings defaultSettings = getDefaultSettings();
|
||||
return defaultSettings == null ? null : defaultSettings.getString(name);
|
||||
}
|
||||
Settings defaultSettings = getDefaultSettings();
|
||||
return defaultSettings == null ? null : defaultSettings.getString(name);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setByteArray(String name, byte[] value) {
|
||||
getSettingsSpace(true).setBytes(getLifespan(), getAddress(), name, value);
|
||||
try (LockHold hold = getTrace().lockWrite()) {
|
||||
getSettingsSpace(true).setBytes(getLifespan(), getAddress(), name, value);
|
||||
}
|
||||
getTrace().setChanged(new TraceChangeRecord<>(
|
||||
TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED, getTraceSpace(), this.getBounds(), null,
|
||||
null));
|
||||
}
|
||||
|
||||
@Override
|
||||
default byte[] getByteArray(String name) {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space != null) {
|
||||
byte[] value = space.getBytes(getStartSnap(), getAddress(), name);
|
||||
if (value != null) {
|
||||
return value;
|
||||
try (LockHold hold = getTrace().lockRead()) {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space != null) {
|
||||
byte[] value = space.getBytes(getStartSnap(), getAddress(), name);
|
||||
if (value != null) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
Settings defaultSettings = getDefaultSettings();
|
||||
return defaultSettings == null ? null : defaultSettings.getByteArray(name);
|
||||
}
|
||||
Settings defaultSettings = getDefaultSettings();
|
||||
return defaultSettings == null ? null : defaultSettings.getByteArray(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void setValue(String name, Object value) {
|
||||
getSettingsSpace(true).setValue(getLifespan(), getAddress(), name, value);
|
||||
try (LockHold hold = getTrace().lockWrite()) {
|
||||
getSettingsSpace(true).setValue(getLifespan(), getAddress(), name, value);
|
||||
}
|
||||
getTrace().setChanged(new TraceChangeRecord<>(
|
||||
TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED, getTraceSpace(), this.getBounds(), null,
|
||||
null));
|
||||
}
|
||||
|
||||
@Override
|
||||
default Object getValue(String name) {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space != null) {
|
||||
Object value = space.getValue(getStartSnap(), getAddress(), name);
|
||||
if (value != null) {
|
||||
return value;
|
||||
try (LockHold hold = getTrace().lockRead()) {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space != null) {
|
||||
Object value = space.getValue(getStartSnap(), getAddress(), name);
|
||||
if (value != null) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
Settings defaultSettings = getDefaultSettings();
|
||||
return defaultSettings == null ? null : defaultSettings.getValue(name);
|
||||
}
|
||||
Settings defaultSettings = getDefaultSettings();
|
||||
return defaultSettings == null ? null : defaultSettings.getValue(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
default void clearSetting(String name) {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space == null) {
|
||||
return;
|
||||
try (LockHold hold = getTrace().lockWrite()) {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space == null) {
|
||||
return;
|
||||
}
|
||||
space.clear(getLifespan(), getAddress(), name);
|
||||
}
|
||||
space.clear(getLifespan(), getAddress(), name);
|
||||
getTrace().setChanged(new TraceChangeRecord<>(
|
||||
TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED, getTraceSpace(), this.getBounds(), null,
|
||||
null));
|
||||
}
|
||||
|
||||
@Override
|
||||
default void clearAllSettings() {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space == null) {
|
||||
return;
|
||||
try (LockHold hold = getTrace().lockWrite()) {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space == null) {
|
||||
return;
|
||||
}
|
||||
space.clear(getLifespan(), getAddress(), null);
|
||||
}
|
||||
space.clear(getLifespan(), getAddress(), null);
|
||||
getTrace().setChanged(new TraceChangeRecord<>(
|
||||
TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED, getTraceSpace(), this.getBounds(), null,
|
||||
null));
|
||||
}
|
||||
|
||||
@Override
|
||||
default String[] getNames() {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space == null) {
|
||||
return EMPTY_STRING_ARRAY;
|
||||
try (LockHold hold = getTrace().lockRead()) {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space == null) {
|
||||
return EMPTY_STRING_ARRAY;
|
||||
}
|
||||
Collection<String> names = space.getSettingNames(getLifespan(), getAddress());
|
||||
return names.toArray(new String[names.size()]);
|
||||
}
|
||||
Collection<String> names = space.getSettingNames(getLifespan(), getAddress());
|
||||
return names.toArray(new String[names.size()]);
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean isEmpty() {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space == null) {
|
||||
return true;
|
||||
try (LockHold hold = getTrace().lockRead()) {
|
||||
DBTraceDataSettingsOperations space = getSettingsSpace(false);
|
||||
if (space == null) {
|
||||
return true;
|
||||
}
|
||||
return space.isEmpty(getLifespan(), getAddress());
|
||||
}
|
||||
return space.isEmpty(getLifespan(), getAddress());
|
||||
}
|
||||
|
||||
@Override
|
||||
default <T extends SettingsDefinition> T getSettingsDefinition(
|
||||
Class<T> settingsDefinitionClass) {
|
||||
try (LockHold hold = LockHold.lock(getTrace().getReadWriteLock().readLock())) {
|
||||
try (LockHold hold = getTrace().lockRead()) {
|
||||
return DataAdapterFromSettings.super.getSettingsDefinition(settingsDefinitionClass);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean hasMutability(int mutabilityType) {
|
||||
try (LockHold hold = LockHold.lock(getTrace().getReadWriteLock().readLock())) {
|
||||
try (LockHold hold = getTrace().lockRead()) {
|
||||
return DataAdapterFromSettings.super.hasMutability(mutabilityType);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@ import ghidra.trace.model.listing.TraceInstruction;
|
|||
import ghidra.trace.model.symbol.TraceReference;
|
||||
import ghidra.trace.util.*;
|
||||
import ghidra.util.LockHold;
|
||||
import ghidra.util.Msg;
|
||||
import ghidra.util.database.DBCachedObjectStore;
|
||||
import ghidra.util.database.DBObjectColumn;
|
||||
import ghidra.util.database.annot.*;
|
||||
|
@ -139,8 +140,10 @@ public class DBTraceInstruction extends AbstractDBTraceCodeUnit<DBTraceInstructi
|
|||
prototype = space.manager.getPrototypeByKey(prototypeKey);
|
||||
if (prototype == null) {
|
||||
// TODO: Better to just load a sentinel? Why bail on the whole thing?
|
||||
throw new IOException(
|
||||
"Instruction table is corrupt. Missing prototype: " + prototypeKey);
|
||||
Msg.error(this,
|
||||
"Instruction table is corrupt for address " + getMinAddress() +
|
||||
". Missing prototype " + prototypeKey);
|
||||
prototype = new InvalidPrototype(getTrace().getBaseLanguage());
|
||||
}
|
||||
flowOverride = FlowOverride.values()[(flags & FLOWOVERRIDE_SET_MASK) >> FLOWOVERRIDE_SHIFT];
|
||||
|
||||
|
|
|
@ -109,6 +109,8 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
listenFor(TraceCodeChangeType.REMOVED, this::codeRemoved);
|
||||
listenFor(TraceCodeChangeType.FRAGMENT_CHANGED, this::codeFragmentChanged);
|
||||
listenFor(TraceCodeChangeType.DATA_TYPE_REPLACED, this::codeDataTypeReplaced);
|
||||
listenFor(TraceCodeChangeType.DATA_TYPE_SETTINGS_CHANGED,
|
||||
this::codeDataTypeSettingsChanged);
|
||||
|
||||
listenFor(TraceCommentChangeType.EOL_CHANGED, this::commentEolChanged);
|
||||
listenFor(TraceCommentChangeType.PLATE_CHANGED, this::commentPlateChanged);
|
||||
|
@ -330,10 +332,21 @@ public class DBTraceProgramView implements TraceProgramView {
|
|||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_CODE_REPLACED,
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_REPLACED,
|
||||
range.getX1(), range.getX2(), null, null, null));
|
||||
}
|
||||
|
||||
private void codeDataTypeSettingsChanged(TraceAddressSpace space,
|
||||
TraceAddressSnapRange range) {
|
||||
DomainObjectEventQueues queues = isVisible(space, range);
|
||||
if (queues == null) {
|
||||
return;
|
||||
}
|
||||
// Yes, x1 twice
|
||||
queues.fireEvent(new ProgramChangeRecord(ChangeManager.DOCR_DATA_TYPE_SETTING_CHANGED,
|
||||
range.getX1(), range.getX1(), null, null, null));
|
||||
}
|
||||
|
||||
private void commentChanged(int docrType, TraceAddressSpace space,
|
||||
TraceAddressSnapRange range,
|
||||
String oldValue, String newValue) {
|
||||
|
|
|
@ -106,6 +106,8 @@ public interface Trace extends DataTypeManagerDomainObject {
|
|||
// Long is data type ID
|
||||
public static final TraceCodeChangeType<TraceAddressSnapRange, Long> DATA_TYPE_REPLACED =
|
||||
new TraceCodeChangeType<>();
|
||||
public static final TraceCodeChangeType<TraceAddressSnapRange, Void> DATA_TYPE_SETTINGS_CHANGED =
|
||||
new TraceCodeChangeType<>();
|
||||
}
|
||||
|
||||
public static final class TraceCommentChangeType
|
||||
|
|
|
@ -86,8 +86,8 @@ Ghidra team if you have a specific need.</p></blockquote>
|
|||
<li>Free long term support (LTS) versions of JDK 11 are provided by:</li>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="https://adoptopenjdk.net/releases.html?variant=openjdk11&jvmVariant=hotspot">
|
||||
AdoptOpenJDK</a>
|
||||
<a href="https://adoptium.net/releases.html?variant=openjdk11&jvmVariant=hotspot">
|
||||
Adoptium Temurin</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html">
|
||||
|
|
|
@ -38,7 +38,7 @@ To create the latest development build for your platform from this source reposi
|
|||
|
||||
##### Install build tools:
|
||||
* [JDK 11 64-bit][jdk11]
|
||||
* [Gradle][gradle] (minimum v6.0)
|
||||
* [Gradle 6 or 7][gradle]
|
||||
* make, gcc, and g++ (Linux/macOS-only)
|
||||
* [Microsoft Visual Studio][vs] (Windows-only)
|
||||
|
||||
|
@ -109,7 +109,7 @@ source project.
|
|||
[devguide]: DevGuide.md
|
||||
[career]: https://www.intelligencecareers.gov/nsa
|
||||
[project]: https://www.ghidra-sre.org/
|
||||
[jdk11]: https://adoptopenjdk.net/releases.html?variant=openjdk11&jvmVariant=hotspot
|
||||
[jdk11]: https://adoptium.net/releases.html?variant=openjdk11&jvmVariant=hotspot
|
||||
[gradle]: https://gradle.org/releases/
|
||||
[vs]: https://visualstudio.microsoft.com/vs/community/
|
||||
[eclipse]: https://www.eclipse.org/downloads/packages/
|
||||
|
|
Loading…
Reference in New Issue
Block a user