@@ -644,12 +644,16 @@ def test(self):
644644 self .gdb .b ("_exit" )
645645 self .exit ()
646646
647- def MCONTROL_TYPE (xlen ):
647+ def TDATA1_TYPE (xlen ):
648648 return 0xf << ((xlen )- 4 )
649- def MCONTROL_DMODE (xlen ):
649+ def TDATA1_DMODE (xlen ):
650650 return 1 << ((xlen )- 5 )
651651def MCONTROL_MASKMAX (xlen ):
652- return 0x3 << ((xlen )- 11 )
652+ return 0x3f << ((xlen )- 11 )
653+
654+ TDATA1_TYPE_NONE = 0
655+ TDATA1_TYPE_MATCH = 2
656+ TDATA1_TYPE_MATCH6 = 6
653657
654658MCONTROL_SELECT = 1 << 19
655659MCONTROL_TIMING = 1 << 18
@@ -664,8 +668,23 @@ def MCONTROL_MASKMAX(xlen):
664668MCONTROL_STORE = 1 << 1
665669MCONTROL_LOAD = 1 << 0
666670
667- MCONTROL_TYPE_NONE = 0
668- MCONTROL_TYPE_MATCH = 2
671+ MCONTROL6_UNCERTAIN = 1 << 26
672+ MCONTROL6_HIT1 = 1 << 25
673+ MCONTROL6_VS = 1 << 24
674+ MCONTROL6_VU = 1 << 23
675+ MCONTROL6_HIT0 = 1 << 22
676+ MCONTROL6_SELECT = 1 << 21
677+ MCONTROL6_SIZE = 0x7 << 16
678+ MCONTROL6_ACTION = 0xf << 12
679+ MCONTROL6_CHAIN = 1 << 11
680+ MCONTROL6_MATCH = 0xf << 7
681+ MCONTROL6_M = 1 << 6
682+ MCONTROL6_UNCERTAINEN = 1 << 5
683+ MCONTROL6_S = 1 << 4
684+ MCONTROL6_U = 1 << 3
685+ MCONTROL6_EXECUTE = 1 << 2
686+ MCONTROL6_STORE = 1 << 1
687+ MCONTROL6_LOAD = 1 << 0
669688
670689MCONTROL_ACTION_DEBUG_EXCEPTION = 0
671690MCONTROL_ACTION_DEBUG_MODE = 1
@@ -717,21 +736,27 @@ def set_manual_trigger(self, tdata1, tdata2):
717736
718737 tdata2_rb = self .gdb .p ("$tdata2" )
719738 tdata1_rb = self .gdb .p ("$tdata1" )
720- if tdata1_rb == tdata1 and tdata2_rb == tdata2 :
721- return tselect
722739
723- type_rb = tdata1_rb & MCONTROL_TYPE (self .hart .xlen )
724- type_none = set_field (0 , MCONTROL_TYPE (self .hart .xlen ),
725- MCONTROL_TYPE_NONE )
726- if type_rb == type_none :
740+ type_rb = tdata1_rb & TDATA1_TYPE (self .hart .xlen )
741+ type_match = set_field (0 , TDATA1_TYPE (self .hart .xlen ),
742+ TDATA1_TYPE_MATCH )
743+ type_none = set_field (0 , TDATA1_TYPE (self .hart .xlen ),
744+ TDATA1_TYPE_NONE )
745+ if type_rb == type_match :
746+ maskmax_rb = tdata1_rb & MCONTROL_MASKMAX (self .hart .xlen )
747+ tdata1 = tdata1 | maskmax_rb
748+ elif type_rb == type_none :
727749 raise TestNotApplicable
728750
751+ if tdata1_rb == tdata1 and tdata2_rb == tdata2 :
752+ return tselect
753+
729754 self .gdb .p ("$tdata1=0" )
730755 self .gdb .command (
731756 f"monitor riscv reserve_trigger { tselect } off" )
732757 assert False
733758
734- def test (self ):
759+ def access_test (self , tdata1 ):
735760 if not self .hart .honors_tdata1_hmode :
736761 # Run to main before setting the breakpoint, because startup code
737762 # will otherwise clear the trigger that we set.
@@ -746,12 +771,6 @@ def test(self):
746771 self .check_reserve_trigger_support ()
747772
748773 #self.gdb.hbreak("rot13")
749- tdata1 = MCONTROL_DMODE (self .hart .xlen )
750- tdata1 = set_field (tdata1 , MCONTROL_TYPE (self .hart .xlen ),
751- MCONTROL_TYPE_MATCH )
752- tdata1 = set_field (tdata1 , MCONTROL_ACTION , MCONTROL_ACTION_DEBUG_MODE )
753- tdata1 = set_field (tdata1 , MCONTROL_MATCH , MCONTROL_MATCH_EQUAL )
754- tdata1 |= MCONTROL_M | MCONTROL_S | MCONTROL_U | MCONTROL_EXECUTE
755774
756775 tdata2 = self .gdb .p ("&rot13" )
757776
@@ -791,6 +810,25 @@ def test(self):
791810 self .gdb .b ("_exit" )
792811 self .exit ()
793812
813+ class MatchTrigger2 (HwbpManual ):
814+ def test (self ):
815+ tdata1 = TDATA1_DMODE (self .hart .xlen )
816+ tdata1 = set_field (tdata1 , TDATA1_TYPE (self .hart .xlen ),
817+ TDATA1_TYPE_MATCH )
818+ tdata1 = set_field (tdata1 , MCONTROL_ACTION , MCONTROL_ACTION_DEBUG_MODE )
819+ tdata1 = set_field (tdata1 , MCONTROL_MATCH , MCONTROL_MATCH_EQUAL )
820+ tdata1 |= MCONTROL_M | MCONTROL_S | MCONTROL_U | MCONTROL_EXECUTE
821+ self .access_test (tdata1 )
822+
823+ class MatchTrigger6 (HwbpManual ):
824+ def test (self ):
825+ tdata1 = TDATA1_DMODE (self .hart .xlen )
826+ tdata1 = set_field (tdata1 , TDATA1_TYPE (self .hart .xlen ),
827+ TDATA1_TYPE_MATCH6 )
828+ tdata1 = set_field (tdata1 , MCONTROL6_ACTION , MCONTROL_ACTION_DEBUG_MODE )
829+ tdata1 = set_field (tdata1 , MCONTROL6_MATCH , MCONTROL_MATCH_EQUAL )
830+ tdata1 |= MCONTROL6_M | MCONTROL6_S | MCONTROL6_U | MCONTROL6_EXECUTE
831+ self .access_test (tdata1 )
794832
795833class Hwbp2 (DebugTest ):
796834 def early_applicable (self ):
0 commit comments