From f9bc45cdf0d391645ecaa4ed3a66ed41377e7e4c Mon Sep 17 00:00:00 2001 From: caheckman <48068198+caheckman@users.noreply.github.com> Date: Tue, 7 Feb 2023 18:14:50 -0500 Subject: [PATCH] GP-3088 Marshal pointer wordsize as unsigned --- .../Decompiler/src/decompile/cpp/type.cc | 4 +-- .../processors/sleigh/SleighLanguage.java | 26 ++++++++++--------- .../model/pcode/PcodeDataTypeManager.java | 4 +-- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc index 316074389c..8d5dc17ed3 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc @@ -820,7 +820,7 @@ void TypePointer::encode(Encoder &encoder) const encoder.openElement(ELEM_TYPE); encodeBasic(metatype,encoder); if (wordsize != 1) - encoder.writeSignedInteger(ATTRIB_WORDSIZE, wordsize); + encoder.writeUnsignedInteger(ATTRIB_WORDSIZE, wordsize); if (spaceid != (AddrSpace *)0) encoder.writeSpace(ATTRIB_SPACE, spaceid); ptrto->encodeRef(encoder); @@ -2129,7 +2129,7 @@ void TypePointerRel::encode(Encoder &encoder) const encoder.openElement(ELEM_TYPE); encodeBasic(TYPE_PTRREL,encoder); // Override the metatype for XML if (wordsize != 1) - encoder.writeSignedInteger(ATTRIB_WORDSIZE, wordsize); + encoder.writeUnsignedInteger(ATTRIB_WORDSIZE, wordsize); ptrto->encode(encoder); parent->encodeRef(encoder); encoder.openElement(ELEM_OFF); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighLanguage.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighLanguage.java index 7013378c6f..c2b79418d7 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighLanguage.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighLanguage.java @@ -175,7 +175,7 @@ public class SleighLanguage implements Language { volatileAddresses.delete(nonVolatileSymbolAddresses); } } - + private boolean isSLAWrongVersion(ResourceFile slaFile) { XmlPullParser parser = null; try { @@ -809,8 +809,8 @@ public class SleighLanguage implements Language { boolean isEntry = SpecXmlUtils.decodeBoolean(symbol.getAttribute("entry")); Address startAddress = addressFactory.getAddress(addressString); int rangeSize = SpecXmlUtils.decodeInt(symbol.getAttribute("size")); - Boolean isVolatile = SpecXmlUtils.decodeNullableBoolean( - symbol.getAttribute("volatile")); + Boolean isVolatile = + SpecXmlUtils.decodeNullableBoolean(symbol.getAttribute("volatile")); if (startAddress == null) { Msg.error(this, "invalid symbol address \"" + addressString + "\": " + description.getSpecFile()); @@ -819,9 +819,11 @@ public class SleighLanguage implements Language { AddressLabelInfo info; try { info = new AddressLabelInfo(startAddress, rangeSize, labelName, false, - isEntry, type, isVolatile); - } catch (AddressOverflowException e) { - throw new XmlParseException("invalid symbol definition: " + labelName, e); + isEntry, type, isVolatile); + } + catch (AddressOverflowException e) { + throw new XmlParseException("invalid symbol definition: " + labelName, + e); } defaultSymbols.add(info); if (isVolatile != null) { @@ -831,7 +833,8 @@ public class SleighLanguage implements Language { volatileSymbolAddresses = new AddressSet(); } volatileSymbolAddresses.addRange(startAddress, endAddress); - } else { + } + else { if (nonVolatileSymbolAddresses == null) { nonVolatileSymbolAddresses = new AddressSet(); } @@ -896,7 +899,8 @@ public class SleighLanguage implements Language { read(parser); } catch (XmlParseException e) { - Msg.error(this, "Failed to parse Sleigh Specification ("+ specFile.getName() + "): " + e.getMessage()); + Msg.error(this, "Failed to parse Sleigh Specification (" + specFile.getName() + "): " + + e.getMessage()); } finally { parser.dispose(); @@ -1454,8 +1458,7 @@ public class SleighLanguage implements Language { encoder.writeBool(ATTRIB_BIGENDIAN, isBigEndian()); encoder.writeUnsignedInteger(ATTRIB_UNIQBASE, uniqueOffset); encoder.openElement(ELEM_SPACES); - encoder.writeString(ATTRIB_DEFAULTSPACE, - factory.getDefaultAddressSpace().getName()); + encoder.writeString(ATTRIB_DEFAULTSPACE, factory.getDefaultAddressSpace().getName()); ElementId tag; int delay; @@ -1511,8 +1514,7 @@ public class SleighLanguage implements Language { encoder.writeSignedInteger(ATTRIB_SIZE, bytesize); if (element.getAddressableUnitSize() > 1) { - encoder.writeSignedInteger(ATTRIB_WORDSIZE, - element.getAddressableUnitSize()); + encoder.writeUnsignedInteger(ATTRIB_WORDSIZE, element.getAddressableUnitSize()); } encoder.writeBool(ATTRIB_BIGENDIAN, isBigEndian()); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PcodeDataTypeManager.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PcodeDataTypeManager.java index f512cbbc93..f8be21d995 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PcodeDataTypeManager.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PcodeDataTypeManager.java @@ -333,7 +333,7 @@ public class PcodeDataTypeManager { } encoder.writeSignedInteger(ATTRIB_SIZE, ptrLen); if (pointerWordSize != 1) { - encoder.writeSignedInteger(ATTRIB_WORDSIZE, pointerWordSize); + encoder.writeUnsignedInteger(ATTRIB_WORDSIZE, pointerWordSize); } if (spc != null) { encoder.writeSpace(ATTRIB_SPACE, spc); @@ -398,7 +398,7 @@ public class PcodeDataTypeManager { encodeNameIdAttributes(encoder, type); encoder.writeSignedInteger(ATTRIB_SIZE, pointer.getLength()); if (pointerWordSize != 1) { - encoder.writeSignedInteger(ATTRIB_WORDSIZE, pointerWordSize); + encoder.writeUnsignedInteger(ATTRIB_WORDSIZE, pointerWordSize); } if (space != null) { encoder.writeSpace(ATTRIB_SPACE, space);