aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatoly Parshintsev <114445139+aap-sc@users.noreply.github.com>2024-09-03 11:07:31 +0300
committerGitHub <noreply@github.com>2024-09-03 11:07:31 +0300
commit22bbdd2a5e9388376c8097ac9ea0cbfede3680d6 (patch)
treef4221567b5468d86b90464b9c3d6a0f454e170ca
parent8ea44aa381a0a1ed7cada4ca8f86ef6a182b7c67 (diff)
parentebb8c057a673ba1e5baa8f6db7b74b3ee2318fae (diff)
downloadriscv-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.c11
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);