@@ -1672,6 +1672,92 @@ static inline bool op_unimp(struct riscv_t *rv, uint32_t insn UNUSED)
1672
1672
return false;
1673
1673
}
1674
1674
1675
+ #ifdef ENABLE_GDBRSP
1676
+ size_t rv_read_reg (void * args , int regno )
1677
+ {
1678
+ struct riscv_t * rv = (struct riscv_t * ) args ;
1679
+
1680
+ if (regno < 32 ) {
1681
+ return rv_get_reg (rv , regno );
1682
+ } else if (regno == 32 ) {
1683
+ return rv_get_pc (rv );
1684
+ }
1685
+
1686
+ return -1 ;
1687
+ }
1688
+
1689
+ void rv_read_mem (void * args , size_t addr , size_t len , void * val )
1690
+ {
1691
+ struct riscv_t * rv = (struct riscv_t * ) args ;
1692
+
1693
+ for (size_t i = 0 ; i < len ; i ++ )
1694
+ * ((uint8_t * ) val + i ) = rv -> io .mem_read_b (rv , addr + i );
1695
+ }
1696
+
1697
+ gdb_action_t rv_cont (void * args )
1698
+ {
1699
+ struct riscv_t * rv = (struct riscv_t * ) args ;
1700
+ const uint32_t cycles_per_step = 1 ;
1701
+ for (; !rv_has_halted (rv ) &&
1702
+ rv -> PC != rv -> bp_addr ;) { /* run until the flag is done */
1703
+ /* step instructions */
1704
+ rv_step (rv , cycles_per_step );
1705
+ }
1706
+
1707
+ return ACT_RESUME ;
1708
+ }
1709
+
1710
+ bool rv_set_bp (void * args , size_t addr , bp_type_t type )
1711
+ {
1712
+ struct riscv_t * rv = (struct riscv_t * ) args ;
1713
+ if (type != BP_SOFTWARE || rv -> bp_is_set )
1714
+ return false;
1715
+
1716
+ rv -> bp_is_set = true;
1717
+ rv -> bp_addr = addr ;
1718
+ return true;
1719
+ }
1720
+
1721
+ bool rv_rm_bp (void * args , size_t addr , bp_type_t type )
1722
+ {
1723
+ struct riscv_t * rv = (struct riscv_t * ) args ;
1724
+ // It's fine when there's no matching breakpoint, just doing nothing
1725
+ if (type != BP_SOFTWARE || !rv -> bp_is_set || rv -> bp_addr != addr )
1726
+ return true;
1727
+
1728
+ rv -> bp_is_set = false;
1729
+ rv -> bp_addr = 0 ;
1730
+ return true;
1731
+ }
1732
+
1733
+ struct target_ops rv_ops = {
1734
+ .read_reg = rv_read_reg ,
1735
+ .read_mem = rv_read_mem ,
1736
+ .cont = rv_cont ,
1737
+ .stepi = NULL ,
1738
+ .set_bp = rv_set_bp ,
1739
+ .rm_bp = rv_rm_bp ,
1740
+ };
1741
+
1742
+ void rv_debug (struct riscv_t * rv )
1743
+ {
1744
+ if (!gdbstub_init (& rv -> gdbstub , & rv_ops ,
1745
+ (arch_info_t ){
1746
+ .reg_num = 33 ,
1747
+ .reg_byte = 4 ,
1748
+ .target_desc = TARGET_RV32 ,
1749
+ },
1750
+ "127.0.0.1:1234" )) {
1751
+ return ;
1752
+ }
1753
+
1754
+ if (!gdbstub_run (& rv -> gdbstub , (void * ) rv )) {
1755
+ return ;
1756
+ }
1757
+ gdbstub_close (& rv -> gdbstub );
1758
+ }
1759
+ #endif /* ENABLE_GDBRSP */
1760
+
1675
1761
void rv_step (struct riscv_t * rv , int32_t cycles )
1676
1762
{
1677
1763
assert (rv );
0 commit comments