def atypes_resident_setup_test(): mem = MockMemory(fill=23) alloc = MemoryAlloc(mem) # alloc res2 = Resident.alloc(alloc, "bla.library", "blub") res2.setup( flags=ResidentFlags.RTF_AUTOINIT, version=42, type=NodeType.NT_DEVICE, pri=-7, init=0xDEADBEEF, ) # find resource res = Resident.find(mem, 0, 1024) assert res.get_match_word() == res.RTC_MATCHWORD assert res.get_match_tag() == res.get_addr() assert res.get_end_skip() >= res.get_addr() + res.get_type_size() assert res.get_flags() == ResidentFlags.RTF_AUTOINIT assert res.get_version() == 42 assert res.get_type() == NodeType.NT_DEVICE assert res.get_pri() == -7 assert res.get_name() == "bla.library" assert res.get_id_string() == "blub" assert res.get_init() == 0xDEADBEEF # free res2.free() assert alloc.is_all_free()
def atypes_resident_find_lib_test(binbuild): mem = MockMemory(fill=23) addr, size, end = load_lib(mem, binbuild) # search list res = Resident.find(mem, addr, size, only_first=False) assert len(res) == 1 res_obj = res[0] assert res_obj.get_addr() > addr assert res_obj.get_addr() < end # search first only res2 = Resident.find(mem, addr, size) assert res == [res2]
def atypes_resident_find_lib_test(buildlibnix): mem = MockMemory(fill=23) addr, size, end = load_lib(mem, buildlibnix) # search list res = Resident.find(mem, addr, size, only_first=False) assert len(res) == 1 assert res[0].is_valid() res_obj = res[0] assert res_obj.get_addr() > addr assert res_obj.get_addr() < end # search first only res2 = Resident.find(mem, addr, size) assert res == [res2] assert res2.is_valid()
def libnative_initres_init_test(buildlibnix): machine = Machine() mem = machine.get_mem() cpu = machine.get_cpu() traps = machine.get_traps() alloc = MemoryAlloc.for_machine(machine) init_addr = machine.get_ram_begin() - 4 sp = init_addr - 4 # load lib seglist, addr, size, end = load_lib(alloc, buildlibnix) # setup init func def init_func(op, pc): assert cpu.r_reg(REG_A0) == seglist.get_baddr() # return my lib_base cpu.w_reg(REG_D0, 0xcafebabe) trap_id = traps.setup(init_func, auto_rts=True) mem.w16(init_addr, trap_id | 0xa000) # build fake resident res = Resident.alloc(alloc, "bla.library", "blub") res.setup(flags=0, version=42, type=NodeType.NT_LIBRARY, pri=-7, init=init_addr) # init resident ir = InitRes(machine, alloc) lib_base, mem_obj = ir.init_resident( res.get_addr(), seglist.get_baddr(), run_sp=sp) assert lib_base == 0xcafebabe assert mem_obj is None seglist.free() res.free() traps.free(trap_id) assert alloc.is_all_free()
def atypes_resident_alloc_test(): mem = MockMemory(fill=23) alloc = MemoryAlloc(mem) # alloc res = Resident.alloc(alloc, "bla.library", "blub") # free res.free() assert alloc.is_all_free()
def atypes_resident_setup_test(): mem = MockMemory(fill=23) alloc = MemoryAlloc(mem) # alloc res2 = Resident.alloc(alloc, "bla.library", "blub") res2.setup(flags=ResidentFlags.RTF_AUTOINIT, version=42, type=NodeType.NT_DEVICE, pri=-7, init=0xdeadbeef) # find resource res = Resident.find(mem, 0, 1024) assert res.get_match_word() == res.RTC_MATCHWORD assert res.get_match_tag() == res.get_addr() assert res.get_end_skip() >= res.get_addr() + res.get_type_size() assert res.get_flags() == ResidentFlags.RTF_AUTOINIT assert res.get_version() == 42 assert res.get_type() == NodeType.NT_DEVICE assert res.get_pri() == -7 assert res.get_name() == "bla.library" assert res.get_id_string() == "blub" assert res.get_init() == 0xdeadbeef # free res2.free() assert alloc.is_all_free()
def libnative_initres_autoinit_test(buildlibnix): machine = Machine() mem = machine.get_mem() cpu = machine.get_cpu() traps = machine.get_traps() alloc = MemoryAlloc.for_machine(machine) init_addr = machine.get_ram_begin() - 4 sp = init_addr - 4 # load lib seglist, addr, size, end = load_lib(alloc, buildlibnix) # setup init func def init_func(op, pc): assert cpu.r_reg(REG_A0) == seglist.get_baddr() trap_id = traps.setup(init_func, auto_rts=True) mem.w16(init_addr, trap_id | 0xA000) # fake vectors vectors = 0x100 mem.w32(vectors, 0x400) mem.w32(vectors + 4, 0x600) mem.w32(vectors + 8, 0x800) mem.w32(vectors + 12, 0xFFFFFFFF) # build fake resident res = Resident.alloc(alloc, "bla.library", "blub") res.setup(flags=ResidentFlags.RTF_AUTOINIT, version=42, type=NodeType.NT_LIBRARY, pri=-7) auto_init = AutoInit.alloc(alloc) auto_init.setup(functions=vectors, init_func=init_addr) res.set_auto_init(auto_init) # setup exec lib exec_lib = ExecLibrary.alloc(alloc, "exec.library", "bla", 36) exec_lib.setup() mem.w32(4, exec_lib.get_addr()) # init resident ir = InitRes(machine, alloc) lib_base, mem_obj = ir.init_resident(res.get_addr(), seglist.get_baddr(), run_sp=sp, exec_lib=exec_lib) assert lib_base assert mem_obj seglist.free() res.free() auto_init.free() alloc.free_memory(mem_obj) exec_lib.free() traps.free(trap_id) assert alloc.is_all_free()
def atypes_resident_read_lib_test(binbuild): mem = MockMemory(fill=23) addr, size, end = load_lib(mem, binbuild) res = Resident.find(mem, addr, size) assert res.get_match_word() == res.RTC_MATCHWORD assert res.get_match_tag() == res.get_addr() assert res.get_end_skip() >= res.get_addr() + res.get_type_size() assert res.get_flags() == ResidentFlags.RTF_AUTOINIT assert res.get_version() == 0 assert res.get_type() == NodeType.NT_LIBRARY assert res.get_pri() == 0 assert res.get_name() == "simple.library" assert res.get_id_string() == "simple.library 1.0 (07.07.2007)" assert res.get_init() > 0
def libnative_initres_autoinit_test(buildlibnix): machine = Machine() mem = machine.get_mem() cpu = machine.get_cpu() traps = machine.get_traps() alloc = MemoryAlloc.for_machine(machine) init_addr = machine.get_ram_begin() - 4 sp = init_addr - 4 # load lib seglist, addr, size, end = load_lib(alloc, buildlibnix) # setup init func def init_func(op, pc): assert cpu.r_reg(REG_A0) == seglist.get_baddr() trap_id = traps.setup(init_func, auto_rts=True) mem.w16(init_addr, trap_id | 0xa000) # fake vectors vectors = 0x100 mem.w32(vectors, 0x400) mem.w32(vectors+4, 0x600) mem.w32(vectors+8, 0x800) mem.w32(vectors+12, 0xffffffff) # build fake resident res = Resident.alloc(alloc, "bla.library", "blub") res.setup(flags=ResidentFlags.RTF_AUTOINIT, version=42, type=NodeType.NT_LIBRARY, pri=-7) auto_init = AutoInit.alloc(alloc) auto_init.setup(functions=vectors, init_func=init_addr) res.set_auto_init(auto_init) # setup exec lib exec_lib = ExecLibrary.alloc(alloc, "exec.library", "bla", 36) exec_lib.setup() mem.w32(4, exec_lib.get_addr()) # init resident ir = InitRes(machine, alloc) lib_base, mem_obj = ir.init_resident( res.get_addr(), seglist.get_baddr(), run_sp=sp, exec_lib=exec_lib) assert lib_base assert mem_obj seglist.free() res.free() auto_init.free() alloc.free_memory(mem_obj) exec_lib.free() traps.free(trap_id) assert alloc.is_all_free()
def _load_common(self, seglist_baddr, run_sp): # find resident in first hunk seglist = SegList(self.alloc, seglist_baddr) seg = seglist.get_segment() res = Resident.find(self.mem, seg.get_addr(), seg.get_size()) # unload seglist if no resident was found if not res: self.segloader.unload_seglist(seglist_baddr) return 0, 0 # init resident lib_base, _ = self.initres.init_resident(res.get_addr(), seglist.get_baddr(), run_sp=run_sp) # unload seglist on error if lib_base == 0: self.segloader.unload_seglist(seglist_baddr) return 0, 0 return lib_base, seglist_baddr
def atypes_resident_read_lib_test(buildlibnix): mem = MockMemory(fill=23) addr, size, end = load_lib(mem, buildlibnix) res = Resident.find(mem, addr, size) assert res.get_match_word() == res.RTC_MATCHWORD assert res.get_match_tag() == res.get_addr() assert res.get_end_skip() >= res.get_addr() + res.get_type_size() assert res.get_flags() == ResidentFlags.RTF_AUTOINIT assert res.get_version() == 0 assert res.get_type() == NodeType.NT_LIBRARY assert res.get_pri() == 0 assert res.get_name() == "testnix.library" assert res.get_id_string() == "testnix.library 1.0 (07.07.2007)" assert res.get_init() > 0 ai = res.get_auto_init() assert ai.get_addr() == res.get_init() assert ai.get_pos_size() > 0 assert ai.get_functions() > 0 assert ai.get_init_struct() == 0 assert ai.get_init_func() > 0 assert res.is_valid()
def libnative_initres_init_test(buildlibnix): machine = Machine() mem = machine.get_mem() cpu = machine.get_cpu() traps = machine.get_traps() alloc = MemoryAlloc.for_machine(machine) init_addr = machine.get_ram_begin() - 4 sp = init_addr - 4 # load lib seglist, addr, size, end = load_lib(alloc, buildlibnix) # setup init func def init_func(op, pc): assert cpu.r_reg(REG_A0) == seglist.get_baddr() # return my lib_base cpu.w_reg(REG_D0, 0xCAFEBABE) trap_id = traps.setup(init_func, auto_rts=True) mem.w16(init_addr, trap_id | 0xA000) # build fake resident res = Resident.alloc(alloc, "bla.library", "blub") res.setup(flags=0, version=42, type=NodeType.NT_LIBRARY, pri=-7, init=init_addr) # init resident ir = InitRes(machine, alloc) lib_base, mem_obj = ir.init_resident(res.get_addr(), seglist.get_baddr(), run_sp=sp) assert lib_base == 0xCAFEBABE assert mem_obj is None seglist.free() res.free() traps.free(trap_id) assert alloc.is_all_free()
def init_resident(self, resident_addr, seg_list_baddr, label_name=None, run_sp=None, exec_lib=None): """Implement Exec's InitResident Returns lib_base, mem_obj or lib_base, 0 or 0, None """ res = Resident(self.mem, resident_addr) if not res.is_valid(): return 0, None if label_name is None: label_name = "%s_init" % res.name auto_init = res.flags.has_bits(ResidentFlags.RTF_AUTOINIT) if auto_init: ai = res.get_auto_init() # create lib without calling init ml = MakeLib(self.machine, self.alloc) lib_base, mem_obj = ml.make_library( ai.functions, ai.init_struct, 0, ai.pos_size, seg_list_baddr, label_name=label_name, run_sp=run_sp, ) # fill lib lib = Library(self.mem, lib_base) flags = LibFlags.LIBF_CHANGED | LibFlags.LIBF_SUMUSED lib.setup(version=res.version, type=res.type, flags=flags) lib.name = res.name lib.id_string = res.id_string # now call init if ai.init_func != 0: run_name = "InitResident:%s" % res.name lib_base = ml.run_init(ai.init_func, lib_base, seg_list_baddr, run_name, run_sp) if lib_base == 0: return 0, None # add lib to exec list rtype = res.type if rtype == NodeType.NT_LIBRARY: lf = LibFuncs(self.machine, self.alloc) lf.add_library(lib_base, exec_lib) elif rtype == NodeType.NT_DEVICE: # TODO raise NotImplementedError("InitResource(NT_DEVICE)") elif rtype == NodeType.NT_RESOURCE: # TODO raise NotImplementedError("InitResident(NT_RESOURCE)") else: # no auto init, lib_base, or mem_obj lib_base = 0 mem_obj = None # call init func init_func = res.init if init_func != 0: ml = MakeLib(self.machine, self.alloc) lib_base = ml.run_init(init_func, lib_base, seg_list_baddr, label_name, run_sp) return lib_base, mem_obj
def init_resident(self, resident_addr, seg_list_baddr, label_name=None, run_sp=None, exec_lib=None): """Implement Exec's InitResident Returns lib_base, mem_obj or lib_base, 0 or 0, None """ res = Resident(self.mem, resident_addr) if not res.is_valid(): return 0, None if label_name is None: label_name = "%s_init" % res.name auto_init = res.flags.has_bits(ResidentFlags.RTF_AUTOINIT) if auto_init: ai = res.get_auto_init() # create lib without calling init ml = MakeLib(self.machine, self.alloc) lib_base, mem_obj = ml.make_library(ai.functions, ai.init_struct, 0, ai.pos_size, seg_list_baddr, label_name=label_name, run_sp=run_sp) # fill lib lib = Library(self.mem, lib_base) flags = LibFlags.LIBF_CHANGED | LibFlags.LIBF_SUMUSED lib.setup(version=res.version, type=res.type, flags=flags) lib.name = res.name lib.id_string = res.id_string # now call init if ai.init_func != 0: run_name = "InitResident:%s" % res.name lib_base = ml.run_init( ai.init_func, lib_base, seg_list_baddr, run_name, run_sp) if lib_base == 0: return 0, None # add lib to exec list rtype = res.type if rtype == NodeType.NT_LIBRARY: lf = LibFuncs(self.machine, self.alloc) lf.add_library(lib_base, exec_lib) elif rtype == NodeType.NT_DEVICE: # TODO raise NotImplementedError("InitResource(NT_DEVICE)") elif rtype == NodeType.NT_RESOURCE: # TODO raise NotImplementedError("InitResident(NT_RESOURCE)") else: # no auto init, lib_base, or mem_obj lib_base = 0 mem_obj = None # call init func init_func = res.init if init_func != 0: ml = MakeLib(self.machine, self.alloc) lib_base = ml.run_init( init_func, lib_base, seg_list_baddr, label_name, run_sp) return lib_base, mem_obj