7
31
Fork
You've already forked blackmagic
23

Feature: RV32I progbuf-based memory access support #2185

Merged
ALTracer merged 11 commits from ALTracer/feature/riscv32-progbuf-memory-rw into main 2026年04月13日 15:28:26 +02:00
ALTracer commented 2026年02月01日 13:20:52 +01:00 (Migrated from github.com)
Copy link

Detailed description

  • This is a new feature.
  • The existing problem is unreadable memory (RAM, flash, bus registers) on some 32-bit RISC-V microcontrollers, with SBA unimplemented and AAM unsupported.
  • The PR solves it by providing methods of reading and writing single elements 8/16/32-bit wide via progbuf postexec of AAR per RISC-V Debug Spec v0.13; no CSR access is needed.

Tested on BMDA and blackpill-f411ce against GD32VF103.
Initial version used DATA0 DM MMR access from progbuf, second version is GPR-only. This is 2x slower than AAM on GD32VF103 (which is implements), but Hart has 4 data registers and 2 progbuf registers so I intend to also implement the auto-incrementing snippets mentioned in Spec using abstractauto[0] (retrigger on DM DATA0 reads/writes).

Your checklist for this pull request

Closing issues

## Detailed description * This is a new feature. * The existing problem is unreadable memory (RAM, flash, bus registers) on some 32-bit RISC-V microcontrollers, with SBA unimplemented and AAM unsupported. * The PR solves it by providing methods of reading and writing single elements 8/16/32-bit wide via progbuf postexec of AAR per RISC-V Debug Spec v0.13; no CSR access is needed. Tested on BMDA and blackpill-f411ce against GD32VF103. Initial version used DATA0 DM MMR access from progbuf, second version is GPR-only. This is 2x slower than AAM on GD32VF103 (which is implements), but `Hart has 4 data registers and 2 progbuf registers` so I intend to also implement the auto-incrementing snippets mentioned in Spec using abstractauto[0] (retrigger on DM DATA0 reads/writes). ## Your checklist for this pull request * [x] I've read the [Code of Conduct](https://github.com/blackmagic-debug/blackmagic/blob/main/CODE_OF_CONDUCT.md) * [x] I've read the [guidelines for contributing](https://github.com/blackmagic-debug/blackmagic/blob/main/CONTRIBUTING.md) to this repository * [x] It builds for hardware native (see [Building the firmware](https://github.com/blackmagic-debug/blackmagic?tab=readme-ov-file#building-black-magic-debug-firmware)) * [x] It builds as BMDA (see [Building the BMDA](https://github.com/blackmagic-debug/blackmagic?tab=readme-ov-file#building-black-magic-debug-app)) * [x] I've tested it to the best of my ability * [x] My commit messages provide a useful short description of what the commits do ## Closing issues
dragonmux force-pushed ALTracer/feature/riscv32-progbuf-memory-rw from 03c45ada08 to 5e7da191dc
Some checks failed
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline failed
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline failed
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
2026年03月22日 21:32:15 +01:00
Compare
dragonmux force-pushed ALTracer/feature/riscv32-progbuf-memory-rw from 5e7da191dc
Some checks failed
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline failed
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline failed
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
to ade8a0ab6b
Some checks failed
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline failed
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline failed
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
2026年03月23日 21:23:29 +01:00
Compare
dragonmux force-pushed ALTracer/feature/riscv32-progbuf-memory-rw from ade8a0ab6b
Some checks failed
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline failed
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline failed
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
to caaaf24455
Some checks failed
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline failed
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline failed
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
2026年03月27日 23:16:44 +01:00
Compare
dragonmux force-pushed ALTracer/feature/riscv32-progbuf-memory-rw from caaaf24455
Some checks failed
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline failed
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline failed
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
to 984791fc4f
All checks were successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
2026年03月30日 00:13:56 +02:00
Compare
Contributor
Copy link

I did have a go at implementing linear reads using Autoexec on reading DM Data0, and it's 7x faster, but I don't think it should be part of this initial PR. It will use two progbuf slots, which is why I keep these here. Minimal possible (not viable) implementation of progbuf support in RISC-V can legally have one progbuf slot (or, rather, stuffing instructions directly into the processor pipeline) with impebreak, and ... the initial version is supposed to work with these, if only very slowly. I don't attempt to cache anything, it's a lot of accesses through debug transport, but on chips lacking SBA and AAM, progbuf actually becomes the only method to accessing memory (flash, SRAM, peripherals MMIO). Code size of both implementations shouldn't bloat BMF too much, debugger is supposed to support all three methods by the Debug Spec.

I did have a go at implementing linear reads using Autoexec on reading DM Data0, and it's 7x faster, but I don't think it should be part of this initial PR. It will use two progbuf slots, which is why I keep these here. Minimal possible (not viable) implementation of progbuf support in RISC-V can legally have one progbuf slot (or, rather, stuffing instructions directly into the processor pipeline) with impebreak, and ... the initial version is supposed to work with these, if only very slowly. I don't attempt to cache anything, it's a lot of accesses through debug transport, but on chips lacking SBA *and* AAM, progbuf actually becomes the only method to accessing memory (flash, SRAM, peripherals MMIO). Code size of both implementations shouldn't bloat BMF too much, debugger is supposed to support all three methods by the Debug Spec.
dragonmux force-pushed ALTracer/feature/riscv32-progbuf-memory-rw from 984791fc4f
All checks were successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
to 7f30f2c5b1
Some checks failed
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline failed
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
2026年04月06日 17:55:41 +02:00
Compare
dragonmux force-pushed ALTracer/feature/riscv32-progbuf-memory-rw from 7f30f2c5b1
Some checks failed
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline failed
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
to 0919223bd9
Some checks failed
ci/woodpecker/pr/build-firmware/8 Pipeline was successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline failed
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
2026年04月10日 20:44:03 +02:00
Compare
dragonmux left a comment
Copy link

Got a few notes - with them taken care of and one more round of review, think this is looking basically right for merging - good work!

Got a few notes - with them taken care of and one more round of review, think this is looking basically right for merging - good work!
@ -580,1 +580,4 @@
#define RV_DM_PROGBUF_BASE 0x20U
#define RV_GPR_A0 0x100aU

Please move this to the RISC-V debug header so it's not duplicated with the core architecture implementation

Please move this to the RISC-V debug header so it's not duplicated with the core architecture implementation
Contributor
Copy link

As I will need DM registers 0x20 and later 0x18, can I move them from riscv_debug.c? Otherwise I only minimally touch that file, only to hook mem_read functions.

diff --git a/src/target/riscv_debug.h b/src/target/riscv_debug.h
index 4aec5432..9c04cae2 100644
--- a/src/target/riscv_debug.h
+++ b/src/target/riscv_debug.h
@@ -181,6 +181,8 @@ typedef struct riscv_hart {
 #define RV_DM_DATA3 0x07U
 #define RV_DM_ABST_CTRLSTATUS 0x16U
 #define RV_DM_ABST_COMMAND 0x17U
+#define RV_DM_ABST_AUTO 0x18U
+#define RV_DM_PROGBUF_BASE 0x20U
 #define RV_DM_SYSBUS_CTRLSTATUS 0x38U
 #define RV_DM_SYSBUS_ADDR0 0x39U
 #define RV_DM_SYSBUS_ADDR1 0x3aU

There are 3 more DM registers mentioned in riscv_debug.c, but they come with bitfields, and I don't need them.

As I will need DM registers 0x20 and later 0x18, can I move them from `riscv_debug.c`? Otherwise I only minimally touch that file, only to hook mem_read functions. ```diff diff --git a/src/target/riscv_debug.h b/src/target/riscv_debug.h index 4aec5432..9c04cae2 100644 --- a/src/target/riscv_debug.h +++ b/src/target/riscv_debug.h @@ -181,6 +181,8 @@ typedef struct riscv_hart { #define RV_DM_DATA3 0x07U #define RV_DM_ABST_CTRLSTATUS 0x16U #define RV_DM_ABST_COMMAND 0x17U +#define RV_DM_ABST_AUTO 0x18U +#define RV_DM_PROGBUF_BASE 0x20U #define RV_DM_SYSBUS_CTRLSTATUS 0x38U #define RV_DM_SYSBUS_ADDR0 0x39U #define RV_DM_SYSBUS_ADDR1 0x3aU ``` There are 3 more DM registers mentioned in riscv_debug.c, but they come with bitfields, and I don't need them.

Yes, please do - that would be ideal.

Yes, please do - that would be ideal.
dragonmux marked this conversation as resolved
@ -581,0 +582,4 @@
#define RV_GPR_A0 0x100aU
#define RV_EBREAK 0x00100073U

Please move these #define's up to the top of the file so they're more easily discovered.

Please move these `#define`'s up to the top of the file so they're more easily discovered.
Contributor
Copy link

There should be no more #defines left if I move stuff to riscv_debug.h. Would you like me to remove the RV_EBREAK from riscv_debug.c:131? (between CSRR instructions and semihosting entry-exit NOPs)

There should be no more `#define`s left if I move stuff to riscv_debug.h. Would you like me to remove the RV_EBREAK from riscv_debug.c:131? (between CSRR instructions and semihosting entry-exit NOPs)

It would be best if the instruction is moved either to the top of the file, or.. if you expect it'll wind up used in other RISC-V contexts such as riscv64.c or riscv_debug.c, into the header.

It would be best if the instruction is moved either to the top of the file, or.. if you expect it'll wind up used in other RISC-V contexts such as riscv64.c or riscv_debug.c, into the header.
dragonmux marked this conversation as resolved
@ -581,0 +668,4 @@
riscv_csr_write(hart, RV_GPR_A0 + 1, &a1_save);
}
static void riscv32_progbuf_mem_write(

This function has essentially all the same notes as the read one above, so please consider all those notes as applying here too.

This function has essentially all the same notes as the read one above, so please consider all those notes as applying here too.
dragonmux marked this conversation as resolved
@ -581,0 +603,4 @@
static const uint32_t progbuf_read8[2] = {
0x00050583U, // lb a1, 0(a0)
0x00450513U, // addi a0, a0, 4
};

We would suggest moving the progbuf blocks here up out of the function - there's no particular reason to shield these static constant arrays from the rest of the implementation, but it does make discovering them more difficult. We greatly appreciate the comments defining what the encoded instructions are and mean though - that's greatly appreciated!

We would suggest moving the progbuf blocks here up out of the function - there's no particular reason to shield these static constant arrays from the rest of the implementation, but it does make discovering them more difficult. We greatly appreciate the comments defining what the encoded instructions are and mean though - that's greatly appreciated!
Contributor
Copy link

They were 4+1 slots long, I hoped to also use 8+1 slots initially, with content differing in multiple of instructions.
If the plan is to use 1+impebreak slot, then the arrays serve no purpose, in fact the second instructon in all 6 of them is identical. I would like to size-optimize the pointer to them, too (it can be a load from function-bottom literal constant pool). If I move them up, I would have to trust GCC to see they're only used once.

They were 4+1 slots long, I hoped to also use 8+1 slots initially, with content differing in multiple of instructions. If the plan is to use 1+impebreak slot, then the arrays serve no purpose, in fact the second instructon in all 6 of them is identical. I would like to size-optimize the pointer to them, too (it can be a load from function-bottom literal constant pool). If I move them up, I would have to trust GCC to see they're only used once.

For a variety of reasons, you're already having to trust GCC to notice that - where they're defined in the file won't make a codegen difference.

For a variety of reasons, you're already having to trust GCC to notice that - where they're defined in the file won't make a codegen difference.
dragonmux marked this conversation as resolved
@ -581,0 +619,4 @@
return;
}
/* Fill the program buffer */
if (!riscv_dm_write(hart->dbg_module, RV_DM_PROGBUF_BASE, progbuf_read[0]))

We note this doesn't use the second instruction in each of the above buffers - so no automatic address increment.. if this is intentional, perhaps drop the extra instruction from them? Otherwise please adjust this code to do the right thing.

We note this doesn't use the second instruction in each of the above buffers - so no automatic address increment.. if this is intentional, perhaps drop the extra instruction from them? Otherwise please adjust this code to do the right thing.
Contributor
Copy link

Auto increment is not guaranteed, as you say, by the Debug Spec some implementors could have omitted it. I can drop the extra instruction, bend over backwards and size-optimise this code; however it will be brought back in some form by the time of PR2225. If you intend to accept both, I don't see the benefit in undoing changes and then redoing it in the follow-up. I do see the benefit in shrinking the size-diff.

Auto increment is not guaranteed, as you say, by the Debug Spec some implementors could have omitted it. I can drop the extra instruction, bend over backwards and size-optimise this code; however it will be brought back in some form by the time of PR2225. If you intend to accept both, I don't see the benefit in undoing changes and then redoing it in the follow-up. I do see the benefit in shrinking the size-diff.

The benefit is in the evolutionary narative it creates in the commit history.. this doesn't use that functionality.. it writes one instruction into progbuf even though it guarantees at least 2 are available, it looks.. odd.. as it stands and thus our request. Removing the unused bits here and then introducing them in that other PR provides a more understandable evolution even though it might seem like more work.

The benefit is in the evolutionary narative it creates in the commit history.. this doesn't use that functionality.. it writes one instruction into progbuf even though it guarantees at least 2 are available, it looks.. odd.. as it stands and thus our request. Removing the unused bits here and then introducing them in that other PR provides a more understandable evolution even though it might seem like more work.
dragonmux marked this conversation as resolved
@ -581,0 +630,4 @@
uint32_t a0_save = 0;
uint32_t a1_save = 0;
riscv_csr_read(hart, RV_GPR_A0, &a0_save);
riscv_csr_read(hart, RV_GPR_A0 + 1, &a1_save);

We'd greatly prefer that this be RV_GPR_A1 so the assumption that they're next to each other isn't having to be made and the code says more what is intended, which isn't "the register after A0", but rather "the register A1".

We'd greatly prefer that this be `RV_GPR_A1` so the assumption that they're next to each other isn't having to be made and the code says more what is intended, which isn't "the register after A0", but rather "the register A1".
Contributor
Copy link

Accepted. The macro now exists in recently merged PR2115, but again in another TU. What is the strategy, extract them to riscv_debug.h? Or move all new progbuf-related code from riscv32.c to riscv_debug.c so that riscv64.c can potentially benefit from it? (that's a larger change than I'd like)

Accepted. The macro now exists in recently merged PR2115, but again in another TU. What is the strategy, extract them to riscv_debug.h? Or move all new progbuf-related code from riscv32.c to riscv_debug.c so that riscv64.c can potentially benefit from it? (that's a larger change than I'd like)

Extract to the header. we can do the swizzling needed to make the memory access primitives available on 64-bit RISC-V in a follow-up PR. There's a lot more work involved in that swizzle than just moving this new code.

Extract to the header. we can do the swizzling needed to make the memory access primitives available on 64-bit RISC-V in a follow-up PR. There's a lot more work involved in that swizzle than just moving this new code.
dragonmux marked this conversation as resolved
@ -581,0 +638,4 @@
if (!riscv_dm_write(hart->dbg_module, RV_DM_DATA0, src + offset))
return;
/* Copy the source address from DATA0 to GPR A0 and launch the progbuf postexec */
const uint32_t abstract_command1 = RV_DM_ABST_CMD_ACCESS_REG | RV_ABST_WRITE | RV_REG_XFER | RV_ABST_POSTEXEC |

Given this is made of only constants, please just inline it in the riscv_dm_write() call below - we're not gaining anything from it being a const-marked variable like this.

Given this is made of only constants, please just inline it in the `riscv_dm_write()` call below - we're not gaining anything from it being a const-marked variable like this.
Contributor
Copy link

The separate constant makes it more readable to me, the bitfield macros are very long and clang-format wants to soft-wrap them. I rely on the optimizing compiler to substitute the value, which is used only once. I can comply with the style used in the rest of functions calling riscv_dm_write(), but then it's harder for me to read the long argument and count the AAR modificators.

The separate constant makes it more readable to me, the bitfield macros are very long and clang-format wants to soft-wrap them. I rely on the optimizing compiler to substitute the value, which is used only once. I can comply with the style used in the rest of functions calling `riscv_dm_write()`, but then it's harder for me to read the long argument and count the AAR modificators.

Please follow the style of the rest of the code.. unless you were naming this something more meaningful, it's just creating noise for us to maintain, and inviting people to violate the exact promise you're wanting to rely on with the compiler.

Please follow the style of the rest of the code.. unless you were naming this something more meaningful, it's just creating noise for us to maintain, and inviting people to violate the exact promise you're wanting to rely on with the compiler.
dragonmux marked this conversation as resolved
@ -581,0 +645,4 @@
result &= riscv_command_wait_complete(hart);
if (!result)
return;
#if 1

Why is there conditional compilation here? What code path actually needs to be taken and why? Please clean up so we can review the right half of the branch.

Why is there conditional compilation here? What code path actually needs to be taken and why? Please clean up so we can review the right half of the branch.
Contributor
Copy link

I first wrote it as a manual {DM reg Abstract Command} manipulation, looking at how other BMD code uses it, and then noticed It's almost a duplicate of riscv_csr_read(). The intent was to do it all without CSR access and secondary progbuf manipulation, dirtying its contents -- GPR A1 to DATA0 is supposed to always work via AAR. In the optimal case I could trust that progbuf content stays preserved between adjacent mem_read() calls.
If I can trust that any logic complexity in riscv_csr_read() does not fire or mess with this operation, then I can just delegate to it and have less code to maintain. Especially if error handling ends up being the same.

I first wrote it as a manual {DM reg Abstract Command} manipulation, looking at how other BMD code uses it, and then noticed It's almost a duplicate of `riscv_csr_read()`. The intent was to do it all without CSR access and secondary progbuf manipulation, dirtying its contents -- GPR A1 to DATA0 is supposed to always work via AAR. In the optimal case I could trust that progbuf content stays preserved between adjacent mem_read() calls. If I can trust that any logic complexity in `riscv_csr_read()` does not fire or mess with this operation, then I can just delegate to it and have less code to maintain. Especially if error handling ends up being the same.

You're in 32-bit RISC-V land, none of the additonal complexity of the CSR function will fire. You're guaranteed a 32-bit access and thus the 64- and 128-bit checks fail.

You're in 32-bit RISC-V land, none of the additonal complexity of the CSR function will fire. You're guaranteed a 32-bit access and thus the 64- and 128-bit checks fail.
Contributor
Copy link

Flipping it to #if 0 and reading RV_CSR_A1 I now get a DEBUG_TARGET spam of Reading 32-bit CSR 100b. But otherwise correct compare-sections data. How do I suppress that? Demote to DEBUG_PROTO, which riscv32_mem_read uses and which I would like to see instead? That also spams with riscv_dmi_read.

Flipping it to `#if 0` and reading RV_CSR_A1 I now get a DEBUG_TARGET spam of `Reading 32-bit CSR 100b`. But otherwise correct `compare-sections` data. How do I suppress that? Demote to DEBUG_PROTO, which `riscv32_mem_read` uses and which I would like to see instead? That also spams with `riscv_dmi_read`.

You.. don't.. and that's not a problem - for now, let BMDA "spam" the console, and we'll look at improving the diagnostics around CSR reads too help make it less obnoxious. They're different PR concerns.

You.. don't.. and that's not a problem - for now, let BMDA "spam" the console, and we'll look at improving the diagnostics around CSR reads too help make it less obnoxious. They're different PR concerns.
dragonmux marked this conversation as resolved
@ -581,0 +727,4 @@
result &= riscv_command_wait_complete(hart);
if (!result)
return;
//riscv_csr_write(hart, RV_GPR_A0, dest + offset);

Given the CSR write in the block above is just this call, does it not make mroe sense to use the function that exists to do the write?

Given the CSR write in the block above is just this call, does it not make mroe sense to use the function that exists to do the write?
Contributor
Copy link

Yes. I wanted to make sure than any errors only happen from my newly added code, and not from existing other functions. I can likewise replace the boilerplate of first write with a single call.

Yes. I wanted to make sure than any errors only happen from my newly added code, and not from existing other functions. I can likewise replace the boilerplate of first write with a single call.
dragonmux marked this conversation as resolved
@ -581,0 +740,4 @@
result &= riscv_command_wait_complete(hart);
if (!result)
return;
//riscv_csr_write(hart, RV_GPR_A1, value);

Please drop this line - we know it needs postexec (progbuf) execution, so there's no point to having this be here.

Please drop this line - we know it needs postexec (progbuf) execution, so there's no point to having this be here.
Contributor
Copy link

Because of additional modifier I will drop the commented-out call (which I can't use because I need postexec). I will note that they all look very similar.

Because of additional modifier I will drop the commented-out call (which I can't use because I need postexec). I will note that they all *look* very similar.
dragonmux marked this conversation as resolved
@ -690,2 +690,4 @@
data_registers &= RV_DM_ABST_STATUS_DATA_COUNT;
DEBUG_INFO("Hart has %" PRIu32 " data registers and %u progbuf registers\n", data_registers, hart->progbuf_size);
/* Memory access using less than 2 progbuf slots is not supported yet */
if (hart->progbuf_size >= 2)

U on the end of the constant please.

`U` on the end of the constant please.
Contributor
Copy link

For 1 slot it should be >= 1U, and any autoincrement will be dealt with later.

For 1 slot it should be `>= 1U`, and any autoincrement will be dealt with later.
dragonmux marked this conversation as resolved
Contributor
Copy link

Minor plan check. The 6 instructions are sufficient for this PR to provide functionality as described. Should I extract them from 6 arrays into 6 distinct CPP macros? I had a vague idea of writing a helper instruction generator, relying on Unprivileged ISA spec -- ALU opcode would be Load or Store, and g-p reg arguments would be x10=a0 and x11=a1. However idk if it'll be useful anywhere else, or what code size will it have; and how to support compressed insn etc.
I know Cortex-A has a bunch of 32-bit instructions defined as macros, but also some instructions are composable via OR-ed bitfields without explicit helpers (no test coverage possible).

Minor plan check. The 6 instructions are sufficient for this PR to provide functionality as described. Should I extract them from 6 arrays into 6 distinct CPP macros? I had a vague idea of writing a helper instruction generator, relying on Unprivileged ISA spec -- ALU opcode would be Load or Store, and g-p reg arguments would be x10=a0 and x11=a1. However idk if it'll be useful anywhere else, or what code size will it have; and how to support compressed insn etc. I know Cortex-A has a bunch of 32-bit instructions defined as macros, but also some instructions are composable via OR-ed bitfields without explicit helpers (no test coverage possible).
dragonmux force-pushed ALTracer/feature/riscv32-progbuf-memory-rw from 0919223bd9
Some checks failed
ci/woodpecker/pr/build-firmware/8 Pipeline was successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline failed
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
to f119f67d59
Some checks failed
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline failed
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
2026年04月12日 19:39:58 +02:00
Compare
dragonmux requested changes 2026年04月12日 23:17:24 +02:00
Dismissed
dragonmux left a comment
Copy link

Couple of small things and then this will be ready for merge - this is coming along really nicely.

Couple of small things and then this will be ready for merge - this is coming along really nicely.
@ -578,6 +578,160 @@ static void riscv32_sysbus_mem_write(
riscv32_sysbus_mem_adjusted_write(hart, address, data, remainder, native_access_width, native_access_length);
}
#define RV_OPCODE 0x0000007fU

The same note as before applies to all these defines - please move them to the top of the file with the rest of them.

The same note as before applies to all these defines - please move them to the top of the file with the rest of them.
Contributor
Copy link

Moved relevant defines up (discarded unused defines), added a couple comments to them.

Moved relevant defines up (discarded unused defines), added a couple comments to them.
dragonmux marked this conversation as resolved
@ -581,0 +639,4 @@
if (!riscv_dm_write(hart->dbg_module, RV_DM_PROGBUF_BASE, progbuf_read))
return;
/* Append literal ebreak (if impebreak is not reached) */
if (hart->progbuf_size > 1) {

U on the end of this and the next line's constant please.

`U` on the end of this and the next line's constant please.
Contributor
Copy link

Applied four s/1/1U/ as fixup+rebase.

Applied four `s/1/1U/` as fixup+rebase.
dragonmux marked this conversation as resolved
@ -581,0 +698,4 @@
if (!riscv_dm_write(hart->dbg_module, RV_DM_PROGBUF_BASE, progbuf_write))
return;
/* Append literal ebreak (if impebreak is not reached) */
if (hart->progbuf_size > 1) {

Ditto here.

Ditto here.
dragonmux marked this conversation as resolved

The 6 instructions are sufficient for this PR to provide functionality as described. Should I extract them from 6 arrays into 6 distinct CPP macros? I had a vague idea of writing a helper instruction generator, relying on Unprivileged ISA spec

6 macros and the selection logic will work fine for now - turning that into some kind of helper function that writes the progbuf registers with the program based on how many slots are available and such can be a follow-up done to improve performance and instruction density.. the only notes we made in the most recent review are the only things that need any adjustment for this to be mergable as we see it. Everything else is incremental improvements land.

> The 6 instructions are sufficient for this PR to provide functionality as described. Should I extract them from 6 arrays into 6 distinct CPP macros? I had a vague idea of writing a helper instruction generator, relying on Unprivileged ISA spec 6 macros and the selection logic will work fine for now - turning that into some kind of helper function that writes the progbuf registers with the program based on how many slots are available and such can be a follow-up done to improve performance and instruction density.. the only notes we made in the most recent review are the only things that need any adjustment for this to be mergable as we see it. Everything else is incremental improvements land.
dragonmux force-pushed ALTracer/feature/riscv32-progbuf-memory-rw from f119f67d59
Some checks failed
ci/woodpecker/pr/build-firmware/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/6 Pipeline was successful
ci/woodpecker/pr/build-firmware/5 Pipeline was successful
ci/woodpecker/pr/build-firmware/3 Pipeline was successful
ci/woodpecker/pr/build-firmware/2 Pipeline was successful
ci/woodpecker/pr/build-firmware/7 Pipeline was successful
ci/woodpecker/pr/build-firmware/4 Pipeline was successful
ci/woodpecker/pr/build-firmware/8 Pipeline was successful
ci/woodpecker/pr/build-firmware/10 Pipeline was successful
ci/woodpecker/pr/build-firmware/9 Pipeline was successful
ci/woodpecker/pr/build-firmware/12 Pipeline was successful
ci/woodpecker/pr/build-firmware/14 Pipeline was successful
ci/woodpecker/pr/build-firmware/13 Pipeline was successful
ci/woodpecker/pr/build-firmware/11 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-firmware/18 Pipeline failed
ci/woodpecker/pr/build-firmware/17 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
to a523f16a11
Some checks failed
ci/woodpecker/pr/build-firmware/16 Pipeline was successful
ci/woodpecker/pr/build-firmware/19 Pipeline was successful
ci/woodpecker/pr/build-firmware/20 Pipeline was successful
ci/woodpecker/pr/build-firmware/15 Pipeline was successful
ci/woodpecker/pr/build-linux/1 Pipeline was successful
ci/woodpecker/pr/build-windows Pipeline was successful
ci/woodpecker/pr/build-linux/2 Pipeline was successful
ci/woodpecker/push/build-firmware/5 Pipeline was successful
ci/woodpecker/push/build-firmware/1 Pipeline was successful
ci/woodpecker/push/build-firmware/3 Pipeline was successful
ci/woodpecker/push/build-firmware/4 Pipeline was successful
ci/woodpecker/push/build-firmware/2 Pipeline was successful
ci/woodpecker/push/build-firmware/8 Pipeline was successful
ci/woodpecker/push/build-firmware/9 Pipeline was successful
ci/woodpecker/push/build-firmware/10 Pipeline was successful
ci/woodpecker/push/build-firmware/6 Pipeline was successful
ci/woodpecker/push/build-firmware/7 Pipeline was successful
ci/woodpecker/push/build-firmware/11 Pipeline was successful
ci/woodpecker/push/build-firmware/14 Pipeline was successful
ci/woodpecker/push/build-firmware/15 Pipeline was successful
ci/woodpecker/push/build-firmware/17 Pipeline was successful
ci/woodpecker/push/build-firmware/16 Pipeline was successful
ci/woodpecker/push/build-firmware/12 Pipeline was successful
ci/woodpecker/push/build-firmware/13 Pipeline was successful
ci/woodpecker/push/build-firmware/18 Pipeline failed
ci/woodpecker/push/build-linux/1 Pipeline was successful
ci/woodpecker/push/build-firmware/19 Pipeline was successful
ci/woodpecker/push/build-firmware/20 Pipeline was successful
ci/woodpecker/push/build-linux/2 Pipeline was successful
ci/woodpecker/push/build-windows Pipeline was successful
2026年04月13日 15:21:47 +02:00
Compare
dragonmux left a comment
Copy link

LGTM, merging. Thank you for the contribution!

LGTM, merging. Thank you for the contribution!
dragonmux deleted branch ALTracer/feature/riscv32-progbuf-memory-rw 2026年04月13日 15:28:27 +02:00
Sign in to join this conversation.
No reviewers
Labels
Clear labels
BMD App
Black Magic Debug App (aka. PC hosted) (not firmware)
BMP Firmware
Black Magic Probe Firmware (not PC hosted software)
Bug
Confirmed bug
Build system
Build system
Can't reproduce
Maintainers can't reproduce this problem
CI
Continuous Integration System
Contribution wanted
User contributions welcome
Documentation
Project documentation
Draft
Work in progress draft
Duplicate
This issue or pull request already exists
Enhancement
General project improvement
Feedback wanted
Requires additional submitter feedback
Foreign Host Board
Non Native hardware to runing Black Magic firmware on
GDB
Issue/PR related to GDB
Good first issue
Good for newcommers
HwIssue Mitigation
Solving or mitigating a Hardware issue in Software
Information Needed
Maintainers need more information
NativeHardware
Official Black Magic Debug Hardware
New Host Board
New hardware to run Black Magic firmware on
New Target
New debug target
Off Topic
Something that does not involve the project in any way
Potential Bug
A potential, unconfirmed or very special circumstance bug
Regression
Bug caused by a regression
User Interest Needed
More user interest required before consideration
User Testing Needed
Looking for user testing reports
Won't fix
Outside of the project scope or works as intended
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
blackmagic-debug/blackmagic!2185
Reference in a new issue
blackmagic-debug/blackmagic
No description provided.
Delete branch "ALTracer/feature/riscv32-progbuf-memory-rw"

Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?