@@ -652,6 +652,154 @@ def haltReason(self):
652652 )
653653 self .match ("register read s31" , ["s31 = 128" ])
654654
655+ @skipIfXmlSupportMissing
656+ @skipIfRemote
657+ @skipIfLLVMTargetMissing ("RISCV" )
658+ def test_riscv64_regs (self ):
659+ """Test grabbing various riscv64 registers from gdbserver."""
660+
661+ class MyResponder (MockGDBServerResponder ):
662+ reg_data = (
663+ "0102030405060708" # zero
664+ "0102030405060708" # ra
665+ "0102030405060708" # sp
666+ "0102030405060708" # gp
667+ "0102030405060708" # tp
668+ "0102030405060708" # t0
669+ "0102030405060708" # t1
670+ "0102030405060708" # t2
671+ "0102030405060708" # fp
672+ "0102030405060708" # s1
673+ "0102030405060708" # a0
674+ "0102030405060708" # a1
675+ "0102030405060708" # a2
676+ "0102030405060708" # a3
677+ "0102030405060708" # a4
678+ "0102030405060708" # a5
679+ "0102030405060708" # a6
680+ "0102030405060708" # a7
681+ "0102030405060708" # s2
682+ "0102030405060708" # s3
683+ "0102030405060708" # s4
684+ "0102030405060708" # s5
685+ "0102030405060708" # s6
686+ "0102030405060708" # s7
687+ "0102030405060708" # s8
688+ "0102030405060708" # s9
689+ "0102030405060708" # s10
690+ "0102030405060708" # s11
691+ "0102030405060708" # t3
692+ "0102030405060708" # t4
693+ "0102030405060708" # t5
694+ "0102030405060708" # t6
695+ )
696+
697+ def qXferRead (self , obj , annex , offset , length ):
698+ if annex == "target.xml" :
699+ # Note that this XML does not include any aliases, LLDB must generate them itself.
700+ return (
701+ """<?xml version="1.0"?>
702+ <!DOCTYPE feature SYSTEM "gdb-target.dtd">
703+ <target>
704+ <architecture>riscv</architecture>
705+ <feature name="org.gnu.gdb.riscv.cpu">
706+ <reg name="zero" bitsize="64" type="int"/>
707+ <reg name="ra" bitsize="64" type="code_ptr"/>
708+ <reg name="sp" bitsize="64" type="data_ptr"/>
709+ <reg name="gp" bitsize="64" type="data_ptr"/>
710+ <reg name="tp" bitsize="64" type="data_ptr"/>
711+ <reg name="t0" bitsize="64" type="int"/>
712+ <reg name="t1" bitsize="64" type="int"/>
713+ <reg name="t2" bitsize="64" type="int"/>
714+ <reg name="fp" bitsize="64" type="data_ptr"/>
715+ <reg name="s1" bitsize="64" type="int"/>
716+ <reg name="a0" bitsize="64" type="int"/>
717+ <reg name="a1" bitsize="64" type="int"/>
718+ <reg name="a2" bitsize="64" type="int"/>
719+ <reg name="a3" bitsize="64" type="int"/>
720+ <reg name="a4" bitsize="64" type="int"/>
721+ <reg name="a5" bitsize="64" type="int"/>
722+ <reg name="a6" bitsize="64" type="int"/>
723+ <reg name="a7" bitsize="64" type="int"/>
724+ <reg name="s2" bitsize="64" type="int"/>
725+ <reg name="s3" bitsize="64" type="int"/>
726+ <reg name="s4" bitsize="64" type="int"/>
727+ <reg name="s5" bitsize="64" type="int"/>
728+ <reg name="s6" bitsize="64" type="int"/>
729+ <reg name="s7" bitsize="64" type="int"/>
730+ <reg name="s8" bitsize="64" type="int"/>
731+ <reg name="s9" bitsize="64" type="int"/>
732+ <reg name="s10" bitsize="64" type="int"/>
733+ <reg name="s11" bitsize="64" type="int"/>
734+ <reg name="t3" bitsize="64" type="int"/>
735+ <reg name="t4" bitsize="64" type="int"/>
736+ <reg name="t5" bitsize="64" type="int"/>
737+ <reg name="t6" bitsize="64" type="int"/>
738+ <reg name="pc" bitsize="64" type="code_ptr"/>
739+ </feature>
740+ </target>""" ,
741+ False ,
742+ )
743+ else :
744+ return None , False
745+
746+ def readRegister (self , regnum ):
747+ return ""
748+
749+ def readRegisters (self ):
750+ return self .reg_data
751+
752+ def writeRegisters (self , reg_hex ):
753+ self .reg_data = reg_hex
754+ return "OK"
755+
756+ def haltReason (self ):
757+ return "T02thread:1ff0d;threads:1ff0d;thread-pcs:000000010001bc00;07:0102030405060708;10:1112131415161718;"
758+
759+ self .server .responder = MyResponder ()
760+
761+ target = self .createTarget ("basic_eh_frame-riscv64.yaml" )
762+ process = self .connect (target )
763+ lldbutil .expect_state_changes (
764+ self , self .dbg .GetListener (), process , [lldb .eStateStopped ]
765+ )
766+
767+ # test generic aliases
768+ self .match ("register read x0" , ["zero = 0x0807060504030201" ])
769+ self .match ("register read x1" , ["ra = 0x0807060504030201" ])
770+ self .match ("register read x2" , ["sp = 0x0807060504030201" ])
771+ self .match ("register read x3" , ["gp = 0x0807060504030201" ])
772+ self .match ("register read x4" , ["tp = 0x0807060504030201" ])
773+ self .match ("register read x5" , ["t0 = 0x0807060504030201" ])
774+ self .match ("register read x6" , ["t1 = 0x0807060504030201" ])
775+ self .match ("register read x7" , ["t2 = 0x0807060504030201" ])
776+ # Register x8 is probably not working because it has two aliases fp, s0
777+ # See issue #127900
778+ # self.match("register read x8", ["fp = 0x0807060504030201"])
779+ self .match ("register read x9" , ["s1 = 0x0807060504030201" ])
780+ self .match ("register read x10" , ["a0 = 0x0807060504030201" ])
781+ self .match ("register read x11" , ["a1 = 0x0807060504030201" ])
782+ self .match ("register read x12" , ["a2 = 0x0807060504030201" ])
783+ self .match ("register read x13" , ["a3 = 0x0807060504030201" ])
784+ self .match ("register read x14" , ["a4 = 0x0807060504030201" ])
785+ self .match ("register read x15" , ["a5 = 0x0807060504030201" ])
786+ self .match ("register read x16" , ["a6 = 0x0807060504030201" ])
787+ self .match ("register read x17" , ["a7 = 0x0807060504030201" ])
788+ self .match ("register read x18" , ["s2 = 0x0807060504030201" ])
789+ self .match ("register read x19" , ["s3 = 0x0807060504030201" ])
790+ self .match ("register read x20" , ["s4 = 0x0807060504030201" ])
791+ self .match ("register read x21" , ["s5 = 0x0807060504030201" ])
792+ self .match ("register read x22" , ["s6 = 0x0807060504030201" ])
793+ self .match ("register read x23" , ["s7 = 0x0807060504030201" ])
794+ self .match ("register read x24" , ["s8 = 0x0807060504030201" ])
795+ self .match ("register read x25" , ["s9 = 0x0807060504030201" ])
796+ self .match ("register read x26" , ["s10 = 0x0807060504030201" ])
797+ self .match ("register read x27" , ["s11 = 0x0807060504030201" ])
798+ self .match ("register read x28" , ["t3 = 0x0807060504030201" ])
799+ self .match ("register read x29" , ["t4 = 0x0807060504030201" ])
800+ self .match ("register read x30" , ["t5 = 0x0807060504030201" ])
801+ self .match ("register read x31" , ["t6 = 0x0807060504030201" ])
802+
655803 @skipIfXmlSupportMissing
656804 @skipIfRemote
657805 @skipIfLLVMTargetMissing ("X86" )
0 commit comments