diff options
author | Anatoly Parshintsev <114445139+aap-sc@users.noreply.github.com> | 2024-09-03 11:07:31 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-03 11:07:31 +0300 |
commit | 22bbdd2a5e9388376c8097ac9ea0cbfede3680d6 (patch) | |
tree | f4221567b5468d86b90464b9c3d6a0f454e170ca | |
parent | 8ea44aa381a0a1ed7cada4ca8f86ef6a182b7c67 (diff) | |
parent | ebb8c057a673ba1e5baa8f6db7b74b3ee2318fae (diff) | |
download | riscv-openocd-22bbdd2a5e9388376c8097ac9ea0cbfede3680d6.zip riscv-openocd-22bbdd2a5e9388376c8097ac9ea0cbfede3680d6.tar.gz riscv-openocd-22bbdd2a5e9388376c8097ac9ea0cbfede3680d6.tar.bz2 |
Merge pull request #1109 from aap-sc/aap-sc/sbus_fixup
target/riscv: sys bus v1 fix for sizes greater than 4
-rw-r--r-- | src/target/riscv/riscv-013.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/target/riscv/riscv-013.c b/src/target/riscv/riscv-013.c index ad4fd9a..b214a6c 100644 --- a/src/target/riscv/riscv-013.c +++ b/src/target/riscv/riscv-013.c @@ -16,6 +16,7 @@ #include "target/target.h" #include "target/algorithm.h" #include "target/target_type.h" +#include <helper/align.h> #include <helper/log.h> #include "jtag/jtag.h" #include "target/register.h" @@ -3253,6 +3254,9 @@ static int read_memory_bus_v1(struct target *target, target_addr_t address, return ERROR_NOT_IMPLEMENTED; } + assert(size <= 16); + assert(IS_PWR_OF_2(size)); + dm013_info_t *dm = get_dm(target); if (!dm) return ERROR_FAIL; @@ -3288,7 +3292,6 @@ static int read_memory_bus_v1(struct target *target, target_addr_t address, * be unnecessary. */ uint32_t sbvalue[4] = {0}; - assert(size <= 16); for (uint32_t i = (next_address - address) / size; i < count - 1; i++) { const uint32_t size_in_words = DIV_ROUND_UP(size, 4); struct riscv_batch *batch = riscv_batch_alloc(target, size_in_words); @@ -3309,10 +3312,10 @@ static int read_memory_bus_v1(struct target *target, target_addr_t address, const size_t last_key = batch->read_keys_used - 1; for (size_t k = 0; k <= last_key; ++k) { - sbvalue[k] = riscv_batch_get_dmi_read_data(batch, - last_key - k); - buf_set_u32(buffer + i * size + k * 4, 0, 8 * size, sbvalue[k]); + sbvalue[k] = riscv_batch_get_dmi_read_data(batch, last_key - k); + buf_set_u32(buffer + i * size + k * 4, 0, MIN(32, 8 * size), sbvalue[k]); } + riscv_batch_free(batch); const target_addr_t read_addr = address + i * increment; log_memory_access(read_addr, sbvalue, size, true); |