@@ -644,12 +644,16 @@ def test(self):
644
644
self .gdb .b ("_exit" )
645
645
self .exit ()
646
646
647
- def MCONTROL_TYPE (xlen ):
647
+ def TDATA1_TYPE (xlen ):
648
648
return 0xf << ((xlen )- 4 )
649
- def MCONTROL_DMODE (xlen ):
649
+ def TDATA1_DMODE (xlen ):
650
650
return 1 << ((xlen )- 5 )
651
651
def 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
653
657
654
658
MCONTROL_SELECT = 1 << 19
655
659
MCONTROL_TIMING = 1 << 18
@@ -664,8 +668,23 @@ def MCONTROL_MASKMAX(xlen):
664
668
MCONTROL_STORE = 1 << 1
665
669
MCONTROL_LOAD = 1 << 0
666
670
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
669
688
670
689
MCONTROL_ACTION_DEBUG_EXCEPTION = 0
671
690
MCONTROL_ACTION_DEBUG_MODE = 1
@@ -717,21 +736,27 @@ def set_manual_trigger(self, tdata1, tdata2):
717
736
718
737
tdata2_rb = self .gdb .p ("$tdata2" )
719
738
tdata1_rb = self .gdb .p ("$tdata1" )
720
- if tdata1_rb == tdata1 and tdata2_rb == tdata2 :
721
- return tselect
722
739
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 :
727
749
raise TestNotApplicable
728
750
751
+ if tdata1_rb == tdata1 and tdata2_rb == tdata2 :
752
+ return tselect
753
+
729
754
self .gdb .p ("$tdata1=0" )
730
755
self .gdb .command (
731
756
f"monitor riscv reserve_trigger { tselect } off" )
732
757
assert False
733
758
734
- def test (self ):
759
+ def access_test (self , tdata1 ):
735
760
if not self .hart .honors_tdata1_hmode :
736
761
# Run to main before setting the breakpoint, because startup code
737
762
# will otherwise clear the trigger that we set.
@@ -746,12 +771,6 @@ def test(self):
746
771
self .check_reserve_trigger_support ()
747
772
748
773
#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
755
774
756
775
tdata2 = self .gdb .p ("&rot13" )
757
776
@@ -791,6 +810,25 @@ def test(self):
791
810
self .gdb .b ("_exit" )
792
811
self .exit ()
793
812
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 )
794
832
795
833
class Hwbp2 (DebugTest ):
796
834
def early_applicable (self ):
0 commit comments