Skip to content

Commit c7d1719

Browse files
committed
[debug] Support mcontrol and mcontrol6 based on HwbpManual
1 parent fa2f65c commit c7d1719

File tree

1 file changed

+56
-18
lines changed

1 file changed

+56
-18
lines changed

debug/gdbserver.py

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
651651
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
653657

654658
MCONTROL_SELECT = 1<<19
655659
MCONTROL_TIMING = 1<<18
@@ -664,8 +668,23 @@ def MCONTROL_MASKMAX(xlen):
664668
MCONTROL_STORE = 1<<1
665669
MCONTROL_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

670689
MCONTROL_ACTION_DEBUG_EXCEPTION = 0
671690
MCONTROL_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

795833
class Hwbp2(DebugTest):
796834
def early_applicable(self):

0 commit comments

Comments
 (0)