mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 10:49:34 +02:00
GP-4285 Compressed SLEIGH
This commit is contained in:
parent
b380fd5fa6
commit
8fbd171cdf
207 changed files with 15233 additions and 6055 deletions
|
@ -15,13 +15,15 @@
|
|||
*/
|
||||
package ghidra.app.plugin.assembler.sleigh;
|
||||
|
||||
import static ghidra.pcode.utils.SlaFormat.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import ghidra.GhidraApplicationLayout;
|
||||
import ghidra.app.plugin.assembler.sleigh.expr.*;
|
||||
|
@ -37,9 +39,8 @@ import ghidra.app.plugin.processors.sleigh.template.HandleTpl;
|
|||
import ghidra.framework.Application;
|
||||
import ghidra.framework.ApplicationConfiguration;
|
||||
import ghidra.program.model.lang.LanguageID;
|
||||
import ghidra.program.model.pcode.*;
|
||||
import ghidra.util.Msg;
|
||||
import ghidra.xml.XmlPullParser;
|
||||
import ghidra.xml.XmlPullParserFactory;
|
||||
|
||||
public class SolverTest {
|
||||
static final DefaultAssemblyResolutionFactory FACTORY = new DefaultAssemblyResolutionFactory();
|
||||
|
@ -164,24 +165,54 @@ public class SolverTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testCatOrSolver() throws SAXException, NeedsBackfillException {
|
||||
XmlPullParser parser = XmlPullParserFactory.create("""
|
||||
<or_exp>
|
||||
<lshift_exp>
|
||||
<tokenfield bigendian='false' signbit='false' bitstart='0' bitend='3'
|
||||
bytestart='0' byteend='0' shift='0'/>
|
||||
<intb val='4'/>
|
||||
</lshift_exp>
|
||||
<tokenfield bigendian='false' signbit='false' bitstart='8' bitend='11'
|
||||
bytestart='1' byteend='1' shift='0'/>
|
||||
</or_exp>
|
||||
""",
|
||||
"Test", null, true);
|
||||
PatternExpression exp = PatternExpression.restoreExpression(parser, null);
|
||||
public void testCatOrSolver() throws NeedsBackfillException, DecoderException, IOException {
|
||||
PatchPackedEncode encode = new PatchPackedEncode();
|
||||
encode.clear();
|
||||
encode.openElement(ELEM_OR_EXP);
|
||||
encode.openElement(ELEM_LSHIFT_EXP);
|
||||
encode.openElement(ELEM_TOKENFIELD);
|
||||
encode.writeBool(ATTRIB_BIGENDIAN, false);
|
||||
encode.writeBool(ATTRIB_SIGNBIT, false);
|
||||
encode.writeSignedInteger(ATTRIB_STARTBIT, 0);
|
||||
encode.writeSignedInteger(ATTRIB_ENDBIT, 3);
|
||||
encode.writeSignedInteger(ATTRIB_STARTBYTE, 0);
|
||||
encode.writeSignedInteger(ATTRIB_ENDBYTE, 0);
|
||||
encode.writeSignedInteger(ATTRIB_SHIFT, 0);
|
||||
encode.closeElement(ELEM_TOKENFIELD);
|
||||
encode.openElement(ELEM_INTB);
|
||||
encode.writeSignedInteger(ATTRIB_VAL, 4);
|
||||
encode.closeElement(ELEM_INTB);
|
||||
encode.closeElement(ELEM_LSHIFT_EXP);
|
||||
encode.openElement(ELEM_TOKENFIELD);
|
||||
encode.writeBool(ATTRIB_BIGENDIAN, false);
|
||||
encode.writeBool(ATTRIB_SIGNBIT, false);
|
||||
encode.writeSignedInteger(ATTRIB_STARTBIT, 0);
|
||||
encode.writeSignedInteger(ATTRIB_ENDBIT, 11);
|
||||
encode.writeSignedInteger(ATTRIB_STARTBYTE, 1);
|
||||
encode.writeSignedInteger(ATTRIB_ENDBYTE, 1);
|
||||
encode.writeSignedInteger(ATTRIB_SHIFT, 0);
|
||||
encode.closeElement(ELEM_TOKENFIELD);
|
||||
encode.closeElement(ELEM_OR_EXP);
|
||||
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
|
||||
encode.writeTo(outStream);
|
||||
byte[] bytes = outStream.toByteArray();
|
||||
PackedDecode decoder = new PackedDecode();
|
||||
decoder.open(1024, "Test");
|
||||
decoder.ingestBytes(bytes, 0, bytes.length);
|
||||
decoder.endIngest();
|
||||
// <or_exp>
|
||||
// <lshift_exp>
|
||||
// <tokenfield bigendian='false' signbit='false' bitstart='0' bitend='3'
|
||||
// bytestart='0' byteend='0' shift='0'/>
|
||||
// <intb val='4'/>
|
||||
// </lshift_exp>
|
||||
// <tokenfield bigendian='false' signbit='false' bitstart='8' bitend='11'
|
||||
// bytestart='1' byteend='1' shift='0'/>
|
||||
// </or_exp>
|
||||
PatternExpression exp = PatternExpression.decodeExpression(decoder, null);
|
||||
RecursiveDescentSolver solver = RecursiveDescentSolver.getSolver();
|
||||
AssemblyResolution res =
|
||||
solver.solve(FACTORY, exp, MaskedLong.fromLong(0x78), Collections.emptyMap(),
|
||||
FACTORY.nop("NOP"), "Test");
|
||||
AssemblyResolution res = solver.solve(FACTORY, exp, MaskedLong.fromLong(0x78),
|
||||
Collections.emptyMap(), FACTORY.nop("NOP"), "Test");
|
||||
AssemblyResolution e = FACTORY.fromString("ins:X7:X8", "Test", null);
|
||||
assertEquals(e, res);
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
|
||||
private AddressFactory addrFactory;
|
||||
|
||||
private void testSignedAttributes(Encoder encoder, Decoder decoder)
|
||||
private void testSignedAttributes(CachedEncoder encoder, Decoder decoder)
|
||||
throws DecoderException, IOException
|
||||
|
||||
{
|
||||
|
@ -50,7 +50,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
encoder.writeTo(outStream);
|
||||
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
|
||||
decoder.open(1 << 20, "testSignedAttributes");
|
||||
decoder.ingestStream(inStream);
|
||||
decoder.ingestStreamToNextTerminator(inStream);
|
||||
decoder.endIngest();
|
||||
int el = decoder.openElement(ELEM_ADDR);
|
||||
int flags = 0;
|
||||
|
@ -109,7 +109,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
assertEquals(flags, 0x1ff);
|
||||
}
|
||||
|
||||
private void testUnsignedAttributes(Encoder encoder, Decoder decoder)
|
||||
private void testUnsignedAttributes(CachedEncoder encoder, Decoder decoder)
|
||||
throws DecoderException, IOException
|
||||
|
||||
{
|
||||
|
@ -129,7 +129,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
encoder.writeTo(outStream);
|
||||
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
|
||||
decoder.open(1 << 20, "testUnsignedAttributes");
|
||||
decoder.ingestStream(inStream);
|
||||
decoder.ingestStreamToNextTerminator(inStream);
|
||||
decoder.endIngest();
|
||||
int el = decoder.openElement(ELEM_ADDR);
|
||||
long val = decoder.readUnsignedInteger(ATTRIB_ALIGN);
|
||||
|
@ -155,7 +155,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
decoder.closeElement(el);
|
||||
}
|
||||
|
||||
private void testMixedAttributes(Encoder encoder, Decoder decoder)
|
||||
private void testMixedAttributes(CachedEncoder encoder, Decoder decoder)
|
||||
throws DecoderException, IOException {
|
||||
encoder.openElement(ELEM_ADDR);
|
||||
encoder.writeSignedInteger(ATTRIB_ALIGN, 456);
|
||||
|
@ -165,7 +165,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
encoder.writeTo(outStream);
|
||||
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
|
||||
decoder.open(1 << 20, "testMixedAttributes");
|
||||
decoder.ingestStream(inStream);
|
||||
decoder.ingestStreamToNextTerminator(inStream);
|
||||
decoder.endIngest();
|
||||
int alignVal = -1;
|
||||
int extrapopVal = -1;
|
||||
|
@ -187,7 +187,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
assertEquals(extrapopVal, 800);
|
||||
}
|
||||
|
||||
private void testAttributes(Encoder encoder, Decoder decoder)
|
||||
private void testAttributes(CachedEncoder encoder, Decoder decoder)
|
||||
throws DecoderException, IOException
|
||||
|
||||
{
|
||||
|
@ -209,7 +209,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
encoder.writeTo(outStream);
|
||||
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
|
||||
decoder.open(1 << 20, "testAttributes");
|
||||
decoder.ingestStream(inStream);
|
||||
decoder.ingestStreamToNextTerminator(inStream);
|
||||
decoder.endIngest();
|
||||
int el = decoder.openElement(ELEM_DATA);
|
||||
boolean bval = decoder.readBool(ATTRIB_ALIGN);
|
||||
|
@ -229,7 +229,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
decoder.closeElement(el);
|
||||
}
|
||||
|
||||
private void testHierarchy(Encoder encoder, Decoder decoder)
|
||||
private void testHierarchy(CachedEncoder encoder, Decoder decoder)
|
||||
throws IOException, DecoderException
|
||||
|
||||
{
|
||||
|
@ -273,7 +273,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
encoder.writeTo(outStream);
|
||||
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
|
||||
decoder.open(1 << 20, "testHierarchy");
|
||||
decoder.ingestStream(inStream);
|
||||
decoder.ingestStreamToNextTerminator(inStream);
|
||||
decoder.endIngest();
|
||||
int el1 = decoder.openElement(ELEM_DATA);
|
||||
// Skip over the bool
|
||||
|
@ -303,7 +303,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
decoder.closeElementSkipping(el1);
|
||||
}
|
||||
|
||||
private void testUnexpectedEof(Encoder encoder, Decoder decoder) throws IOException
|
||||
private void testUnexpectedEof(CachedEncoder encoder, Decoder decoder) throws IOException
|
||||
|
||||
{
|
||||
encoder.openElement(ELEM_DATA);
|
||||
|
@ -316,7 +316,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
encoder.writeTo(outStream);
|
||||
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
|
||||
decoder.open(1 << 20, "testAttributes");
|
||||
decoder.ingestStream(inStream);
|
||||
decoder.ingestStreamToNextTerminator(inStream);
|
||||
decoder.endIngest();
|
||||
int el1 = decoder.openElement(ELEM_DATA);
|
||||
int el2 = decoder.openElement(ELEM_INPUT);
|
||||
|
@ -329,7 +329,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
assertTrue(sawUnexpectedError);
|
||||
}
|
||||
|
||||
public void testNoremaining(Encoder encoder, Decoder decoder)
|
||||
public void testNoremaining(CachedEncoder encoder, Decoder decoder)
|
||||
throws IOException, DecoderException
|
||||
|
||||
{
|
||||
|
@ -341,7 +341,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
encoder.writeTo(outStream);
|
||||
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
|
||||
decoder.open(1 << 20, "testNoremaining");
|
||||
decoder.ingestStream(inStream);
|
||||
decoder.ingestStreamToNextTerminator(inStream);
|
||||
decoder.endIngest();
|
||||
decoder.openElement(ELEM_INPUT);
|
||||
int el2 = decoder.openElement(ELEM_OFF);
|
||||
|
@ -356,7 +356,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
assertTrue(sawNoRemaining);
|
||||
}
|
||||
|
||||
private void testOpenmismatch(Encoder encoder, Decoder decoder)
|
||||
private void testOpenmismatch(CachedEncoder encoder, Decoder decoder)
|
||||
throws IOException, DecoderException
|
||||
|
||||
{
|
||||
|
@ -368,7 +368,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
encoder.writeTo(outStream);
|
||||
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
|
||||
decoder.open(1 << 20, "testOpenmismatch");
|
||||
decoder.ingestStream(inStream);
|
||||
decoder.ingestStreamToNextTerminator(inStream);
|
||||
decoder.endIngest();
|
||||
decoder.openElement(ELEM_INPUT);
|
||||
boolean sawOpenMismatch = false;
|
||||
|
@ -381,7 +381,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
assertTrue(sawOpenMismatch);
|
||||
}
|
||||
|
||||
private void testClosemismatch(Encoder encoder, Decoder decoder)
|
||||
private void testClosemismatch(CachedEncoder encoder, Decoder decoder)
|
||||
throws IOException, DecoderException
|
||||
|
||||
{
|
||||
|
@ -393,7 +393,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
encoder.writeTo(outStream);
|
||||
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
|
||||
decoder.open(1 << 20, "testClosemismatch");
|
||||
decoder.ingestStream(inStream);
|
||||
decoder.ingestStreamToNextTerminator(inStream);
|
||||
decoder.endIngest();
|
||||
int el1 = decoder.openElement(ELEM_INPUT);
|
||||
boolean sawCloseMismatch = false;
|
||||
|
@ -419,7 +419,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
|
||||
@Test
|
||||
public void testMarshalSignedPacked() throws DecoderException, IOException {
|
||||
PackedEncode encoder = new PackedEncode();
|
||||
PatchPackedEncode encoder = new PatchPackedEncode();
|
||||
encoder.clear();
|
||||
PackedDecode decoder = new PackedDecode(addrFactory);
|
||||
testSignedAttributes(encoder, decoder);
|
||||
|
@ -427,7 +427,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
|
||||
@Test
|
||||
public void marshalUnsignedPacked() throws DecoderException, IOException {
|
||||
PackedEncode encoder = new PackedEncode();
|
||||
PatchPackedEncode encoder = new PatchPackedEncode();
|
||||
encoder.clear();
|
||||
PackedDecode decoder = new PackedDecode(addrFactory);
|
||||
testUnsignedAttributes(encoder, decoder);
|
||||
|
@ -435,7 +435,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
|
||||
@Test
|
||||
public void marshalMixedPacked() throws DecoderException, IOException {
|
||||
PackedEncode encoder = new PackedEncode();
|
||||
PatchPackedEncode encoder = new PatchPackedEncode();
|
||||
encoder.clear();
|
||||
PackedDecode decoder = new PackedDecode(addrFactory);
|
||||
testMixedAttributes(encoder, decoder);
|
||||
|
@ -443,7 +443,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
|
||||
@Test
|
||||
public void marshalAttribsPacked() throws DecoderException, IOException {
|
||||
PackedEncode encoder = new PackedEncode();
|
||||
PatchPackedEncode encoder = new PatchPackedEncode();
|
||||
encoder.clear();
|
||||
PackedDecode decoder = new PackedDecode(addrFactory);
|
||||
testAttributes(encoder, decoder);
|
||||
|
@ -451,7 +451,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
|
||||
@Test
|
||||
public void marshalHierarchyPacked() throws DecoderException, IOException {
|
||||
PackedEncode encoder = new PackedEncode();
|
||||
PatchPackedEncode encoder = new PatchPackedEncode();
|
||||
encoder.clear();
|
||||
PackedDecode decoder = new PackedDecode(addrFactory);
|
||||
testHierarchy(encoder, decoder);
|
||||
|
@ -459,7 +459,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
|
||||
@Test
|
||||
public void marshalUnexpectedPacked() throws IOException {
|
||||
PackedEncode encoder = new PackedEncode();
|
||||
PatchPackedEncode encoder = new PatchPackedEncode();
|
||||
encoder.clear();
|
||||
PackedDecode decoder = new PackedDecode(addrFactory);
|
||||
testUnexpectedEof(encoder, decoder);
|
||||
|
@ -467,7 +467,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
|
||||
@Test
|
||||
public void marshalNoremainingPacked() throws IOException, DecoderException {
|
||||
PackedEncode encoder = new PackedEncode();
|
||||
PatchPackedEncode encoder = new PatchPackedEncode();
|
||||
encoder.clear();
|
||||
PackedDecode decoder = new PackedDecode(addrFactory);
|
||||
testNoremaining(encoder, decoder);
|
||||
|
@ -475,7 +475,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
|
||||
@Test
|
||||
public void marshalOpenmismatchPacked() throws IOException, DecoderException {
|
||||
PackedEncode encoder = new PackedEncode();
|
||||
PatchPackedEncode encoder = new PatchPackedEncode();
|
||||
encoder.clear();
|
||||
PackedDecode decoder = new PackedDecode(addrFactory);
|
||||
testOpenmismatch(encoder, decoder);
|
||||
|
@ -483,7 +483,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
|
||||
@Test
|
||||
public void marshalClosemismatchPacked() throws IOException, DecoderException {
|
||||
PackedEncode encoder = new PackedEncode();
|
||||
PatchPackedEncode encoder = new PatchPackedEncode();
|
||||
encoder.clear();
|
||||
PackedDecode decoder = new PackedDecode(addrFactory);
|
||||
testClosemismatch(encoder, decoder);
|
||||
|
@ -492,7 +492,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
@Test
|
||||
public void marshalBufferpad() throws IOException, DecoderException {
|
||||
assertEquals(LinkedByteBuffer.BUFFER_SIZE, 1024);
|
||||
PackedEncode encoder = new PackedEncode();
|
||||
PatchPackedEncode encoder = new PatchPackedEncode();
|
||||
encoder.clear();
|
||||
encoder.openElement(ELEM_INPUT); // 1-byte
|
||||
for (int i = 0; i < 511; ++i) {
|
||||
|
@ -506,7 +506,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
|
|||
ByteArrayInputStream inStream = new ByteArrayInputStream(bytesOut);
|
||||
PackedDecode decoder = new PackedDecode(addrFactory);
|
||||
decoder.open(1 << 20, "marshalBufferpad");
|
||||
decoder.ingestStream(inStream);
|
||||
decoder.ingestStreamToNextTerminator(inStream);
|
||||
decoder.endIngest();
|
||||
int el = decoder.openElement(ELEM_INPUT);
|
||||
for (int i = 0; i < 511; ++i) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue