Example #1
0
        public ScanResults ScanInstructions(ScanResults sr)
        {
            var ranges = FindUnscannedRanges().ToList();

            DumpRanges(ranges);
            var  binder    = new StorageBinder();
            var  shsc      = new ShingledScanner(this.program, this.host, binder, sr, this.eventListener);
            bool unscanned = false;

            foreach (var range in ranges)
            {
                unscanned = true;
                try
                {
                    shsc.ScanRange(range.Item1,
                                   range.Item2,
                                   range.Item3,
                                   range.Item3.ToLinear() - range.Item2.ToLinear());
                }
                catch (AddressCorrelatedException aex)
                {
                    host.Error(aex.Address, aex.Message);
                }
            }
            if (!unscanned)
            {
                // No unscanned blocks were found.
                return(null);
            }
            shsc.Dump("After shingle scan graph built");
            return(sr);
        }
Example #2
0
        /// <summary>
        /// Given an image reader positioned at a Keil sparse switch table, generates
        /// an <see cref="RtlInstructionCluster" /> that implements the table as a
        /// sequence of RTL if-instructions.
        /// </summary>
        private RtlInstructionCluster MakeCluster(Address addrPatch, ImageReader rdr)
        {
            var binder = new StorageBinder();
            var areg   = binder.EnsureRegister(Registers.A);
            var m      = new RtlEmitter(new List <RtlInstruction>());

            while (rdr.TryReadBeUInt16(out ushort uAddrDst))
            {
                if (uAddrDst == 0)
                {
                    if (!rdr.TryReadBeUInt16(out uAddrDst))
                    {
                        break;
                    }
                    m.Goto(Address.Ptr16(uAddrDst));
                    break;
                }
                if (!rdr.TryReadByte(out byte bValue))
                {
                    break;
                }
                var addrDst = Address.Ptr16(uAddrDst);
                m.BranchInMiddleOfInstruction(m.Eq(areg, bValue), addrDst, InstrClass.ConditionalTransfer);
            }
            int length  = (int)(rdr.Address - addrPatch);
            var cluster = m.MakeCluster(addrPatch, length, InstrClass.Transfer);

            return(cluster);
        }
Example #3
0
        public void Stgb_Sequence()
        {
            var stgb = new StorageBinder();
            var r1   = RegisterStorage.Reg32("r1", 1);
            var r2   = RegisterStorage.Reg32("r2", 2);
            var r3   = RegisterStorage.Reg32("r3", 3);
            var seqA = stgb.EnsureSequence(PrimitiveType.CreateWord(96), r1, r2, r3);
            var seqB = stgb.EnsureSequence(PrimitiveType.CreateWord(96), r1, r2, r3);

            Assert.AreSame(seqA, seqB);
        }
Example #4
0
        public void Stgb_FlagReg()
        {
            var stgb     = new StorageBinder();
            var flagReg1 = new RegisterStorage("flagreg1", 41, 0, PrimitiveType.Word32);
            var flagReg2 = new RegisterStorage("flagreg2", 42, 0, PrimitiveType.Word32);
            var grf      = stgb.EnsureFlagGroup(flagReg1, 0x05, "CZ", PrimitiveType.Byte);
            var grf2     = stgb.EnsureFlagGroup(flagReg1, 0x05, "CZ", PrimitiveType.Byte);

            Assert.AreSame(grf, grf2);
            var grf3 = stgb.EnsureFlagGroup(flagReg2, 0x05, "cz", PrimitiveType.Byte);

            Assert.AreNotSame(grf, grf3);
        }
Example #5
0
 public void Setup()
 {
     arch    = new FakeArchitecture();
     program = new Program {
         Architecture = arch,
         SegmentMap   = new SegmentMap(
             Address.Ptr32(0x00120000),
             new ImageSegment(
                 ".text",
                 new MemoryArea(Address.Ptr32(0x00120000), new byte[0x10000]),
                 AccessMode.ReadExecute))
     };
     binder = new StorageBinder();
     graph  = new DiGraph <RtlBlock>();
     host   = new RtlBackwalkHost(program, graph);
 }