Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
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]
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
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()
Ejemplo n.º 6
0
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()
Ejemplo n.º 7
0
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()
Ejemplo n.º 8
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()
Ejemplo n.º 9
0
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
Ejemplo n.º 10
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()
Ejemplo n.º 11
0
 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
Ejemplo n.º 12
0
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()
Ejemplo n.º 13
0
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()
Ejemplo n.º 14
0
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()
Ejemplo n.º 15
0
    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
Ejemplo n.º 16
0
  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