18567f4d4SMichał Górnyfrom __future__ import print_function
28567f4d4SMichał Górnyimport lldb
38567f4d4SMichał Górnyfrom lldbsuite.test.lldbtest import *
48567f4d4SMichał Górnyfrom lldbsuite.test.decorators import *
5*33c0f93fSPavel Labathfrom lldbsuite.test.gdbclientutils import *
6*33c0f93fSPavel Labathfrom lldbsuite.test.lldbgdbclient import GDBRemoteTestBase
78567f4d4SMichał Górny
88567f4d4SMichał Górny
98567f4d4SMichał Górnyclass TestGDBServerTargetXML(GDBRemoteTestBase):
10*33c0f93fSPavel Labath
118567f4d4SMichał Górny    @skipIfXmlSupportMissing
128567f4d4SMichał Górny    @skipIfRemote
138567f4d4SMichał Górny    @skipIfLLVMTargetMissing("X86")
148567f4d4SMichał Górny    def test_x86_64_regs(self):
158567f4d4SMichał Górny        """Test grabbing various x86_64 registers from gdbserver."""
168567f4d4SMichał Górny        class MyResponder(MockGDBServerResponder):
17e7418906SMichał Górny            reg_data = (
18e7418906SMichał Górny                "0102030405060708"  # rcx
19e7418906SMichał Górny                "1112131415161718"  # rdx
20e7418906SMichał Górny                "2122232425262728"  # rsi
21e7418906SMichał Górny                "3132333435363738"  # rdi
22e7418906SMichał Górny                "4142434445464748"  # rbp
23e7418906SMichał Górny                "5152535455565758"  # rsp
24e7418906SMichał Górny                "6162636465666768"  # r8
25e7418906SMichał Górny                "7172737475767778"  # r9
26e7418906SMichał Górny                "8182838485868788"  # rip
27e7418906SMichał Górny                "91929394"  # eflags
28e7418906SMichał Górny                "0102030405060708090a"  # st0
29e7418906SMichał Górny                "1112131415161718191a"  # st1
30e7418906SMichał Górny            ) + 6 * (
31e7418906SMichał Górny                "2122232425262728292a"  # st2..st7
32e7418906SMichał Górny            ) + (
33e7418906SMichał Górny                "8182838485868788898a8b8c8d8e8f90"  # xmm0
34e7418906SMichał Górny                "9192939495969798999a9b9c9d9e9fa0"  # xmm1
35e7418906SMichał Górny            ) + 14 * (
36e7418906SMichał Górny                "a1a2a3a4a5a6a7a8a9aaabacadaeafb0"  # xmm2..xmm15
37e7418906SMichał Górny            ) + (
38e7418906SMichał Górny                "00000000"  # mxcsr
39e7418906SMichał Górny            ) + (
40e7418906SMichał Górny                "b1b2b3b4b5b6b7b8b9babbbcbdbebfc0"  # ymm0h
41e7418906SMichał Górny                "c1c2c3c4c5c6c7c8c9cacbcccdcecfd0"  # ymm1h
42e7418906SMichał Górny            ) + 14 * (
43e7418906SMichał Górny                "d1d2d3d4d5d6d7d8d9dadbdcdddedfe0"  # ymm2h..ymm15h
44e7418906SMichał Górny            )
45e7418906SMichał Górny
468567f4d4SMichał Górny            def qXferRead(self, obj, annex, offset, length):
478567f4d4SMichał Górny                if annex == "target.xml":
488567f4d4SMichał Górny                    return """<?xml version="1.0"?>
498567f4d4SMichał Górny                        <!DOCTYPE feature SYSTEM "gdb-target.dtd">
508567f4d4SMichał Górny                        <target>
518567f4d4SMichał Górny                          <architecture>i386:x86-64</architecture>
528567f4d4SMichał Górny                          <osabi>GNU/Linux</osabi>
538567f4d4SMichał Górny                          <feature name="org.gnu.gdb.i386.core">
548567f4d4SMichał Górny                            <reg name="rcx" bitsize="64" type="int64" regnum="2"/>
558567f4d4SMichał Górny                            <reg name="rdx" bitsize="64" type="int64" regnum="3"/>
568567f4d4SMichał Górny                            <reg name="rsi" bitsize="64" type="int64" regnum="4"/>
578567f4d4SMichał Górny                            <reg name="rdi" bitsize="64" type="int64" regnum="5"/>
588567f4d4SMichał Górny                            <reg name="rbp" bitsize="64" type="data_ptr" regnum="6"/>
598567f4d4SMichał Górny                            <reg name="rsp" bitsize="64" type="data_ptr" regnum="7"/>
608567f4d4SMichał Górny                            <reg name="r8" bitsize="64" type="int64" regnum="8"/>
618567f4d4SMichał Górny                            <reg name="r9" bitsize="64" type="int64" regnum="9"/>
628567f4d4SMichał Górny                            <reg name="rip" bitsize="64" type="code_ptr" regnum="16"/>
638567f4d4SMichał Górny                            <reg name="eflags" bitsize="32" type="i386_eflags" regnum="17"/>
648567f4d4SMichał Górny                            <reg name="st0" bitsize="80" type="i387_ext" regnum="24"/>
658567f4d4SMichał Górny                            <reg name="st1" bitsize="80" type="i387_ext" regnum="25"/>
668567f4d4SMichał Górny                            <reg name="st2" bitsize="80" type="i387_ext" regnum="26"/>
678567f4d4SMichał Górny                            <reg name="st3" bitsize="80" type="i387_ext" regnum="27"/>
688567f4d4SMichał Górny                            <reg name="st4" bitsize="80" type="i387_ext" regnum="28"/>
698567f4d4SMichał Górny                            <reg name="st5" bitsize="80" type="i387_ext" regnum="29"/>
708567f4d4SMichał Górny                            <reg name="st6" bitsize="80" type="i387_ext" regnum="30"/>
718567f4d4SMichał Górny                            <reg name="st7" bitsize="80" type="i387_ext" regnum="31"/>
728567f4d4SMichał Górny                          </feature>
738567f4d4SMichał Górny                          <feature name="org.gnu.gdb.i386.sse">
748567f4d4SMichał Górny                            <reg name="xmm0" bitsize="128" type="vec128" regnum="40"/>
758567f4d4SMichał Górny                            <reg name="xmm1" bitsize="128" type="vec128" regnum="41"/>
768567f4d4SMichał Górny                            <reg name="xmm2" bitsize="128" type="vec128" regnum="42"/>
778567f4d4SMichał Górny                            <reg name="xmm3" bitsize="128" type="vec128" regnum="43"/>
788567f4d4SMichał Górny                            <reg name="xmm4" bitsize="128" type="vec128" regnum="44"/>
798567f4d4SMichał Górny                            <reg name="xmm5" bitsize="128" type="vec128" regnum="45"/>
808567f4d4SMichał Górny                            <reg name="xmm6" bitsize="128" type="vec128" regnum="46"/>
818567f4d4SMichał Górny                            <reg name="xmm7" bitsize="128" type="vec128" regnum="47"/>
828567f4d4SMichał Górny                            <reg name="xmm8" bitsize="128" type="vec128" regnum="48"/>
838567f4d4SMichał Górny                            <reg name="xmm9" bitsize="128" type="vec128" regnum="49"/>
848567f4d4SMichał Górny                            <reg name="xmm10" bitsize="128" type="vec128" regnum="50"/>
858567f4d4SMichał Górny                            <reg name="xmm11" bitsize="128" type="vec128" regnum="51"/>
868567f4d4SMichał Górny                            <reg name="xmm12" bitsize="128" type="vec128" regnum="52"/>
878567f4d4SMichał Górny                            <reg name="xmm13" bitsize="128" type="vec128" regnum="53"/>
888567f4d4SMichał Górny                            <reg name="xmm14" bitsize="128" type="vec128" regnum="54"/>
898567f4d4SMichał Górny                            <reg name="xmm15" bitsize="128" type="vec128" regnum="55"/>
908567f4d4SMichał Górny                            <reg name="mxcsr" bitsize="32" type="i386_mxcsr" regnum="56" group="vector"/>
918567f4d4SMichał Górny                          </feature>
928567f4d4SMichał Górny                          <feature name="org.gnu.gdb.i386.avx">
938567f4d4SMichał Górny                            <reg name="ymm0h" bitsize="128" type="uint128" regnum="60"/>
948567f4d4SMichał Górny                            <reg name="ymm1h" bitsize="128" type="uint128" regnum="61"/>
958567f4d4SMichał Górny                            <reg name="ymm2h" bitsize="128" type="uint128" regnum="62"/>
968567f4d4SMichał Górny                            <reg name="ymm3h" bitsize="128" type="uint128" regnum="63"/>
978567f4d4SMichał Górny                            <reg name="ymm4h" bitsize="128" type="uint128" regnum="64"/>
988567f4d4SMichał Górny                            <reg name="ymm5h" bitsize="128" type="uint128" regnum="65"/>
998567f4d4SMichał Górny                            <reg name="ymm6h" bitsize="128" type="uint128" regnum="66"/>
1008567f4d4SMichał Górny                            <reg name="ymm7h" bitsize="128" type="uint128" regnum="67"/>
1018567f4d4SMichał Górny                            <reg name="ymm8h" bitsize="128" type="uint128" regnum="68"/>
1028567f4d4SMichał Górny                            <reg name="ymm9h" bitsize="128" type="uint128" regnum="69"/>
1038567f4d4SMichał Górny                            <reg name="ymm10h" bitsize="128" type="uint128" regnum="70"/>
1048567f4d4SMichał Górny                            <reg name="ymm11h" bitsize="128" type="uint128" regnum="71"/>
1058567f4d4SMichał Górny                            <reg name="ymm12h" bitsize="128" type="uint128" regnum="72"/>
1068567f4d4SMichał Górny                            <reg name="ymm13h" bitsize="128" type="uint128" regnum="73"/>
1078567f4d4SMichał Górny                            <reg name="ymm14h" bitsize="128" type="uint128" regnum="74"/>
1088567f4d4SMichał Górny                            <reg name="ymm15h" bitsize="128" type="uint128" regnum="75"/>
1098567f4d4SMichał Górny                          </feature>
1108567f4d4SMichał Górny                        </target>""", False
1118567f4d4SMichał Górny                else:
1128567f4d4SMichał Górny                    return None, False
1138567f4d4SMichał Górny
1148567f4d4SMichał Górny            def readRegister(self, regnum):
1158567f4d4SMichał Górny                return ""
1168567f4d4SMichał Górny
1178567f4d4SMichał Górny            def readRegisters(self):
118e7418906SMichał Górny                return self.reg_data
1198567f4d4SMichał Górny
1208567f4d4SMichał Górny            def writeRegisters(self, reg_hex):
121e7418906SMichał Górny                self.reg_data = reg_hex
1228567f4d4SMichał Górny                return "OK"
1238567f4d4SMichał Górny
1248567f4d4SMichał Górny            def haltReason(self):
1258567f4d4SMichał Górny                return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;"
1268567f4d4SMichał Górny
1278567f4d4SMichał Górny        self.server.responder = MyResponder()
1288567f4d4SMichał Górny
1298567f4d4SMichał Górny        target = self.createTarget("basic_eh_frame.yaml")
1308567f4d4SMichał Górny        process = self.connect(target)
1318567f4d4SMichał Górny        lldbutil.expect_state_changes(self, self.dbg.GetListener(), process,
1328567f4d4SMichał Górny                                      [lldb.eStateStopped])
1338567f4d4SMichał Górny
1348567f4d4SMichał Górny        # test generic aliases
1358567f4d4SMichał Górny        self.match("register read arg4",
1368567f4d4SMichał Górny                   ["rcx = 0x0807060504030201"])
1378567f4d4SMichał Górny        self.match("register read arg3",
1388567f4d4SMichał Górny                   ["rdx = 0x1817161514131211"])
1398567f4d4SMichał Górny        self.match("register read arg2",
1408567f4d4SMichał Górny                   ["rsi = 0x2827262524232221"])
1418567f4d4SMichał Górny        self.match("register read arg1",
1428567f4d4SMichał Górny                   ["rdi = 0x3837363534333231"])
1438567f4d4SMichał Górny        self.match("register read fp",
1448567f4d4SMichał Górny                   ["rbp = 0x4847464544434241"])
1458567f4d4SMichał Górny        self.match("register read sp",
1468567f4d4SMichał Górny                   ["rsp = 0x5857565554535251"])
1478567f4d4SMichał Górny        self.match("register read arg5",
1488567f4d4SMichał Górny                   ["r8 = 0x6867666564636261"])
1498567f4d4SMichał Górny        self.match("register read arg6",
1508567f4d4SMichał Górny                   ["r9 = 0x7877767574737271"])
1518567f4d4SMichał Górny        self.match("register read pc",
1528567f4d4SMichał Górny                   ["rip = 0x8887868584838281"])
1538567f4d4SMichał Górny        self.match("register read flags",
1548567f4d4SMichał Górny                   ["eflags = 0x94939291"])
15566249323SMichał Górny
156bda5fe8fSMichał Górny        # both stX and xmmX should be displayed as vectors
157bda5fe8fSMichał Górny        self.match("register read st0",
158bda5fe8fSMichał Górny                   ["st0 = {0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a}"])
159bda5fe8fSMichał Górny        self.match("register read st1",
160bda5fe8fSMichał Górny                   ["st1 = {0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a}"])
161bda5fe8fSMichał Górny        self.match("register read xmm0",
162bda5fe8fSMichał Górny                   ["xmm0 = {0x81 0x82 0x83 0x84 0x85 0x86 0x87 0x88 "
163bda5fe8fSMichał Górny                    "0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90}"])
164bda5fe8fSMichał Górny        self.match("register read xmm1",
165bda5fe8fSMichał Górny                   ["xmm1 = {0x91 0x92 0x93 0x94 0x95 0x96 0x97 0x98 "
166bda5fe8fSMichał Górny                    "0x99 0x9a 0x9b 0x9c 0x9d 0x9e 0x9f 0xa0}"])
167bda5fe8fSMichał Górny
1682712d181SMichał Górny        # test pseudo-registers
1692712d181SMichał Górny        self.filecheck("register read --all",
1702712d181SMichał Górny                       os.path.join(os.path.dirname(__file__),
1712712d181SMichał Górny                                    "amd64-partial-regs.FileCheck"))
1722712d181SMichał Górny
1732712d181SMichał Górny        # test writing into pseudo-registers
1742712d181SMichał Górny        self.runCmd("register write ecx 0xfffefdfc")
1752712d181SMichał Górny        self.match("register read rcx",
1762712d181SMichał Górny                   ["rcx = 0x08070605fffefdfc"])
1772712d181SMichał Górny
1782712d181SMichał Górny        self.runCmd("register write cx 0xfbfa")
1792712d181SMichał Górny        self.match("register read ecx",
1802712d181SMichał Górny                   ["ecx = 0xfffefbfa"])
1812712d181SMichał Górny        self.match("register read rcx",
1822712d181SMichał Górny                   ["rcx = 0x08070605fffefbfa"])
1832712d181SMichał Górny
1842712d181SMichał Górny        self.runCmd("register write ch 0xf9")
1852712d181SMichał Górny        self.match("register read cx",
1862712d181SMichał Górny                   ["cx = 0xf9fa"])
1872712d181SMichał Górny        self.match("register read ecx",
1882712d181SMichał Górny                   ["ecx = 0xfffef9fa"])
1892712d181SMichał Górny        self.match("register read rcx",
1902712d181SMichał Górny                   ["rcx = 0x08070605fffef9fa"])
1912712d181SMichał Górny
1922712d181SMichał Górny        self.runCmd("register write cl 0xf8")
1932712d181SMichał Górny        self.match("register read cx",
1942712d181SMichał Górny                   ["cx = 0xf9f8"])
1952712d181SMichał Górny        self.match("register read ecx",
1962712d181SMichał Górny                   ["ecx = 0xfffef9f8"])
1972712d181SMichał Górny        self.match("register read rcx",
1982712d181SMichał Górny                   ["rcx = 0x08070605fffef9f8"])
1992712d181SMichał Górny
2002712d181SMichał Górny        self.runCmd("register write mm0 0xfffefdfcfbfaf9f8")
2012712d181SMichał Górny        self.match("register read st0",
2022712d181SMichał Górny                   ["st0 = {0xf8 0xf9 0xfa 0xfb 0xfc 0xfd 0xfe 0xff 0x09 0x0a}"])
2032712d181SMichał Górny
204f290efc3SMichał Górny        self.runCmd("register write xmm0 \"{0xff 0xfe 0xfd 0xfc 0xfb 0xfa 0xf9 "
205f290efc3SMichał Górny                    "0xf8 0xf7 0xf6 0xf5 0xf4 0xf3 0xf2 0xf1 0xf0}\"")
206f290efc3SMichał Górny        self.match("register read ymm0",
207f290efc3SMichał Górny                   ["ymm0 = {0xff 0xfe 0xfd 0xfc 0xfb 0xfa 0xf9 0xf8 0xf7 0xf6 "
208f290efc3SMichał Górny                    "0xf5 0xf4 0xf3 0xf2 0xf1 0xf0 0xb1 0xb2 0xb3 0xb4 0xb5 "
209f290efc3SMichał Górny                    "0xb6 0xb7 0xb8 0xb9 0xba 0xbb 0xbc 0xbd 0xbe 0xbf 0xc0}"])
210f290efc3SMichał Górny
211f290efc3SMichał Górny        self.runCmd("register write ymm0h \"{0xef 0xee 0xed 0xec 0xeb 0xea 0xe9 "
212f290efc3SMichał Górny                    "0xe8 0xe7 0xe6 0xe5 0xe4 0xe3 0xe2 0xe1 0xe0}\"")
213f290efc3SMichał Górny        self.match("register read ymm0",
214f290efc3SMichał Górny                   ["ymm0 = {0xff 0xfe 0xfd 0xfc 0xfb 0xfa 0xf9 0xf8 0xf7 0xf6 "
215f290efc3SMichał Górny                    "0xf5 0xf4 0xf3 0xf2 0xf1 0xf0 0xef 0xee 0xed 0xec 0xeb "
216f290efc3SMichał Górny                    "0xea 0xe9 0xe8 0xe7 0xe6 0xe5 0xe4 0xe3 0xe2 0xe1 0xe0}"])
217f290efc3SMichał Górny
218f290efc3SMichał Górny        self.runCmd("register write ymm0 \"{0xd0 0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 "
219f290efc3SMichał Górny                    "0xd7 0xd8 0xd9 0xda 0xdb 0xdc 0xdd 0xde 0xdf 0xe0 0xe1 "
220f290efc3SMichał Górny                    "0xe2 0xe3 0xe4 0xe5 0xe6 0xe7 0xe8 0xe9 0xea 0xeb 0xec "
221f290efc3SMichał Górny                    "0xed 0xee 0xef}\"")
222f290efc3SMichał Górny        self.match("register read ymm0",
223f290efc3SMichał Górny                   ["ymm0 = {0xd0 0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 0xd7 0xd8 0xd9 "
224f290efc3SMichał Górny                    "0xda 0xdb 0xdc 0xdd 0xde 0xdf 0xe0 0xe1 0xe2 0xe3 0xe4 "
225f290efc3SMichał Górny                    "0xe5 0xe6 0xe7 0xe8 0xe9 0xea 0xeb 0xec 0xed 0xee 0xef}"])
226f290efc3SMichał Górny
22766249323SMichał Górny    @skipIfXmlSupportMissing
22866249323SMichał Górny    @skipIfRemote
22966249323SMichał Górny    @skipIfLLVMTargetMissing("X86")
23066249323SMichał Górny    def test_i386_regs(self):
23166249323SMichał Górny        """Test grabbing various i386 registers from gdbserver."""
23266249323SMichał Górny        class MyResponder(MockGDBServerResponder):
233e7418906SMichał Górny            reg_data = (
234e7418906SMichał Górny                "01020304"  # eax
235e7418906SMichał Górny                "11121314"  # ecx
236e7418906SMichał Górny                "21222324"  # edx
237e7418906SMichał Górny                "31323334"  # ebx
238e7418906SMichał Górny                "41424344"  # esp
239e7418906SMichał Górny                "51525354"  # ebp
240e7418906SMichał Górny                "61626364"  # esi
241e7418906SMichał Górny                "71727374"  # edi
242e7418906SMichał Górny                "81828384"  # eip
243e7418906SMichał Górny                "91929394"  # eflags
244e7418906SMichał Górny                "0102030405060708090a"  # st0
245e7418906SMichał Górny                "1112131415161718191a"  # st1
246e7418906SMichał Górny            ) + 6 * (
247e7418906SMichał Górny                "2122232425262728292a"  # st2..st7
248e7418906SMichał Górny            ) + (
249e7418906SMichał Górny                "8182838485868788898a8b8c8d8e8f90"  # xmm0
250e7418906SMichał Górny                "9192939495969798999a9b9c9d9e9fa0"  # xmm1
251e7418906SMichał Górny            ) + 6 * (
252e7418906SMichał Górny                "a1a2a3a4a5a6a7a8a9aaabacadaeafb0"  # xmm2..xmm7
253e7418906SMichał Górny            ) + (
254e7418906SMichał Górny                "00000000"  # mxcsr
255e7418906SMichał Górny            ) + (
256e7418906SMichał Górny                "b1b2b3b4b5b6b7b8b9babbbcbdbebfc0"  # ymm0h
257e7418906SMichał Górny                "c1c2c3c4c5c6c7c8c9cacbcccdcecfd0"  # ymm1h
258e7418906SMichał Górny            ) + 6 * (
259e7418906SMichał Górny                "d1d2d3d4d5d6d7d8d9dadbdcdddedfe0"  # ymm2h..ymm7h
260e7418906SMichał Górny            )
261e7418906SMichał Górny
26266249323SMichał Górny            def qXferRead(self, obj, annex, offset, length):
26366249323SMichał Górny                if annex == "target.xml":
26466249323SMichał Górny                    return """<?xml version="1.0"?>
26566249323SMichał Górny                        <!DOCTYPE feature SYSTEM "gdb-target.dtd">
26666249323SMichał Górny                        <target>
26766249323SMichał Górny                          <architecture>i386</architecture>
26866249323SMichał Górny                          <osabi>GNU/Linux</osabi>
26966249323SMichał Górny                          <feature name="org.gnu.gdb.i386.core">
27066249323SMichał Górny                            <reg name="eax" bitsize="32" type="int32" regnum="0"/>
27166249323SMichał Górny                            <reg name="ecx" bitsize="32" type="int32" regnum="1"/>
27266249323SMichał Górny                            <reg name="edx" bitsize="32" type="int32" regnum="2"/>
27366249323SMichał Górny                            <reg name="ebx" bitsize="32" type="int32" regnum="3"/>
27466249323SMichał Górny                            <reg name="esp" bitsize="32" type="data_ptr" regnum="4"/>
27566249323SMichał Górny                            <reg name="ebp" bitsize="32" type="data_ptr" regnum="5"/>
27666249323SMichał Górny                            <reg name="esi" bitsize="32" type="int32" regnum="6"/>
27766249323SMichał Górny                            <reg name="edi" bitsize="32" type="int32" regnum="7"/>
27866249323SMichał Górny                            <reg name="eip" bitsize="32" type="code_ptr" regnum="8"/>
27966249323SMichał Górny                            <reg name="eflags" bitsize="32" type="i386_eflags" regnum="9"/>
28066249323SMichał Górny                            <reg name="st0" bitsize="80" type="i387_ext" regnum="16"/>
28166249323SMichał Górny                            <reg name="st1" bitsize="80" type="i387_ext" regnum="17"/>
28266249323SMichał Górny                            <reg name="st2" bitsize="80" type="i387_ext" regnum="18"/>
28366249323SMichał Górny                            <reg name="st3" bitsize="80" type="i387_ext" regnum="19"/>
28466249323SMichał Górny                            <reg name="st4" bitsize="80" type="i387_ext" regnum="20"/>
28566249323SMichał Górny                            <reg name="st5" bitsize="80" type="i387_ext" regnum="21"/>
28666249323SMichał Górny                            <reg name="st6" bitsize="80" type="i387_ext" regnum="22"/>
28766249323SMichał Górny                            <reg name="st7" bitsize="80" type="i387_ext" regnum="23"/>
28866249323SMichał Górny                          </feature>
28966249323SMichał Górny                          <feature name="org.gnu.gdb.i386.sse">
29066249323SMichał Górny                            <reg name="xmm0" bitsize="128" type="vec128" regnum="32"/>
29166249323SMichał Górny                            <reg name="xmm1" bitsize="128" type="vec128" regnum="33"/>
29266249323SMichał Górny                            <reg name="xmm2" bitsize="128" type="vec128" regnum="34"/>
29366249323SMichał Górny                            <reg name="xmm3" bitsize="128" type="vec128" regnum="35"/>
29466249323SMichał Górny                            <reg name="xmm4" bitsize="128" type="vec128" regnum="36"/>
29566249323SMichał Górny                            <reg name="xmm5" bitsize="128" type="vec128" regnum="37"/>
29666249323SMichał Górny                            <reg name="xmm6" bitsize="128" type="vec128" regnum="38"/>
29766249323SMichał Górny                            <reg name="xmm7" bitsize="128" type="vec128" regnum="39"/>
29866249323SMichał Górny                            <reg name="mxcsr" bitsize="32" type="i386_mxcsr" regnum="40" group="vector"/>
29966249323SMichał Górny                          </feature>
30066249323SMichał Górny                          <feature name="org.gnu.gdb.i386.avx">
30166249323SMichał Górny                            <reg name="ymm0h" bitsize="128" type="uint128" regnum="42"/>
30266249323SMichał Górny                            <reg name="ymm1h" bitsize="128" type="uint128" regnum="43"/>
30366249323SMichał Górny                            <reg name="ymm2h" bitsize="128" type="uint128" regnum="44"/>
30466249323SMichał Górny                            <reg name="ymm3h" bitsize="128" type="uint128" regnum="45"/>
30566249323SMichał Górny                            <reg name="ymm4h" bitsize="128" type="uint128" regnum="46"/>
30666249323SMichał Górny                            <reg name="ymm5h" bitsize="128" type="uint128" regnum="47"/>
30766249323SMichał Górny                            <reg name="ymm6h" bitsize="128" type="uint128" regnum="48"/>
30866249323SMichał Górny                            <reg name="ymm7h" bitsize="128" type="uint128" regnum="49"/>
30966249323SMichał Górny                          </feature>
31066249323SMichał Górny                        </target>""", False
31166249323SMichał Górny                else:
31266249323SMichał Górny                    return None, False
31366249323SMichał Górny
31466249323SMichał Górny            def readRegister(self, regnum):
31566249323SMichał Górny                return ""
31666249323SMichał Górny
31766249323SMichał Górny            def readRegisters(self):
318e7418906SMichał Górny                return self.reg_data
31966249323SMichał Górny
32066249323SMichał Górny            def writeRegisters(self, reg_hex):
321e7418906SMichał Górny                self.reg_data = reg_hex
32266249323SMichał Górny                return "OK"
32366249323SMichał Górny
32466249323SMichał Górny            def haltReason(self):
32566249323SMichał Górny                return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;"
32666249323SMichał Górny
32766249323SMichał Górny        self.server.responder = MyResponder()
32866249323SMichał Górny
32966249323SMichał Górny        target = self.createTarget("basic_eh_frame-i386.yaml")
33066249323SMichał Górny        process = self.connect(target)
33166249323SMichał Górny        lldbutil.expect_state_changes(self, self.dbg.GetListener(), process,
33266249323SMichał Górny                                      [lldb.eStateStopped])
33366249323SMichał Górny
33466249323SMichał Górny        # test generic aliases
33566249323SMichał Górny        self.match("register read fp",
33666249323SMichał Górny                   ["ebp = 0x54535251"])
3372712d181SMichał Górny        self.match("register read sp",
3382712d181SMichał Górny                   ["esp = 0x44434241"])
33966249323SMichał Górny        self.match("register read pc",
34066249323SMichał Górny                   ["eip = 0x84838281"])
34166249323SMichał Górny        self.match("register read flags",
34266249323SMichał Górny                   ["eflags = 0x94939291"])
34366249323SMichał Górny
3442712d181SMichał Górny        # test pseudo-registers
3452712d181SMichał Górny        self.match("register read cx",
3462712d181SMichał Górny                   ["cx = 0x1211"])
3472712d181SMichał Górny        self.match("register read ch",
3482712d181SMichał Górny                   ["ch = 0x12"])
3492712d181SMichał Górny        self.match("register read cl",
3502712d181SMichał Górny                   ["cl = 0x11"])
3512712d181SMichał Górny        self.match("register read mm0",
3522712d181SMichał Górny                   ["mm0 = 0x0807060504030201"])
3532712d181SMichał Górny        self.match("register read mm1",
3542712d181SMichał Górny                   ["mm1 = 0x1817161514131211"])
3552712d181SMichał Górny
356bda5fe8fSMichał Górny        # both stX and xmmX should be displayed as vectors
357bda5fe8fSMichał Górny        self.match("register read st0",
358bda5fe8fSMichał Górny                   ["st0 = {0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a}"])
359bda5fe8fSMichał Górny        self.match("register read st1",
360bda5fe8fSMichał Górny                   ["st1 = {0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a}"])
361bda5fe8fSMichał Górny        self.match("register read xmm0",
362bda5fe8fSMichał Górny                   ["xmm0 = {0x81 0x82 0x83 0x84 0x85 0x86 0x87 0x88 "
363bda5fe8fSMichał Górny                    "0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90}"])
364bda5fe8fSMichał Górny        self.match("register read xmm1",
365bda5fe8fSMichał Górny                   ["xmm1 = {0x91 0x92 0x93 0x94 0x95 0x96 0x97 0x98 "
366bda5fe8fSMichał Górny                    "0x99 0x9a 0x9b 0x9c 0x9d 0x9e 0x9f 0xa0}"])
367bda5fe8fSMichał Górny
3682712d181SMichał Górny        # test writing into pseudo-registers
3692712d181SMichał Górny        self.runCmd("register write cx 0xfbfa")
3702712d181SMichał Górny        self.match("register read ecx",
3712712d181SMichał Górny                   ["ecx = 0x1413fbfa"])
3722712d181SMichał Górny
3732712d181SMichał Górny        self.runCmd("register write ch 0xf9")
3742712d181SMichał Górny        self.match("register read cx",
3752712d181SMichał Górny                   ["cx = 0xf9fa"])
3762712d181SMichał Górny        self.match("register read ecx",
3772712d181SMichał Górny                   ["ecx = 0x1413f9fa"])
3782712d181SMichał Górny
3792712d181SMichał Górny        self.runCmd("register write cl 0xf8")
3802712d181SMichał Górny        self.match("register read cx",
3812712d181SMichał Górny                   ["cx = 0xf9f8"])
3822712d181SMichał Górny        self.match("register read ecx",
3832712d181SMichał Górny                   ["ecx = 0x1413f9f8"])
3842712d181SMichał Górny
3852712d181SMichał Górny        self.runCmd("register write mm0 0xfffefdfcfbfaf9f8")
3862712d181SMichał Górny        self.match("register read st0",
3872712d181SMichał Górny                   ["st0 = {0xf8 0xf9 0xfa 0xfb 0xfc 0xfd 0xfe 0xff 0x09 0x0a}"])
3882712d181SMichał Górny
389f290efc3SMichał Górny        self.runCmd("register write xmm0 \"{0xff 0xfe 0xfd 0xfc 0xfb 0xfa 0xf9 "
390f290efc3SMichał Górny                    "0xf8 0xf7 0xf6 0xf5 0xf4 0xf3 0xf2 0xf1 0xf0}\"")
391f290efc3SMichał Górny        self.match("register read ymm0",
392f290efc3SMichał Górny                   ["ymm0 = {0xff 0xfe 0xfd 0xfc 0xfb 0xfa 0xf9 0xf8 0xf7 0xf6 "
393f290efc3SMichał Górny                    "0xf5 0xf4 0xf3 0xf2 0xf1 0xf0 0xb1 0xb2 0xb3 0xb4 0xb5 "
394f290efc3SMichał Górny                    "0xb6 0xb7 0xb8 0xb9 0xba 0xbb 0xbc 0xbd 0xbe 0xbf 0xc0}"])
395f290efc3SMichał Górny
396f290efc3SMichał Górny        self.runCmd("register write ymm0h \"{0xef 0xee 0xed 0xec 0xeb 0xea 0xe9 "
397f290efc3SMichał Górny                    "0xe8 0xe7 0xe6 0xe5 0xe4 0xe3 0xe2 0xe1 0xe0}\"")
398f290efc3SMichał Górny        self.match("register read ymm0",
399f290efc3SMichał Górny                   ["ymm0 = {0xff 0xfe 0xfd 0xfc 0xfb 0xfa 0xf9 0xf8 0xf7 0xf6 "
400f290efc3SMichał Górny                    "0xf5 0xf4 0xf3 0xf2 0xf1 0xf0 0xef 0xee 0xed 0xec 0xeb "
401f290efc3SMichał Górny                    "0xea 0xe9 0xe8 0xe7 0xe6 0xe5 0xe4 0xe3 0xe2 0xe1 0xe0}"])
402f290efc3SMichał Górny
403f290efc3SMichał Górny        self.runCmd("register write ymm0 \"{0xd0 0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 "
404f290efc3SMichał Górny                    "0xd7 0xd8 0xd9 0xda 0xdb 0xdc 0xdd 0xde 0xdf 0xe0 0xe1 "
405f290efc3SMichał Górny                    "0xe2 0xe3 0xe4 0xe5 0xe6 0xe7 0xe8 0xe9 0xea 0xeb 0xec "
406f290efc3SMichał Górny                    "0xed 0xee 0xef}\"")
407f290efc3SMichał Górny        self.match("register read ymm0",
408f290efc3SMichał Górny                   ["ymm0 = {0xd0 0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 0xd7 0xd8 0xd9 "
409f290efc3SMichał Górny                    "0xda 0xdb 0xdc 0xdd 0xde 0xdf 0xe0 0xe1 0xe2 0xe3 0xe4 "
410f290efc3SMichał Górny                    "0xe5 0xe6 0xe7 0xe8 0xe9 0xea 0xeb 0xec 0xed 0xee 0xef}"])
411f290efc3SMichał Górny
41266249323SMichał Górny    @skipIfXmlSupportMissing
41366249323SMichał Górny    @skipIfRemote
41466249323SMichał Górny    @skipIfLLVMTargetMissing("AArch64")
41566249323SMichał Górny    def test_aarch64_regs(self):
41666249323SMichał Górny        """Test grabbing various aarch64 registers from gdbserver."""
41766249323SMichał Górny        class MyResponder(MockGDBServerResponder):
418583f67cbSMichał Górny            reg_data = (
419583f67cbSMichał Górny                "0102030405060708"  # x0
420583f67cbSMichał Górny                "1112131415161718"  # x1
421583f67cbSMichał Górny            ) + 27 * (
422583f67cbSMichał Górny                "2122232425262728"  # x2..x28
423583f67cbSMichał Górny            ) + (
424583f67cbSMichał Górny                "3132333435363738"  # x29 (fp)
425583f67cbSMichał Górny                "4142434445464748"  # x30 (lr)
426583f67cbSMichał Górny                "5152535455565758"  # x31 (sp)
427583f67cbSMichał Górny                "6162636465666768"  # pc
428583f67cbSMichał Górny                "71727374"  # cpsr
429583f67cbSMichał Górny                "8182838485868788898a8b8c8d8e8f90"  # v0
430583f67cbSMichał Górny                "9192939495969798999a9b9c9d9e9fa0"  # v1
431583f67cbSMichał Górny            ) + 30 * (
432583f67cbSMichał Górny                "a1a2a3a4a5a6a7a8a9aaabacadaeafb0"  # v2..v31
433583f67cbSMichał Górny            ) + (
434583f67cbSMichał Górny                "00000000"  # fpsr
435583f67cbSMichał Górny                "00000000"  # fpcr
436583f67cbSMichał Górny            )
437583f67cbSMichał Górny
43866249323SMichał Górny            def qXferRead(self, obj, annex, offset, length):
43966249323SMichał Górny                if annex == "target.xml":
44066249323SMichał Górny                    return """<?xml version="1.0"?>
44166249323SMichał Górny                        <!DOCTYPE feature SYSTEM "gdb-target.dtd">
44266249323SMichał Górny                        <target>
44366249323SMichał Górny                          <architecture>aarch64</architecture>
44466249323SMichał Górny                          <feature name="org.gnu.gdb.aarch64.core">
44566249323SMichał Górny                            <reg name="x0" bitsize="64" type="int" regnum="0"/>
44666249323SMichał Górny                            <reg name="x1" bitsize="64" type="int" regnum="1"/>
44766249323SMichał Górny                            <reg name="x2" bitsize="64" type="int" regnum="2"/>
44866249323SMichał Górny                            <reg name="x3" bitsize="64" type="int" regnum="3"/>
44966249323SMichał Górny                            <reg name="x4" bitsize="64" type="int" regnum="4"/>
45066249323SMichał Górny                            <reg name="x5" bitsize="64" type="int" regnum="5"/>
45166249323SMichał Górny                            <reg name="x6" bitsize="64" type="int" regnum="6"/>
45266249323SMichał Górny                            <reg name="x7" bitsize="64" type="int" regnum="7"/>
45366249323SMichał Górny                            <reg name="x8" bitsize="64" type="int" regnum="8"/>
45466249323SMichał Górny                            <reg name="x9" bitsize="64" type="int" regnum="9"/>
45566249323SMichał Górny                            <reg name="x10" bitsize="64" type="int" regnum="10"/>
45666249323SMichał Górny                            <reg name="x11" bitsize="64" type="int" regnum="11"/>
45766249323SMichał Górny                            <reg name="x12" bitsize="64" type="int" regnum="12"/>
45866249323SMichał Górny                            <reg name="x13" bitsize="64" type="int" regnum="13"/>
45966249323SMichał Górny                            <reg name="x14" bitsize="64" type="int" regnum="14"/>
46066249323SMichał Górny                            <reg name="x15" bitsize="64" type="int" regnum="15"/>
46166249323SMichał Górny                            <reg name="x16" bitsize="64" type="int" regnum="16"/>
46266249323SMichał Górny                            <reg name="x17" bitsize="64" type="int" regnum="17"/>
46366249323SMichał Górny                            <reg name="x18" bitsize="64" type="int" regnum="18"/>
46466249323SMichał Górny                            <reg name="x19" bitsize="64" type="int" regnum="19"/>
46566249323SMichał Górny                            <reg name="x20" bitsize="64" type="int" regnum="20"/>
46666249323SMichał Górny                            <reg name="x21" bitsize="64" type="int" regnum="21"/>
46766249323SMichał Górny                            <reg name="x22" bitsize="64" type="int" regnum="22"/>
46866249323SMichał Górny                            <reg name="x23" bitsize="64" type="int" regnum="23"/>
46966249323SMichał Górny                            <reg name="x24" bitsize="64" type="int" regnum="24"/>
47066249323SMichał Górny                            <reg name="x25" bitsize="64" type="int" regnum="25"/>
47166249323SMichał Górny                            <reg name="x26" bitsize="64" type="int" regnum="26"/>
47266249323SMichał Górny                            <reg name="x27" bitsize="64" type="int" regnum="27"/>
47366249323SMichał Górny                            <reg name="x28" bitsize="64" type="int" regnum="28"/>
47466249323SMichał Górny                            <reg name="x29" bitsize="64" type="int" regnum="29"/>
47566249323SMichał Górny                            <reg name="x30" bitsize="64" type="int" regnum="30"/>
47666249323SMichał Górny                            <reg name="sp" bitsize="64" type="data_ptr" regnum="31"/>
47766249323SMichał Górny                            <reg name="pc" bitsize="64" type="code_ptr" regnum="32"/>
47866249323SMichał Górny                            <reg name="cpsr" bitsize="32" type="cpsr_flags" regnum="33"/>
47966249323SMichał Górny                          </feature>
48066249323SMichał Górny                          <feature name="org.gnu.gdb.aarch64.fpu">
48166249323SMichał Górny                            <reg name="v0" bitsize="128" type="aarch64v" regnum="34"/>
48266249323SMichał Górny                            <reg name="v1" bitsize="128" type="aarch64v" regnum="35"/>
48366249323SMichał Górny                            <reg name="v2" bitsize="128" type="aarch64v" regnum="36"/>
48466249323SMichał Górny                            <reg name="v3" bitsize="128" type="aarch64v" regnum="37"/>
48566249323SMichał Górny                            <reg name="v4" bitsize="128" type="aarch64v" regnum="38"/>
48666249323SMichał Górny                            <reg name="v5" bitsize="128" type="aarch64v" regnum="39"/>
48766249323SMichał Górny                            <reg name="v6" bitsize="128" type="aarch64v" regnum="40"/>
48866249323SMichał Górny                            <reg name="v7" bitsize="128" type="aarch64v" regnum="41"/>
48966249323SMichał Górny                            <reg name="v8" bitsize="128" type="aarch64v" regnum="42"/>
49066249323SMichał Górny                            <reg name="v9" bitsize="128" type="aarch64v" regnum="43"/>
49166249323SMichał Górny                            <reg name="v10" bitsize="128" type="aarch64v" regnum="44"/>
49266249323SMichał Górny                            <reg name="v11" bitsize="128" type="aarch64v" regnum="45"/>
49366249323SMichał Górny                            <reg name="v12" bitsize="128" type="aarch64v" regnum="46"/>
49466249323SMichał Górny                            <reg name="v13" bitsize="128" type="aarch64v" regnum="47"/>
49566249323SMichał Górny                            <reg name="v14" bitsize="128" type="aarch64v" regnum="48"/>
49666249323SMichał Górny                            <reg name="v15" bitsize="128" type="aarch64v" regnum="49"/>
49766249323SMichał Górny                            <reg name="v16" bitsize="128" type="aarch64v" regnum="50"/>
49866249323SMichał Górny                            <reg name="v17" bitsize="128" type="aarch64v" regnum="51"/>
49966249323SMichał Górny                            <reg name="v18" bitsize="128" type="aarch64v" regnum="52"/>
50066249323SMichał Górny                            <reg name="v19" bitsize="128" type="aarch64v" regnum="53"/>
50166249323SMichał Górny                            <reg name="v20" bitsize="128" type="aarch64v" regnum="54"/>
50266249323SMichał Górny                            <reg name="v21" bitsize="128" type="aarch64v" regnum="55"/>
50366249323SMichał Górny                            <reg name="v22" bitsize="128" type="aarch64v" regnum="56"/>
50466249323SMichał Górny                            <reg name="v23" bitsize="128" type="aarch64v" regnum="57"/>
50566249323SMichał Górny                            <reg name="v24" bitsize="128" type="aarch64v" regnum="58"/>
50666249323SMichał Górny                            <reg name="v25" bitsize="128" type="aarch64v" regnum="59"/>
50766249323SMichał Górny                            <reg name="v26" bitsize="128" type="aarch64v" regnum="60"/>
50866249323SMichał Górny                            <reg name="v27" bitsize="128" type="aarch64v" regnum="61"/>
50966249323SMichał Górny                            <reg name="v28" bitsize="128" type="aarch64v" regnum="62"/>
51066249323SMichał Górny                            <reg name="v29" bitsize="128" type="aarch64v" regnum="63"/>
51166249323SMichał Górny                            <reg name="v30" bitsize="128" type="aarch64v" regnum="64"/>
51266249323SMichał Górny                            <reg name="v31" bitsize="128" type="aarch64v" regnum="65"/>
51366249323SMichał Górny                            <reg name="fpsr" bitsize="32" type="int" regnum="66"/>
51466249323SMichał Górny                            <reg name="fpcr" bitsize="32" type="int" regnum="67"/>
51566249323SMichał Górny                          </feature>
51666249323SMichał Górny                        </target>""", False
51766249323SMichał Górny                else:
51866249323SMichał Górny                    return None, False
51966249323SMichał Górny
52066249323SMichał Górny            def readRegister(self, regnum):
52166249323SMichał Górny                return ""
52266249323SMichał Górny
52366249323SMichał Górny            def readRegisters(self):
524583f67cbSMichał Górny                return self.reg_data
52566249323SMichał Górny
52666249323SMichał Górny            def writeRegisters(self, reg_hex):
527583f67cbSMichał Górny                self.reg_data = reg_hex
52866249323SMichał Górny                return "OK"
52966249323SMichał Górny
53066249323SMichał Górny            def haltReason(self):
53166249323SMichał Górny                return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;"
53266249323SMichał Górny
53366249323SMichał Górny        self.server.responder = MyResponder()
53466249323SMichał Górny
53566249323SMichał Górny        target = self.createTarget("basic_eh_frame-aarch64.yaml")
53666249323SMichał Górny        process = self.connect(target)
53766249323SMichał Górny        lldbutil.expect_state_changes(self, self.dbg.GetListener(), process,
53866249323SMichał Górny                                      [lldb.eStateStopped])
53966249323SMichał Górny
54066249323SMichał Górny        # test GPRs
54166249323SMichał Górny        self.match("register read x0",
54266249323SMichał Górny                   ["x0 = 0x0807060504030201"])
54366249323SMichał Górny        self.match("register read x1",
54466249323SMichał Górny                   ["x1 = 0x1817161514131211"])
54547d57547SMichał Górny        self.match("register read x29",
54647d57547SMichał Górny                   ["x29 = 0x3837363534333231"])
54747d57547SMichał Górny        self.match("register read x30",
54847d57547SMichał Górny                   ["x30 = 0x4847464544434241"])
54947d57547SMichał Górny        self.match("register read x31",
55047d57547SMichał Górny                   ["sp = 0x5857565554535251"])
55166249323SMichał Górny        self.match("register read sp",
55266249323SMichał Górny                   ["sp = 0x5857565554535251"])
55366249323SMichał Górny        self.match("register read pc",
55466249323SMichał Górny                   ["pc = 0x6867666564636261"])
55566249323SMichał Górny        self.match("register read cpsr",
55666249323SMichał Górny                   ["cpsr = 0x74737271"])
55766249323SMichał Górny
55866249323SMichał Górny        # test generic aliases
55966249323SMichał Górny        self.match("register read arg1",
56066249323SMichał Górny                   ["x0 = 0x0807060504030201"])
56166249323SMichał Górny        self.match("register read arg2",
56266249323SMichał Górny                   ["x1 = 0x1817161514131211"])
563c208deb9SMichał Górny        self.match("register read fp",
564c208deb9SMichał Górny                   ["x29 = 0x3837363534333231"])
565c208deb9SMichał Górny        self.match("register read lr",
566c208deb9SMichał Górny                   ["x30 = 0x4847464544434241"])
567c208deb9SMichał Górny        self.match("register read ra",
568c208deb9SMichał Górny                   ["x30 = 0x4847464544434241"])
56966249323SMichał Górny        self.match("register read flags",
57066249323SMichał Górny                   ["cpsr = 0x74737271"])
571f6e0edc2SMichał Górny
572f6e0edc2SMichał Górny        # test vector registers
573f6e0edc2SMichał Górny        self.match("register read v0",
574f6e0edc2SMichał Górny                   ["v0 = {0x81 0x82 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90}"])
575f6e0edc2SMichał Górny        self.match("register read v31",
576f6e0edc2SMichał Górny                   ["v31 = {0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 0xa8 0xa9 0xaa 0xab 0xac 0xad 0xae 0xaf 0xb0}"])
577583f67cbSMichał Górny
578583f67cbSMichał Górny        # test partial registers
579583f67cbSMichał Górny        self.match("register read w0",
580583f67cbSMichał Górny                   ["w0 = 0x04030201"])
581583f67cbSMichał Górny        self.runCmd("register write w0 0xfffefdfc")
582583f67cbSMichał Górny        self.match("register read x0",
583583f67cbSMichał Górny                   ["x0 = 0x08070605fffefdfc"])
584583f67cbSMichał Górny
585583f67cbSMichał Górny        self.match("register read w1",
586583f67cbSMichał Górny                   ["w1 = 0x14131211"])
587583f67cbSMichał Górny        self.runCmd("register write w1 0xefeeedec")
588583f67cbSMichał Górny        self.match("register read x1",
589583f67cbSMichał Górny                   ["x1 = 0x18171615efeeedec"])
590583f67cbSMichał Górny
591583f67cbSMichał Górny        self.match("register read w30",
592583f67cbSMichał Górny                   ["w30 = 0x44434241"])
593583f67cbSMichał Górny        self.runCmd("register write w30 0xdfdedddc")
594583f67cbSMichał Górny        self.match("register read x30",
595583f67cbSMichał Górny                   ["x30 = 0x48474645dfdedddc"])
596583f67cbSMichał Górny
597583f67cbSMichał Górny        self.match("register read w31",
598583f67cbSMichał Górny                   ["w31 = 0x54535251"])
599583f67cbSMichał Górny        self.runCmd("register write w31 0xcfcecdcc")
600583f67cbSMichał Górny        self.match("register read x31",
601583f67cbSMichał Górny                   ["sp = 0x58575655cfcecdcc"])
602583f67cbSMichał Górny
603583f67cbSMichał Górny        # test FPU registers (overlapping with vector registers)
604583f67cbSMichał Górny        self.runCmd("register write d0 16")
605583f67cbSMichał Górny        self.match("register read v0",
606583f67cbSMichał Górny                   ["v0 = {0x00 0x00 0x00 0x00 0x00 0x00 0x30 0x40 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90}"])
607583f67cbSMichał Górny        self.runCmd("register write v31 '{0x00 0x00 0x00 0x00 0x00 0x00 0x50 0x40 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff}'")
608583f67cbSMichał Górny        self.match("register read d31",
609583f67cbSMichał Górny                   ["d31 = 64"])
610583f67cbSMichał Górny
611583f67cbSMichał Górny        self.runCmd("register write s0 32")
612583f67cbSMichał Górny        self.match("register read v0",
613583f67cbSMichał Górny                   ["v0 = {0x00 0x00 0x00 0x42 0x00 0x00 0x30 0x40 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90}"])
614583f67cbSMichał Górny        self.runCmd("register write v31 '{0x00 0x00 0x00 0x43 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff}'")
615583f67cbSMichał Górny        self.match("register read s31",
616583f67cbSMichał Górny                   ["s31 = 128"])
617f70f9620SMichał Górny
618f70f9620SMichał Górny    @skipIfXmlSupportMissing
619f70f9620SMichał Górny    @skipIfRemote
6201583c41dSMichał Górny    @skipIfLLVMTargetMissing("X86")
6211583c41dSMichał Górny    def test_x86_64_no_duplicate_subregs(self):
6221583c41dSMichał Górny        """Test that duplicate subregisters are not added (on x86_64)."""
6231583c41dSMichał Górny        class MyResponder(MockGDBServerResponder):
6241583c41dSMichał Górny            reg_data = (
6251583c41dSMichał Górny                "0102030405060708"  # rcx
6261583c41dSMichał Górny                "1112131415161718"  # rdx
6271583c41dSMichał Górny                "2122232425262728"  # rsi
6281583c41dSMichał Górny                "3132333435363738"  # rdi
6291583c41dSMichał Górny                "4142434445464748"  # rbp
6301583c41dSMichał Górny                "5152535455565758"  # rsp
6311583c41dSMichał Górny                "6162636465666768"  # r8
6321583c41dSMichał Górny                "7172737475767778"  # r9
6331583c41dSMichał Górny                "8182838485868788"  # rip
6341583c41dSMichał Górny                "91929394"  # eflags
6351583c41dSMichał Górny            )
6361583c41dSMichał Górny
6371583c41dSMichał Górny            def qXferRead(self, obj, annex, offset, length):
6381583c41dSMichał Górny                if annex == "target.xml":
6391583c41dSMichał Górny                    return """<?xml version="1.0"?>
6401583c41dSMichał Górny                        <!DOCTYPE feature SYSTEM "gdb-target.dtd">
6411583c41dSMichał Górny                        <target>
6421583c41dSMichał Górny                          <architecture>i386:x86-64</architecture>
6431583c41dSMichał Górny                          <osabi>GNU/Linux</osabi>
6441583c41dSMichał Górny                          <feature name="org.gnu.gdb.i386.core">
6451583c41dSMichał Górny                            <reg name="rcx" bitsize="64" type="int64" regnum="2"/>
6461583c41dSMichał Górny                            <reg name="rdx" bitsize="64" type="int64" regnum="3"/>
6471583c41dSMichał Górny                            <reg name="rsi" bitsize="64" type="int64" regnum="4"/>
6481583c41dSMichał Górny                            <reg name="rdi" bitsize="64" type="int64" regnum="5"/>
6491583c41dSMichał Górny                            <reg name="rbp" bitsize="64" type="data_ptr" regnum="6"/>
6501583c41dSMichał Górny                            <reg name="rsp" bitsize="64" type="data_ptr" regnum="7"/>
6511583c41dSMichał Górny                            <reg name="r8" bitsize="64" type="int64" regnum="8"/>
6521583c41dSMichał Górny                            <reg name="r9" bitsize="64" type="int64" regnum="9"/>
6531583c41dSMichał Górny                            <reg name="rip" bitsize="64" type="code_ptr" regnum="16"/>
6541583c41dSMichał Górny                            <reg name="eflags" bitsize="32" type="i386_eflags" regnum="17"/>
6551583c41dSMichał Górny                            <reg name="ecx" bitsize="32" type="int" regnum="18" value_regnums="2"/>
6561583c41dSMichał Górny                          </feature>
6571583c41dSMichał Górny                        </target>""", False
6581583c41dSMichał Górny                else:
6591583c41dSMichał Górny                    return None, False
6601583c41dSMichał Górny
6611583c41dSMichał Górny            def readRegister(self, regnum):
6621583c41dSMichał Górny                return ""
6631583c41dSMichał Górny
6641583c41dSMichał Górny            def readRegisters(self):
6651583c41dSMichał Górny                return self.reg_data
6661583c41dSMichał Górny
6671583c41dSMichał Górny            def haltReason(self):
6681583c41dSMichał Górny                return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;"
6691583c41dSMichał Górny
6701583c41dSMichał Górny        self.server.responder = MyResponder()
6711583c41dSMichał Górny
6721583c41dSMichał Górny        target = self.createTarget("basic_eh_frame.yaml")
6731583c41dSMichał Górny        process = self.connect(target)
6741583c41dSMichał Górny        lldbutil.expect_state_changes(self, self.dbg.GetListener(), process,
6751583c41dSMichał Górny                                      [lldb.eStateStopped])
6761583c41dSMichał Górny
6771583c41dSMichał Górny        self.match("register read rcx",
6781583c41dSMichał Górny                   ["rcx = 0x0807060504030201"])
6791583c41dSMichał Górny        # ecx is supplied via target.xml
6801583c41dSMichał Górny        self.match("register read ecx",
6811583c41dSMichał Górny                   ["ecx = 0x04030201"])
6821583c41dSMichał Górny        self.match("register read rdx",
6831583c41dSMichał Górny                   ["rdx = 0x1817161514131211"])
6841583c41dSMichał Górny        # edx should not be added
6851583c41dSMichał Górny        self.match("register read edx",
6861583c41dSMichał Górny                   ["error: Invalid register name 'edx'."],
6871583c41dSMichał Górny                   error=True)
6881583c41dSMichał Górny
6891583c41dSMichał Górny    @skipIfXmlSupportMissing
6901583c41dSMichał Górny    @skipIfRemote
6911583c41dSMichał Górny    @skipIfLLVMTargetMissing("X86")
6921583c41dSMichał Górny    def test_i386_no_duplicate_subregs(self):
6931583c41dSMichał Górny        """Test that duplicate subregisters are not added (on i386)."""
6941583c41dSMichał Górny        class MyResponder(MockGDBServerResponder):
6951583c41dSMichał Górny            reg_data = (
6961583c41dSMichał Górny                "01020304"  # eax
6971583c41dSMichał Górny                "11121314"  # ecx
6981583c41dSMichał Górny                "21222324"  # edx
6991583c41dSMichał Górny                "31323334"  # ebx
7001583c41dSMichał Górny                "41424344"  # esp
7011583c41dSMichał Górny                "51525354"  # ebp
7021583c41dSMichał Górny                "61626364"  # esi
7031583c41dSMichał Górny                "71727374"  # edi
7041583c41dSMichał Górny                "81828384"  # eip
7051583c41dSMichał Górny                "91929394"  # eflags
7061583c41dSMichał Górny            )
7071583c41dSMichał Górny
7081583c41dSMichał Górny            def qXferRead(self, obj, annex, offset, length):
7091583c41dSMichał Górny                if annex == "target.xml":
7101583c41dSMichał Górny                    return """<?xml version="1.0"?>
7111583c41dSMichał Górny                        <!DOCTYPE feature SYSTEM "gdb-target.dtd">
7121583c41dSMichał Górny                        <target>
7131583c41dSMichał Górny                          <architecture>i386</architecture>
7141583c41dSMichał Górny                          <osabi>GNU/Linux</osabi>
7151583c41dSMichał Górny                          <feature name="org.gnu.gdb.i386.core">
7161583c41dSMichał Górny                            <reg name="eax" bitsize="32" type="int32" regnum="0"/>
7171583c41dSMichał Górny                            <reg name="ecx" bitsize="32" type="int32" regnum="1"/>
7181583c41dSMichał Górny                            <reg name="edx" bitsize="32" type="int32" regnum="2"/>
7191583c41dSMichał Górny                            <reg name="ebx" bitsize="32" type="int32" regnum="3"/>
7201583c41dSMichał Górny                            <reg name="esp" bitsize="32" type="data_ptr" regnum="4"/>
7211583c41dSMichał Górny                            <reg name="ebp" bitsize="32" type="data_ptr" regnum="5"/>
7221583c41dSMichał Górny                            <reg name="esi" bitsize="32" type="int32" regnum="6"/>
7231583c41dSMichał Górny                            <reg name="edi" bitsize="32" type="int32" regnum="7"/>
7241583c41dSMichał Górny                            <reg name="eip" bitsize="32" type="code_ptr" regnum="8"/>
7251583c41dSMichał Górny                            <reg name="eflags" bitsize="32" type="i386_eflags" regnum="9"/>
7261583c41dSMichał Górny                            <reg name="ax" bitsize="16" type="int" regnum="10" value_regnums="0"/>
7271583c41dSMichał Górny                          </feature>
7281583c41dSMichał Górny                        </target>""", False
7291583c41dSMichał Górny                else:
7301583c41dSMichał Górny                    return None, False
7311583c41dSMichał Górny
7321583c41dSMichał Górny            def readRegister(self, regnum):
7331583c41dSMichał Górny                return ""
7341583c41dSMichał Górny
7351583c41dSMichał Górny            def readRegisters(self):
7361583c41dSMichał Górny                return self.reg_data
7371583c41dSMichał Górny
7381583c41dSMichał Górny            def haltReason(self):
7391583c41dSMichał Górny                return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;"
7401583c41dSMichał Górny
7411583c41dSMichał Górny        self.server.responder = MyResponder()
7421583c41dSMichał Górny
7431583c41dSMichał Górny        target = self.createTarget("basic_eh_frame-i386.yaml")
7441583c41dSMichał Górny        process = self.connect(target)
7451583c41dSMichał Górny        lldbutil.expect_state_changes(self, self.dbg.GetListener(), process,
7461583c41dSMichał Górny                                      [lldb.eStateStopped])
7471583c41dSMichał Górny
7481583c41dSMichał Górny        self.match("register read eax",
7491583c41dSMichał Górny                   ["eax = 0x04030201"])
7501583c41dSMichał Górny        # cx is supplied via target.xml
7511583c41dSMichał Górny        self.match("register read ax",
7521583c41dSMichał Górny                   ["ax = 0x0201"])
7531583c41dSMichał Górny        self.match("register read ecx",
7541583c41dSMichał Górny                   ["ecx = 0x14131211"])
7551583c41dSMichał Górny        # dx should not be added
7561583c41dSMichał Górny        self.match("register read cx",
7571583c41dSMichał Górny                   ["error: Invalid register name 'cx'."],
7581583c41dSMichał Górny                   error=True)
7591583c41dSMichał Górny
7601583c41dSMichał Górny    @skipIfXmlSupportMissing
7611583c41dSMichał Górny    @skipIfRemote
762f70f9620SMichał Górny    @skipIfLLVMTargetMissing("AArch64")
763f70f9620SMichał Górny    def test_aarch64_no_duplicate_subregs(self):
764f70f9620SMichał Górny        """Test that duplicate subregisters are not added."""
765f70f9620SMichał Górny        class MyResponder(MockGDBServerResponder):
766f70f9620SMichał Górny            reg_data = (
767f70f9620SMichał Górny                "0102030405060708"  # x0
768f70f9620SMichał Górny                "1112131415161718"  # x1
769f70f9620SMichał Górny            ) + 27 * (
770f70f9620SMichał Górny                "2122232425262728"  # x2..x28
771f70f9620SMichał Górny            ) + (
772f70f9620SMichał Górny                "3132333435363738"  # x29 (fp)
773f70f9620SMichał Górny                "4142434445464748"  # x30 (lr)
774f70f9620SMichał Górny                "5152535455565758"  # x31 (sp)
775f70f9620SMichał Górny                "6162636465666768"  # pc
776f70f9620SMichał Górny                "71727374"  # cpsr
777f70f9620SMichał Górny            )
778f70f9620SMichał Górny
779f70f9620SMichał Górny            def qXferRead(self, obj, annex, offset, length):
780f70f9620SMichał Górny                if annex == "target.xml":
781f70f9620SMichał Górny                    return """<?xml version="1.0"?>
782f70f9620SMichał Górny                        <!DOCTYPE feature SYSTEM "gdb-target.dtd">
783f70f9620SMichał Górny                        <target>
784f70f9620SMichał Górny                          <architecture>aarch64</architecture>
785f70f9620SMichał Górny                          <feature name="org.gnu.gdb.aarch64.core">
786f70f9620SMichał Górny                            <reg name="x0" bitsize="64" type="int" regnum="0"/>
787f70f9620SMichał Górny                            <reg name="x1" bitsize="64" type="int" regnum="1"/>
788f70f9620SMichał Górny                            <reg name="x2" bitsize="64" type="int" regnum="2"/>
789f70f9620SMichał Górny                            <reg name="x3" bitsize="64" type="int" regnum="3"/>
790f70f9620SMichał Górny                            <reg name="x4" bitsize="64" type="int" regnum="4"/>
791f70f9620SMichał Górny                            <reg name="x5" bitsize="64" type="int" regnum="5"/>
792f70f9620SMichał Górny                            <reg name="x6" bitsize="64" type="int" regnum="6"/>
793f70f9620SMichał Górny                            <reg name="x7" bitsize="64" type="int" regnum="7"/>
794f70f9620SMichał Górny                            <reg name="x8" bitsize="64" type="int" regnum="8"/>
795f70f9620SMichał Górny                            <reg name="x9" bitsize="64" type="int" regnum="9"/>
796f70f9620SMichał Górny                            <reg name="x10" bitsize="64" type="int" regnum="10"/>
797f70f9620SMichał Górny                            <reg name="x11" bitsize="64" type="int" regnum="11"/>
798f70f9620SMichał Górny                            <reg name="x12" bitsize="64" type="int" regnum="12"/>
799f70f9620SMichał Górny                            <reg name="x13" bitsize="64" type="int" regnum="13"/>
800f70f9620SMichał Górny                            <reg name="x14" bitsize="64" type="int" regnum="14"/>
801f70f9620SMichał Górny                            <reg name="x15" bitsize="64" type="int" regnum="15"/>
802f70f9620SMichał Górny                            <reg name="x16" bitsize="64" type="int" regnum="16"/>
803f70f9620SMichał Górny                            <reg name="x17" bitsize="64" type="int" regnum="17"/>
804f70f9620SMichał Górny                            <reg name="x18" bitsize="64" type="int" regnum="18"/>
805f70f9620SMichał Górny                            <reg name="x19" bitsize="64" type="int" regnum="19"/>
806f70f9620SMichał Górny                            <reg name="x20" bitsize="64" type="int" regnum="20"/>
807f70f9620SMichał Górny                            <reg name="x21" bitsize="64" type="int" regnum="21"/>
808f70f9620SMichał Górny                            <reg name="x22" bitsize="64" type="int" regnum="22"/>
809f70f9620SMichał Górny                            <reg name="x23" bitsize="64" type="int" regnum="23"/>
810f70f9620SMichał Górny                            <reg name="x24" bitsize="64" type="int" regnum="24"/>
811f70f9620SMichał Górny                            <reg name="x25" bitsize="64" type="int" regnum="25"/>
812f70f9620SMichał Górny                            <reg name="x26" bitsize="64" type="int" regnum="26"/>
813f70f9620SMichał Górny                            <reg name="x27" bitsize="64" type="int" regnum="27"/>
814f70f9620SMichał Górny                            <reg name="x28" bitsize="64" type="int" regnum="28"/>
815f70f9620SMichał Górny                            <reg name="x29" bitsize="64" type="int" regnum="29"/>
816f70f9620SMichał Górny                            <reg name="x30" bitsize="64" type="int" regnum="30"/>
817f70f9620SMichał Górny                            <reg name="sp" bitsize="64" type="data_ptr" regnum="31"/>
818f70f9620SMichał Górny                            <reg name="pc" bitsize="64" type="code_ptr" regnum="32"/>
819f70f9620SMichał Górny                            <reg name="cpsr" bitsize="32" type="cpsr_flags" regnum="33"/>
820f70f9620SMichał Górny                            <reg name="w0" bitsize="32" type="int" regnum="34" value_regnums="0"/>
821f70f9620SMichał Górny                          </feature>
822f70f9620SMichał Górny                        </target>""", False
823f70f9620SMichał Górny                else:
824f70f9620SMichał Górny                    return None, False
825f70f9620SMichał Górny
826f70f9620SMichał Górny            def readRegister(self, regnum):
827f70f9620SMichał Górny                return ""
828f70f9620SMichał Górny
829f70f9620SMichał Górny            def readRegisters(self):
830f70f9620SMichał Górny                return self.reg_data
831f70f9620SMichał Górny
832f70f9620SMichał Górny            def haltReason(self):
833f70f9620SMichał Górny                return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;"
834f70f9620SMichał Górny
835f70f9620SMichał Górny        self.server.responder = MyResponder()
836f70f9620SMichał Górny
837f70f9620SMichał Górny        target = self.createTarget("basic_eh_frame-aarch64.yaml")
838f70f9620SMichał Górny        process = self.connect(target)
839f70f9620SMichał Górny        lldbutil.expect_state_changes(self, self.dbg.GetListener(), process,
840f70f9620SMichał Górny                                      [lldb.eStateStopped])
841f70f9620SMichał Górny
842f70f9620SMichał Górny        self.match("register read x0",
843f70f9620SMichał Górny                   ["x0 = 0x0807060504030201"])
844f70f9620SMichał Górny        # w0 comes from target.xml
845f70f9620SMichał Górny        self.match("register read w0",
846f70f9620SMichał Górny                   ["w0 = 0x04030201"])
847f70f9620SMichał Górny        self.match("register read x1",
848f70f9620SMichał Górny                   ["x1 = 0x1817161514131211"])
849f70f9620SMichał Górny        # w1 should not be added
850f70f9620SMichał Górny        self.match("register read w1",
851f70f9620SMichał Górny                   ["error: Invalid register name 'w1'."],
852f70f9620SMichał Górny                   error=True)
853