@@ -1504,6 +1504,104 @@ static void deinit_target(struct target *target)
15041504 info -> version_specific = NULL ;
15051505}
15061506
1507+ static int maybe_add_trigger_t1 (struct target * target , struct trigger * trigger ,
1508+ uint64_t tdata1 )
1509+ {
1510+ riscv011_info_t * info = get_info (target );
1511+
1512+ const uint32_t bpcontrol_x = 1 <<0 ;
1513+ const uint32_t bpcontrol_w = 1 <<1 ;
1514+ const uint32_t bpcontrol_r = 1 <<2 ;
1515+ const uint32_t bpcontrol_u = 1 <<3 ;
1516+ const uint32_t bpcontrol_s = 1 <<4 ;
1517+ const uint32_t bpcontrol_h = 1 <<5 ;
1518+ const uint32_t bpcontrol_m = 1 <<6 ;
1519+ const uint32_t bpcontrol_bpmatch = 0xf << 7 ;
1520+ const uint32_t bpcontrol_bpaction = 0xff << 11 ;
1521+
1522+ if (tdata1 & (bpcontrol_r | bpcontrol_w | bpcontrol_x )) {
1523+ // Trigger is already in use, presumably by user code.
1524+ return ERROR_TARGET_RESOURCE_NOT_AVAILABLE ;
1525+ }
1526+
1527+ tdata1 = set_field (tdata1 , bpcontrol_r , trigger -> read );
1528+ tdata1 = set_field (tdata1 , bpcontrol_w , trigger -> write );
1529+ tdata1 = set_field (tdata1 , bpcontrol_x , trigger -> execute );
1530+ tdata1 = set_field (tdata1 , bpcontrol_u , !!(info -> misa & (1 << ('U' - 'A' ))));
1531+ tdata1 = set_field (tdata1 , bpcontrol_s , !!(info -> misa & (1 << ('S' - 'A' ))));
1532+ tdata1 = set_field (tdata1 , bpcontrol_h , !!(info -> misa & (1 << ('H' - 'A' ))));
1533+ tdata1 |= bpcontrol_m ;
1534+ tdata1 = set_field (tdata1 , bpcontrol_bpmatch , 0 ); // exact match
1535+ tdata1 = set_field (tdata1 , bpcontrol_bpaction , 0 ); // cause bp exception
1536+
1537+ write_csr (target , CSR_TDATA1 , tdata1 );
1538+
1539+ uint64_t tdata1_rb ;
1540+ read_csr (target , & tdata1_rb , CSR_TDATA1 );
1541+ LOG_DEBUG ("tdata1=0x%" PRIx64 , tdata1_rb );
1542+
1543+ if (tdata1 != tdata1_rb ) {
1544+ LOG_DEBUG ("Trigger doesn't support what we need; After writing 0x%"
1545+ PRIx64 " to tdata1 it contains 0x%" PRIx64 ,
1546+ tdata1 , tdata1_rb );
1547+ write_csr (target , CSR_TDATA1 , 0 );
1548+ return ERROR_TARGET_RESOURCE_NOT_AVAILABLE ;
1549+ }
1550+
1551+ write_csr (target , CSR_TDATA2 , trigger -> address );
1552+
1553+ return ERROR_OK ;
1554+ }
1555+
1556+ static int maybe_add_trigger_t2 (struct target * target , struct trigger * trigger ,
1557+ uint64_t tdata1 )
1558+ {
1559+ riscv011_info_t * info = get_info (target );
1560+ // tselect is already set
1561+ if (tdata1 & (MCONTROL_EXECUTE | MCONTROL_STORE | MCONTROL_LOAD )) {
1562+ // Trigger is already in use, presumably by user code.
1563+ return ERROR_TARGET_RESOURCE_NOT_AVAILABLE ;
1564+ }
1565+
1566+ // address/data match trigger
1567+ tdata1 |= MCONTROL_DMODE (riscv_xlen (target ));
1568+ tdata1 = set_field (tdata1 , MCONTROL_ACTION ,
1569+ MCONTROL_ACTION_DEBUG_MODE );
1570+ tdata1 = set_field (tdata1 , MCONTROL_MATCH , MCONTROL_MATCH_EQUAL );
1571+ tdata1 |= MCONTROL_M ;
1572+ if (info -> misa & (1 << ('H' - 'A' )))
1573+ tdata1 |= MCONTROL_H ;
1574+ if (info -> misa & (1 << ('S' - 'A' )))
1575+ tdata1 |= MCONTROL_S ;
1576+ if (info -> misa & (1 << ('U' - 'A' )))
1577+ tdata1 |= MCONTROL_U ;
1578+
1579+ if (trigger -> execute )
1580+ tdata1 |= MCONTROL_EXECUTE ;
1581+ if (trigger -> read )
1582+ tdata1 |= MCONTROL_LOAD ;
1583+ if (trigger -> write )
1584+ tdata1 |= MCONTROL_STORE ;
1585+
1586+ write_csr (target , CSR_TDATA1 , tdata1 );
1587+
1588+ uint64_t tdata1_rb ;
1589+ read_csr (target , & tdata1_rb , CSR_TDATA1 );
1590+ LOG_DEBUG ("tdata1=0x%" PRIx64 , tdata1_rb );
1591+
1592+ if (tdata1 != tdata1_rb ) {
1593+ LOG_DEBUG ("Trigger doesn't support what we need; After writing 0x%"
1594+ PRIx64 " to tdata1 it contains 0x%" PRIx64 ,
1595+ tdata1 , tdata1_rb );
1596+ write_csr (target , CSR_TDATA1 , 0 );
1597+ return ERROR_TARGET_RESOURCE_NOT_AVAILABLE ;
1598+ }
1599+
1600+ write_csr (target , CSR_TDATA2 , trigger -> address );
1601+
1602+ return ERROR_OK ;
1603+ }
1604+
15071605static int add_trigger (struct target * target , struct trigger * trigger )
15081606{
15091607 riscv011_info_t * info = get_info (target );
@@ -1522,51 +1620,23 @@ static int add_trigger(struct target *target, struct trigger *trigger)
15221620 read_csr (target , & tdata1 , CSR_TDATA1 );
15231621 int type = get_field (tdata1 , MCONTROL_TYPE (riscv_xlen (target )));
15241622
1525- if (type != 2 ) {
1526- continue ;
1527- }
1528-
1529- if (tdata1 & (MCONTROL_EXECUTE | MCONTROL_STORE | MCONTROL_LOAD )) {
1530- // Trigger is already in use, presumably by user code.
1531- continue ;
1623+ int result ;
1624+ switch (type ) {
1625+ case 1 :
1626+ result = maybe_add_trigger_t1 (target , trigger , tdata1 );
1627+ break ;
1628+ case 2 :
1629+ result = maybe_add_trigger_t2 (target , trigger , tdata1 );
1630+ break ;
1631+ default :
1632+ LOG_DEBUG ("trigger %d has unknown type %d" , i , type );
1633+ continue ;
15321634 }
15331635
1534- // address/data match trigger
1535- tdata1 |= MCONTROL_DMODE (riscv_xlen (target ));
1536- tdata1 = set_field (tdata1 , MCONTROL_ACTION ,
1537- MCONTROL_ACTION_DEBUG_MODE );
1538- tdata1 = set_field (tdata1 , MCONTROL_MATCH , MCONTROL_MATCH_EQUAL );
1539- tdata1 |= MCONTROL_M ;
1540- if (info -> misa & (1 << ('H' - 'A' )))
1541- tdata1 |= MCONTROL_H ;
1542- if (info -> misa & (1 << ('S' - 'A' )))
1543- tdata1 |= MCONTROL_S ;
1544- if (info -> misa & (1 << ('U' - 'A' )))
1545- tdata1 |= MCONTROL_U ;
1546-
1547- if (trigger -> execute )
1548- tdata1 |= MCONTROL_EXECUTE ;
1549- if (trigger -> read )
1550- tdata1 |= MCONTROL_LOAD ;
1551- if (trigger -> write )
1552- tdata1 |= MCONTROL_STORE ;
1553-
1554- write_csr (target , CSR_TDATA1 , tdata1 );
1555-
1556- uint64_t tdata1_rb ;
1557- read_csr (target , & tdata1_rb , CSR_TDATA1 );
1558- LOG_DEBUG ("tdata1=0x%" PRIx64 , tdata1_rb );
1559-
1560- if (tdata1 != tdata1_rb ) {
1561- LOG_DEBUG ("Trigger %d doesn't support what we need; After writing 0x%"
1562- PRIx64 " to tdata1 it contains 0x%" PRIx64 ,
1563- i , tdata1 , tdata1_rb );
1564- write_csr (target , CSR_TDATA1 , 0 );
1636+ if (result != ERROR_OK ) {
15651637 continue ;
15661638 }
15671639
1568- write_csr (target , CSR_TDATA2 , trigger -> address );
1569-
15701640 LOG_DEBUG ("Using resource %d for bp %d" , i ,
15711641 trigger -> unique_id );
15721642 info -> trigger_unique_id [i ] = trigger -> unique_id ;
@@ -1906,8 +1976,13 @@ static int examine(struct target *target)
19061976 update_reg_list (target );
19071977
19081978 if (read_csr (target , & info -> misa , CSR_MISA ) != ERROR_OK ) {
1909- LOG_ERROR ("Failed to read misa." );
1910- return ERROR_FAIL ;
1979+ LOG_WARNING ("Failed to read misa at 0x%x." , CSR_MISA );
1980+ if (read_csr (target , & info -> misa , 0xf10 ) != ERROR_OK ) {
1981+ // Maybe this is an old core that still has $misa at the old
1982+ // address.
1983+ LOG_ERROR ("Failed to read misa at 0x%x." , 0xf10 );
1984+ return ERROR_FAIL ;
1985+ }
19111986 }
19121987
19131988 info -> never_halted = true;
@@ -2137,6 +2212,9 @@ static int handle_halt(struct target *target, bool announce)
21372212 write_csr (target , CSR_TSELECT , info -> trigger_count );
21382213 uint64_t tselect_rb ;
21392214 read_csr (target , & tselect_rb , CSR_TSELECT );
2215+ // Mask off the top bit, which is used as tdrmode in old
2216+ // implementations.
2217+ tselect_rb &= ~(1ULL << (riscv_xlen (target )- 1 ));
21402218 if (info -> trigger_count != tselect_rb )
21412219 break ;
21422220 uint64_t tdata1 ;
0 commit comments