def init_struct_test(): mem = MockMemory() # setup init table init_tab = 0x100 mem_ptr = 0x200 ib = InitStructBuilder(mem, init_tab) ib.init_byte(0, 21) ib.init_word(12, 0xdead) ib.init_long(34, 0xcafebabe) ib.init_struct(ib.SIZE_LONG, 40, [23, 42]) ib.init_struct(ib.SIZE_WORD, 64, [11, 7]) ib.init_struct(ib.SIZE_BYTE, 80, [1, 2, 3]) ib.end() # build struct i = InitStruct(mem) i.init_struct(init_tab, mem_ptr, 32) # check struct assert mem.r8(mem_ptr + 0) == 21 assert mem.r16(mem_ptr + 12) == 0xdead assert mem.r32(mem_ptr + 34) == 0xcafebabe assert mem.r32(mem_ptr + 40) == 23 assert mem.r32(mem_ptr + 44) == 42 assert mem.r16(mem_ptr + 64) == 11 assert mem.r16(mem_ptr + 66) == 7 assert mem.r8(mem_ptr + 80) == 1 assert mem.r8(mem_ptr + 81) == 2 assert mem.r8(mem_ptr + 82) == 3
def init_struct_test(): mem = MockMemory() # setup init table init_tab = 0x100 mem_ptr = 0x200 ib = InitStructBuilder(mem, init_tab) ib.init_byte(0, 21) ib.init_word(12, 0xDEAD) ib.init_long(34, 0xCAFEBABE) ib.init_struct(ib.SIZE_LONG, 40, [23, 42]) ib.init_struct(ib.SIZE_WORD, 64, [11, 7]) ib.init_struct(ib.SIZE_BYTE, 80, [1, 2, 3]) ib.end() # build struct i = InitStruct(mem) i.init_struct(init_tab, mem_ptr, 32) # check struct assert mem.r8(mem_ptr + 0) == 21 assert mem.r16(mem_ptr + 12) == 0xDEAD assert mem.r32(mem_ptr + 34) == 0xCAFEBABE assert mem.r32(mem_ptr + 40) == 23 assert mem.r32(mem_ptr + 44) == 42 assert mem.r16(mem_ptr + 64) == 11 assert mem.r16(mem_ptr + 66) == 7 assert mem.r8(mem_ptr + 80) == 1 assert mem.r8(mem_ptr + 81) == 2 assert mem.r8(mem_ptr + 82) == 3
def mem_cache_rwx_write_test(): mem = MemoryCache(0x100, 0x210) # build cache contents mem.w8(0x100, 42) assert mem.r8(0x100) == 42 mem.w16(0x200, 0xdead) assert mem.r16(0x200) == 0xdead mem.w32(0x300, 0xcafebabe) assert mem.r32(0x300) == 0xcafebabe mem.write(0, 0x101, 43) assert mem.read(0, 0x101) == 43 mem.write(1, 0x202, 0x1234) assert mem.read(1, 0x202) == 0x1234 mem.write(2, 0x304, 0x11223344) assert mem.read(2, 0x304) == 0x11223344 # write to main mem main_mem = MockMemory() mem.write_cache(main_mem) # check main mem assert main_mem.r8(0x100) == 42 assert main_mem.r16(0x200) == 0xdead assert main_mem.r32(0x300) == 0xcafebabe assert main_mem.read(0, 0x101) == 43 assert main_mem.read(1, 0x202) == 0x1234 assert main_mem.read(2, 0x304) == 0x11223344
def mem_cache_rwx_read_test(): mem = MockMemory() # build main mem contents mem.w8(0x100, 42) assert mem.r8(0x100) == 42 mem.w16(0x200, 0xDEAD) assert mem.r16(0x200) == 0xDEAD mem.w32(0x300, 0xCAFEBABE) assert mem.r32(0x300) == 0xCAFEBABE mem.write(0, 0x101, 43) assert mem.read(0, 0x101) == 43 mem.write(1, 0x202, 0x1234) assert mem.read(1, 0x202) == 0x1234 mem.write(2, 0x304, 0x11223344) assert mem.read(2, 0x304) == 0x11223344 # write to cache cmem = MemoryCache(0x100, 0x210) cmem.read_cache(mem) # check cache mem assert cmem.r8(0x100) == 42 assert cmem.r16(0x200) == 0xDEAD assert cmem.r32(0x300) == 0xCAFEBABE assert cmem.read(0, 0x101) == 43 assert cmem.read(1, 0x202) == 0x1234 assert cmem.read(2, 0x304) == 0x11223344
def machine_mem_rw_test(): mem = MockMemory() mem.w8(0x100, 42) assert mem.r8(0x100) == 42 mem.w16(0x200, 0xDEAD) assert mem.r16(0x200) == 0xDEAD mem.w32(0x300, 0xCAFEBABE) assert mem.r32(0x300) == 0xCAFEBABE mem.write(0, 0x101, 43) assert mem.read(0, 0x101) == 43 mem.write(1, 0x202, 0x1234) assert mem.read(1, 0x202) == 0x1234 mem.write(2, 0x304, 0x11223344) assert mem.read(2, 0x304) == 0x11223344 # invalid values with pytest.raises(ValueError): mem.w8(0x100, 0x100) with pytest.raises(ValueError): mem.w8(0x100, -1) # invalid values with pytest.raises(struct.error): mem.w16(0x100, 0x10000) with pytest.raises(struct.error): mem.w16(0x100, -2) # invalid values with pytest.raises(struct.error): mem.w32(0x100, 0x100000000) with pytest.raises(struct.error): mem.w32(0x100, -3) # invalid type with pytest.raises(TypeError): mem.w8(0x100, "hello") # invalid type with pytest.raises(struct.error): mem.w16(0x100, "hello") # invalid type with pytest.raises(struct.error): mem.w32(0x100, "hello") # invalid width with pytest.raises(ValueError): mem.write(7, 0x202, 12) with pytest.raises(ValueError): mem.read(7, 0x202)
def machine_mem_rw_test(): mem = MockMemory() mem.w8(0x100, 42) assert mem.r8(0x100) == 42 mem.w16(0x200, 0xdead) assert mem.r16(0x200) == 0xdead mem.w32(0x300, 0xcafebabe) assert mem.r32(0x300) == 0xcafebabe mem.write(0, 0x101, 43) assert mem.read(0, 0x101) == 43 mem.write(1, 0x202, 0x1234) assert mem.read(1, 0x202) == 0x1234 mem.write(2, 0x304, 0x11223344) assert mem.read(2, 0x304) == 0x11223344 # invalid values with pytest.raises(ValueError): mem.w8(0x100, 0x100) with pytest.raises(ValueError): mem.w8(0x100, -1) # invalid values with pytest.raises(struct.error): mem.w16(0x100, 0x10000) with pytest.raises(struct.error): mem.w16(0x100, -2) # invalid values with pytest.raises(struct.error): mem.w32(0x100, 0x100000000) with pytest.raises(struct.error): mem.w32(0x100, -3) # invalid type with pytest.raises(ValueError): mem.w8(0x100, 'hello') # invalid type with pytest.raises(struct.error): mem.w16(0x100, 'hello') # invalid type with pytest.raises(struct.error): mem.w32(0x100, 'hello') # invalid width with pytest.raises(ValueError): mem.write(7, 0x202, 12) with pytest.raises(ValueError): mem.read(7, 0x202)
def atypes_library_base_test(): mem = MockMemory() alloc = MemoryAlloc(mem) # alloc lib name = "my.library" id_str = "my.library 1.2" neg_size = 36 pos_size = LibraryStruct.get_size() lib = Library.alloc(alloc, name, id_str, neg_size) assert lib.get_name() == name assert lib.get_id_string() == id_str size = lib.get_size() assert pos_size == lib.get_pos_size() assert neg_size == lib.get_neg_size() assert size == pos_size + neg_size # lib setup flags = LibFlags(LibFlags.LIBF_SUMMING, LibFlags.LIBF_CHANGED) ltype = NodeType(NodeType.NT_DEVICE) pri = -3 ver = 1 rev = 2 lib.setup(version=ver, revision=rev, pri=pri, flags=flags, type=ltype) # check lib node = lib.get_node() assert node.get_succ() is None assert node.get_pred() is None assert node.get_type() == ltype assert node.get_pri() == pri assert lib.get_flags() == flags assert lib.get_pad() == 0 assert lib.get_neg_size() == neg_size assert lib.get_pos_size() == pos_size assert lib.get_version() == ver assert lib.get_revision() == rev assert lib.get_sum() == 0 assert lib.get_open_cnt() == 0 assert lib.get_name() == name assert lib.get_id_string() == id_str # fill funcs lib.fill_funcs() lib_base = lib.get_addr() assert mem.r16(lib_base - 6) == op_rts # done lib.free() assert alloc.is_all_free()
def make_functions_ptr_test(): mem = MockMemory() # build an offset array ptr = 0 fptrs = [0x100, 0x202, 0x404, 0x808, 0x10000] for fptr in fptrs: mem.w32(ptr, fptr) ptr += 4 mem.w32s(ptr, -1) # build func table lib_base = 0x800 mf = MakeFuncs(mem) size = mf.make_functions(lib_base, 0) assert size == len(fptrs) * 6 # check jump table ptr = lib_base - 6 for fptr in fptrs: assert mem.r16(ptr) == op_jmp assert mem.r32(ptr+2) == fptr ptr -= 6
def make_functions_offset_test(): mem = MockMemory() # build an offset array ptr = 0 offsets = [-10, 2, 16, 32, 68, 100] for off in offsets: mem.w16s(ptr, off) ptr += 2 mem.w16s(ptr, -1) # build func table disp_base = 0x1000 lib_base = 0x800 mf = MakeFuncs(mem) size = mf.make_functions(lib_base, 0, disp_base) assert size == len(offsets) * 6 # check jump table ptr = lib_base - 6 for off in offsets: addr = disp_base + off assert mem.r16(ptr) == op_jmp assert mem.r32(ptr+2) == addr ptr -= 6