143 lines · python
1import gdbremote_testcase2import textwrap3from lldbsuite.test.decorators import *4from lldbsuite.test.lldbtest import *5from lldbsuite.test import lldbutil6 7 8def _extract_register_value(reg_info, reg_bank, byte_order, bytes_per_entry=8):9 reg_offset = int(reg_info["offset"]) * 210 reg_byte_size = int(2 * int(reg_info["bitsize"]) / 8)11 # Create slice with the contents of the register.12 reg_slice = reg_bank[reg_offset : reg_offset + reg_byte_size]13 14 reg_value = []15 # Wrap slice according to bytes_per_entry.16 for entry in textwrap.wrap(reg_slice, 2 * bytes_per_entry):17 # Invert the bytes order if target uses little-endian.18 if byte_order == lldb.eByteOrderLittle:19 entry = "".join(20 reversed([entry[i : i + 2] for i in range(0, len(entry), 2)])21 )22 reg_value.append("0x" + entry)23 24 return reg_value25 26 27class TestGdbRemoteGPacket(gdbremote_testcase.GdbRemoteTestCaseBase):28 @skipIf(archs=no_match(["x86_64"]))29 def g_returns_correct_data(self, with_suffix):30 procs = self.prep_debug_monitor_and_inferior()31 32 self.add_register_info_collection_packets()33 if with_suffix:34 self.add_thread_suffix_request_packets()35 self.add_threadinfo_collection_packets()36 context = self.expect_gdbremote_sequence()37 self.assertIsNotNone(context)38 39 # Gather register info.40 reg_infos = self.parse_register_info_packets(context)41 self.assertIsNotNone(reg_infos)42 self.add_lldb_register_index(reg_infos)43 # Index register info entries by name.44 reg_infos = {info["name"]: info for info in reg_infos}45 46 # Gather thread info.47 if with_suffix:48 threads = self.parse_threadinfo_packets(context)49 self.assertIsNotNone(threads)50 thread_id = threads[0]51 self.assertIsNotNone(thread_id)52 else:53 thread_id = None54 55 # Send vCont packet to resume the inferior.56 self.test_sequence.add_log_lines(57 [58 "read packet: $vCont;c#a8",59 {60 "direction": "send",61 "regex": r"^\$T([0-9a-fA-F]{2}).*#[0-9a-fA-F]{2}$",62 "capture": {1: "hex_exit_code"},63 },64 ],65 True,66 )67 68 # Send g packet to retrieve the register bank69 if thread_id:70 g_request = "read packet: $g;thread:{:x}#00".format(thread_id)71 else:72 g_request = "read packet: $g#00"73 self.test_sequence.add_log_lines(74 [75 g_request,76 {77 "direction": "send",78 "regex": r"^\$(.+)#[0-9a-fA-F]{2}$",79 "capture": {1: "register_bank"},80 },81 ],82 True,83 )84 context = self.expect_gdbremote_sequence()85 self.assertIsNotNone(context)86 reg_bank = context.get("register_bank")87 self.assertNotEqual(reg_bank[0], "E")88 89 byte_order = self.get_target_byte_order()90 get_reg_value = lambda reg_name: _extract_register_value(91 reg_infos[reg_name], reg_bank, byte_order92 )93 94 self.assertEqual(["0x0102030405060708"], get_reg_value("r8"))95 self.assertEqual(["0x1112131415161718"], get_reg_value("r9"))96 self.assertEqual(["0x2122232425262728"], get_reg_value("r10"))97 self.assertEqual(["0x3132333435363738"], get_reg_value("r11"))98 self.assertEqual(["0x4142434445464748"], get_reg_value("r12"))99 self.assertEqual(["0x5152535455565758"], get_reg_value("r13"))100 self.assertEqual(["0x6162636465666768"], get_reg_value("r14"))101 self.assertEqual(["0x7172737475767778"], get_reg_value("r15"))102 103 self.assertEqual(104 ["0x020406080a0c0e01", "0x030507090b0d0f00"], get_reg_value("xmm8")105 )106 self.assertEqual(107 ["0x121416181a1c1e11", "0x131517191b1d1f10"], get_reg_value("xmm9")108 )109 self.assertEqual(110 ["0x222426282a2c2e21", "0x232527292b2d2f20"], get_reg_value("xmm10")111 )112 self.assertEqual(113 ["0x323436383a3c3e31", "0x333537393b3d3f30"], get_reg_value("xmm11")114 )115 self.assertEqual(116 ["0x424446484a4c4e41", "0x434547494b4d4f40"], get_reg_value("xmm12")117 )118 self.assertEqual(119 ["0x525456585a5c5e51", "0x535557595b5d5f50"], get_reg_value("xmm13")120 )121 self.assertEqual(122 ["0x626466686a6c6e61", "0x636567696b6d6f60"], get_reg_value("xmm14")123 )124 self.assertEqual(125 ["0x727476787a7c7e71", "0x737577797b7d7f70"], get_reg_value("xmm15")126 )127 128 @expectedFailureAll(oslist=["freebsd"], bugnumber="llvm.org/pr48420")129 @expectedFailureNetBSD130 @skipIfDarwin # g packet not supported131 def test_g_returns_correct_data_with_suffix(self):132 self.build()133 self.set_inferior_startup_launch()134 self.g_returns_correct_data(True)135 136 @expectedFailureAll(oslist=["freebsd"], bugnumber="llvm.org/pr48420")137 @expectedFailureNetBSD138 @skipIfDarwin # g packet not supported139 def test_g_returns_correct_data_no_suffix(self):140 self.build()141 self.set_inferior_startup_launch()142 self.g_returns_correct_data(False)143