From 616bf824264666964a514deda2ad15d23faa178e Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Thu, 11 Apr 2024 15:27:16 -0400 Subject: [PATCH] GP-4505 Added writable mutability setting --- .../trace/util/DataAdapterFromSettings.java | 5 +++++ .../main/java/ghidra/app/util/PseudoData.java | 5 +++++ .../ghidra/program/database/code/DataDB.java | 7 ++++++- .../data/MutabilitySettingsDefinition.java | 7 ++++--- .../ghidra/program/model/listing/Data.java | 21 +++++++++++++++---- .../program/model/listing/DataStub.java | 5 +++++ .../program/model/pcode/MappedDataEntry.java | 3 +++ .../Introduction_to_Ghidra_Student_Guide.html | 4 ++-- 8 files changed, 47 insertions(+), 10 deletions(-) diff --git a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/util/DataAdapterFromSettings.java b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/util/DataAdapterFromSettings.java index 3f6bf417d8..0fde046a1e 100644 --- a/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/util/DataAdapterFromSettings.java +++ b/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/util/DataAdapterFromSettings.java @@ -47,6 +47,11 @@ public interface DataAdapterFromSettings extends Data { return hasMutability(MutabilitySettingsDefinition.CONSTANT); } + @Override + default boolean isWritable() { + return hasMutability(MutabilitySettingsDefinition.WRITABLE); + } + @Override default boolean isVolatile() { return hasMutability(MutabilitySettingsDefinition.VOLATILE); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/util/PseudoData.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/util/PseudoData.java index 6ee5a8174b..7474c1a59d 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/util/PseudoData.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/util/PseudoData.java @@ -544,6 +544,11 @@ public class PseudoData extends PseudoCodeUnit implements Data { return false; } + @Override + public boolean isWritable() { + return false; + } + @Override public boolean isVolatile() { return false; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/code/DataDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/code/DataDB.java index b9b285b40e..e4fa0f0dda 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/code/DataDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/code/DataDB.java @@ -130,7 +130,7 @@ class DataDB extends CodeUnitDB implements Data { private void computeLength() { // NOTE: Data intentionally does not use aligned-length - length = dataType.getLength(); + length = dataType.getLength(); // undefined will never change their size if (dataType instanceof Undefined) { @@ -367,6 +367,11 @@ class DataDB extends CodeUnitDB implements Data { return hasMutability(MutabilitySettingsDefinition.CONSTANT); } + @Override + public boolean isWritable() { + return hasMutability(MutabilitySettingsDefinition.WRITABLE); + } + @Override public boolean isVolatile() { return hasMutability(MutabilitySettingsDefinition.VOLATILE); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/MutabilitySettingsDefinition.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/MutabilitySettingsDefinition.java index c7cf3a30bd..e9ca3c9429 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/MutabilitySettingsDefinition.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/MutabilitySettingsDefinition.java @@ -27,9 +27,10 @@ public class MutabilitySettingsDefinition implements EnumSettingsDefinition { public static final int NORMAL = 0; public static final int VOLATILE = 1; public static final int CONSTANT = 2; + public static final int WRITABLE = 3; //NOTE: if these strings change, the XML needs to changed also... - private static final String[] choices = { "normal", "volatile", "constant" }; + private static final String[] choices = { "normal", "volatile", "constant", "writable" }; public static final String MUTABILITY = "mutability"; public static final MutabilitySettingsDefinition DEF = new MutabilitySettingsDefinition(); @@ -51,7 +52,7 @@ public class MutabilitySettingsDefinition implements EnumSettingsDefinition { return NORMAL; } int mode = (int) value.longValue(); - if ((mode < 0) || (mode > CONSTANT)) { + if ((mode < 0) || (mode > WRITABLE)) { mode = NORMAL; } return mode; @@ -69,7 +70,7 @@ public class MutabilitySettingsDefinition implements EnumSettingsDefinition { @Override public void setChoice(Settings settings, int value) { - if (value < 0 || value > CONSTANT) { + if (value < 0 || value > WRITABLE) { settings.clearSetting(MUTABILITY); } else { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/Data.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/Data.java index 9ca8ffef6e..44e6faf9d7 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/Data.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/Data.java @@ -54,14 +54,26 @@ public interface Data extends CodeUnit, Settings { public boolean hasStringValue(); /** - * @return true if data is constant. - * If true, isConstant will always be false + * Determine if this data has explicitly been marked as constant. + * NOTE: This is based upon explicit {@link Data} and {@link DataType} mutability settings + * and does not reflect independent memory block or processor specification settings. + * @return true if data is constant, else false. */ public boolean isConstant(); /** - * @return true if data is volatile. - * If true, isVolatile will always be false + * Determine if this data has explicitly been marked as writable. + * NOTE: This is based upon explicit {@link Data} and {@link DataType} mutability settings + * and does not reflect independent memory block or processor specification settings. + * @return true if data is writable, else false. + */ + public boolean isWritable(); + + /** + * Determine if this data has explicitly been marked as volatile. + * NOTE: This is based upon explicit {@link Data} and {@link DataType} mutability settings + * and does not reflect independent memory block or processor specification settings. + * @return true if data is volatile, else false. */ public boolean isVolatile(); @@ -285,4 +297,5 @@ public interface Data extends CodeUnit, Settings { * @return the prefix */ public String getDefaultLabelPrefix(DataTypeDisplayOptions options); + } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/DataStub.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/DataStub.java index 28ed59133f..2bcff01401 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/DataStub.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/DataStub.java @@ -392,6 +392,11 @@ public class DataStub implements Data { throw new UnsupportedOperationException(); } + @Override + public boolean isWritable() { + throw new UnsupportedOperationException(); + } + @Override public boolean isVolatile() { throw new UnsupportedOperationException(); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/MappedDataEntry.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/MappedDataEntry.java index 0088576b37..f2d9bfacfb 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/MappedDataEntry.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/MappedDataEntry.java @@ -58,6 +58,9 @@ public class MappedDataEntry extends MappedEntry { @Override public boolean isReadOnly() { + if (data.isWritable()) { + return false; + } if (data.isConstant()) { return true; } diff --git a/GhidraDocs/GhidraClass/Beginner/Introduction_to_Ghidra_Student_Guide.html b/GhidraDocs/GhidraClass/Beginner/Introduction_to_Ghidra_Student_Guide.html index eb5f25790e..cabad05724 100644 --- a/GhidraDocs/GhidraClass/Beginner/Introduction_to_Ghidra_Student_Guide.html +++ b/GhidraDocs/GhidraClass/Beginner/Introduction_to_Ghidra_Student_Guide.html @@ -1119,7 +1119,7 @@ Before you can do anything else, you must first create a project. Projects are u
  • Decompiler output may change due to program changes
  • Selections and navigation made in Listing and Decompiler track one another
  • @@ -1214,7 +1214,7 @@ Before you can do anything else, you must first create a project. Projects are u
  • Change function signatures to cause global improvements
  • Make function signature changes to handle specialized types of functions
  • -
  • Apply read-only memory and volatile memory settings correctly
  • +
  • Apply writable memory, read-only memory and volatile memory settings correctly