Example #1
0
        public override Program LoadProgram(Address?addrLoad)
        {
            addrLoad ??= PreferredBaseAddress;
            var cfgSvc = Services.RequireService <IConfigurationService>();

            arch = (M68kArchitecture)cfgSvc.GetArchitecture("m68k") !;
            var imgReader = new BeImageReader(RawImage, 0);
            var parse     = new HunkFileParser(imgReader, false);

            this.hunkFile = parse.Parse();
            BuildSegments();
            this.firstCodeHunk = parse.FindFirstCodeHunk();
            var platform = cfgSvc.GetEnvironment("amigaOS").Load(Services, arch);
            var imageMap = platform.CreateAbsoluteMemoryMap();
            var mem      = new ByteMemoryArea(addrLoad, RelocateBytes(addrLoad));
            var program  = new Program(
                new SegmentMap(
                    mem.BaseAddress,
                    new ImageSegment(
                        "code", mem, AccessMode.ReadWriteExecute)),
                arch,
                platform);

            var sym = ImageSymbol.Procedure(program.Architecture, addrLoad, state: arch.CreateProcessorState());

            program.ImageSymbols[sym.Address] = sym;
            program.EntryPoints[sym.Address]  = sym;
            return(program);
        }
Example #2
0
        /*
         * bin = args.bin
         * bin_args = args.args
         * print "vamos: %s %s" % (bin, bin_args)
         *
         # --- load binary ---
         # hunk_file = HunkReader.HunkReader()
         # fobj = file(bin,"rb")
         # result = hunk_file.read_file_obj(bin,fobj,None)
         # if result != Hunk.RESULT_OK:
         # print "Error loading '%s'" % (bin)
         # sys.exit(1)
         # build segments
         # ok = hunk_file.build_segments()
         # if not ok:
         # print "Error building segments for '%s'" % (bin)
         # sys.exit(2)
         # make sure its a loadseg()
         # if hunk_file.type != Hunk.TYPE_LOADSEG:
         # print "File not loadSeg()able: '%s'" % (bin)
         # sys.exit(3)
         #
         # --- create memory layout ---
         # print "setting up memory layout"
         # layout = MemoryLayout.MemoryLayout(verbose=True)
         # context = MachineContext.MachineContext(MusashiCPU(),layout)
         #
         # place prog segments
         # prog_base = 0x010000
         # prog_start = prog_base
         # off = prog_base
         # relocator = HunkRelocate.HunkRelocate(hunk_file)
         # prog_data = relocator.relocate_one_block(prog_base, padding=8)
         # prog_size = len(prog_data)
         # prog_mem = MemoryBlock.MemoryBlock("prog", prog_base, prog_size)
         # prog_mem.write_data(prog_base, prog_data)
         # layout.add_range(prog_mem)
         # print prog_mem
         #
         # some segment info
         # seg_sizes = relocator.get_sizes()
         # seg_addrs = relocator.get_seq_addrs(prog_base, padding=8)
         # for i in xrange(len(seg_sizes)):
         # print "  seg:  @%06x  +%06x" % (seg_addrs[i], seg_sizes[i])
         #
         # setup stack
         # magic_end = 0xff0000
         # stack_base = 0x080000
         # stack_size = 0x001000
         # stack_end = stack_base + stack_size
         # stack_mem = MemoryBlock.MemoryBlock("stack", stack_base, stack_size)
         # stack_initial = stack_end - 4
         # stack_mem.w32(stack_initial, magic_end)
         # layout.add_range(stack_mem)
         #
         # setup argument
         # arg_base = 0x1000
         # arg_text = " ".join(bin_args)
         # arg_len  = len(arg_text)
         # arg_size = arg_len + 1
         # arg_mem  = MemoryBlock.MemoryBlock("args", arg_base, arg_size)
         # arg_mem.write_data(arg_base, arg_text)
         # arg_mem.write_mem(0, arg_base + arg_len, 0)
         # layout.add_range(arg_mem)
         # print "args: %s (%d)" % (arg_text, arg_len)
         # print arg_mem
         */

        public override RelocationResults Relocate(Program program, Address addrLoad)
        {
            var entries = new List <EntryPoint>
            {
                //$TODO: what are the registers on entry?
                new EntryPoint(addrLoad, arch.CreateProcessorState())
            };

            return(new RelocationResults(entries, new List <Address>()));
        }
Example #3
0
        private void RunTest(Address addrBase)
        {
            var project = new Project {
                Programs = { program }
            };

            scanner = new Scanner(
                program,
                new ImportResolver(project, program, new FakeDecompilerEventListener()),
                sc);
            scanner.EnqueueEntryPoint(new EntryPoint(addrBase, arch.CreateProcessorState()));
            scanner.ScanImage();
        }
Example #4
0
        public void AOS_LookupA6Call()
        {
            Given_Func("#1 512 0x200 Allocate( heap/a1, size/d0)\n");

            When_Create_Platform();
            m.Call(m.IAdd(binder.EnsureRegister(Registers.a6), -512), 4);
            var state = arch.CreateProcessorState();
            var svc   = platform.FindService(rtls.Last(), state);

            Assert.AreEqual("Allocate", svc.Name);
            Assert.AreEqual(2, svc.Signature.Parameters.Length);
            Assert.AreEqual("a1", svc.Signature.Parameters[0].Storage.ToString());
            Assert.AreEqual("d0", svc.Signature.Parameters[1].Storage.ToString());
        }
Example #5
0
        private void RunTest(Address addrBase)
        {
            var project = new Project {
                Programs = { program }
            };

            scanner = new Scanner(
                program,
                new Dictionary <Address, ProcedureSignature>(),
                new ImportResolver(project),
                listener);
            scanner.EnqueueEntryPoint(new EntryPoint(addrBase, arch.CreateProcessorState()));
            scanner.ScanImage();
        }
Example #6
0
        /*
         * bin = args.bin
         * bin_args = args.args
         * print "vamos: %s %s" % (bin, bin_args)
         *
         # --- load binary ---
         # hunk_file = HunkReader.HunkReader()
         # fobj = file(bin,"rb")
         # result = hunk_file.read_file_obj(bin,fobj,None)
         # if result != Hunk.RESULT_OK:
         # print "Error loading '%s'" % (bin)
         # sys.exit(1)
         # build segments
         # ok = hunk_file.build_segments()
         # if not ok:
         # print "Error building segments for '%s'" % (bin)
         # sys.exit(2)
         # make sure its a loadseg()
         # if hunk_file.type != Hunk.TYPE_LOADSEG:
         # print "File not loadSeg()able: '%s'" % (bin)
         # sys.exit(3)
         #
         # --- create memory layout ---
         # print "setting up memory layout"
         # layout = MemoryLayout.MemoryLayout(verbose=True)
         # context = MachineContext.MachineContext(MusashiCPU(),layout)
         #
         # place prog segments
         # prog_base = 0x010000
         # prog_start = prog_base
         # off = prog_base
         # relocator = HunkRelocate.HunkRelocate(hunk_file)
         # prog_data = relocator.relocate_one_block(prog_base, padding=8)
         # prog_size = len(prog_data)
         # prog_mem = MemoryBlock.MemoryBlock("prog", prog_base, prog_size)
         # prog_mem.write_data(prog_base, prog_data)
         # layout.add_range(prog_mem)
         # print prog_mem
         #
         # some segment info
         # seg_sizes = relocator.get_sizes()
         # seg_addrs = relocator.get_seq_addrs(prog_base, padding=8)
         # for i in xrange(len(seg_sizes)):
         # print "  seg:  @%06x  +%06x" % (seg_addrs[i], seg_sizes[i])
         #
         # setup stack
         # magic_end = 0xff0000
         # stack_base = 0x080000
         # stack_size = 0x001000
         # stack_end = stack_base + stack_size
         # stack_mem = MemoryBlock.MemoryBlock("stack", stack_base, stack_size)
         # stack_initial = stack_end - 4
         # stack_mem.w32(stack_initial, magic_end)
         # layout.add_range(stack_mem)
         #
         # setup argument
         # arg_base = 0x1000
         # arg_text = " ".join(bin_args)
         # arg_len  = len(arg_text)
         # arg_size = arg_len + 1
         # arg_mem  = MemoryBlock.MemoryBlock("args", arg_base, arg_size)
         # arg_mem.write_data(arg_base, arg_text)
         # arg_mem.write_mem(0, arg_base + arg_len, 0)
         # layout.add_range(arg_mem)
         # print "args: %s (%d)" % (arg_text, arg_len)
         # print arg_mem
         */

        public override RelocationResults Relocate(Program program, Address addrLoad)
        {
            var sym = new ImageSymbol(addrLoad)
            {
                Type           = SymbolType.Procedure,
                ProcessorState = arch.CreateProcessorState()
            };

            var entries = new List <ImageSymbol>
            {
                //$TODO: what are the registers on entry?
            };

            return(new RelocationResults(
                       new List <ImageSymbol> {
                sym
            },
                       new SortedList <Address, ImageSymbol> {
                { sym.Address, sym }
            }));
        }
Example #7
0
 protected override IEnumerable <RtlInstructionCluster> GetInstructionStream(Frame frame, IRewriterHost host)
 {
     return(arch.CreateRewriter(mem.CreateLeReader(0), arch.CreateProcessorState(), arch.CreateFrame(), host));
 }
Example #8
0
        /*
         * bin = args.bin
         * bin_args = args.args
         * print "vamos: %s %s" % (bin, bin_args)
         *
         # --- load binary ---
         # hunk_file = HunkReader.HunkReader()
         # fobj = file(bin,"rb")
         # result = hunk_file.read_file_obj(bin,fobj,None)
         # if result != Hunk.RESULT_OK:
         # print "Error loading '%s'" % (bin)
         # sys.exit(1)
         # build segments
         # ok = hunk_file.build_segments()
         # if not ok:
         # print "Error building segments for '%s'" % (bin)
         # sys.exit(2)
         # make sure its a loadseg()
         # if hunk_file.type != Hunk.TYPE_LOADSEG:
         # print "File not loadSeg()able: '%s'" % (bin)
         # sys.exit(3)
         #
         # --- create memory layout ---
         # print "setting up memory layout"
         # layout = MemoryLayout.MemoryLayout(verbose=True)
         # context = MachineContext.MachineContext(MusashiCPU(),layout)
         #
         # place prog segments
         # prog_base = 0x010000
         # prog_start = prog_base
         # off = prog_base
         # relocator = HunkRelocate.HunkRelocate(hunk_file)
         # prog_data = relocator.relocate_one_block(prog_base, padding=8)
         # prog_size = len(prog_data)
         # prog_mem = MemoryBlock.MemoryBlock("prog", prog_base, prog_size)
         # prog_mem.write_data(prog_base, prog_data)
         # layout.add_range(prog_mem)
         # print prog_mem
         #
         # some segment info
         # seg_sizes = relocator.get_sizes()
         # seg_addrs = relocator.get_seq_addrs(prog_base, padding=8)
         # for i in xrange(len(seg_sizes)):
         # print "  seg:  @%06x  +%06x" % (seg_addrs[i], seg_sizes[i])
         #
         # setup stack
         # magic_end = 0xff0000
         # stack_base = 0x080000
         # stack_size = 0x001000
         # stack_end = stack_base + stack_size
         # stack_mem = MemoryBlock.MemoryBlock("stack", stack_base, stack_size)
         # stack_initial = stack_end - 4
         # stack_mem.w32(stack_initial, magic_end)
         # layout.add_range(stack_mem)
         #
         # setup argument
         # arg_base = 0x1000
         # arg_text = " ".join(bin_args)
         # arg_len  = len(arg_text)
         # arg_size = arg_len + 1
         # arg_mem  = MemoryBlock.MemoryBlock("args", arg_base, arg_size)
         # arg_mem.write_data(arg_base, arg_text)
         # arg_mem.write_mem(0, arg_base + arg_len, 0)
         # layout.add_range(arg_mem)
         # print "args: %s (%d)" % (arg_text, arg_len)
         # print arg_mem
         */

        public override RelocationResults Relocate(Program program, Address addrLoad)
        {
            var sym     = ImageSymbol.Procedure(program.Architecture, addrLoad, state: arch.CreateProcessorState());
            var entries = new List <ImageSymbol>
            {
                //$TODO: what are the registers on entry?
            };

            return(new RelocationResults(
                       new List <ImageSymbol> {
                sym
            },
                       new SortedList <Address, ImageSymbol> {
                { sym.Address, sym }
            }));
        }