diff options
| author | Jesse Taube <[email protected]> | 2025-05-28 08:46:04 -0700 |
|---|---|---|
| committer | Anup Patel <[email protected]> | 2025-06-16 17:01:52 +0530 |
| commit | 324021423d063702a5cb2d4207a3a9c4e999549f (patch) | |
| tree | 661829a1c149a748f912383f8fa835063e36e419 /lib | |
| parent | 03f44e6b82a4debd0e5a3a67cf7f2da9f4a7dfca (diff) | |
lib: sbi: dbtr: Fix update_triggers to match SBI
OpenSBI implements sbi_dbtr_update_trig as
`sbi_dbtr_update_trig(unsigned long trig_idx_base,
unsigned long trig_idx_mask)`
yet SBI v3.0-rc7 Chapter 19. Debug Triggers Extension [0] declares it as
`sbi_debug_update_triggers(unsigned long trig_count)`
Change update_triggers to match SBI.
[0] https://github.com/riscv-non-isa/riscv-sbi-doc/tree/v3.0-rc7/src/ext-debug-triggers.adoc
Fixes: 97f234f15c96 ("lib: sbi: Introduce the SBI debug triggers extension support")
Signed-off-by: Jesse Taube <[email protected]>
Reviewed-by: Himanshu Chauhan <[email protected]>
Tested-by: Charlie Jenkins <[email protected]>
Reviewed-by: Charlie Jenkins <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Anup Patel <[email protected]>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sbi/sbi_dbtr.c | 32 | ||||
| -rw-r--r-- | lib/sbi/sbi_ecall_dbtr.c | 2 |
2 files changed, 20 insertions, 14 deletions
diff --git a/lib/sbi/sbi_dbtr.c b/lib/sbi/sbi_dbtr.c index 797cf256..a832c7f1 100644 --- a/lib/sbi/sbi_dbtr.c +++ b/lib/sbi/sbi_dbtr.c @@ -652,13 +652,9 @@ int sbi_dbtr_enable_trig(unsigned long trig_idx_base, } int sbi_dbtr_update_trig(unsigned long smode, - unsigned long trig_idx_base, - unsigned long trig_idx_mask) + unsigned long trig_count) { - unsigned long trig_mask = trig_idx_mask << trig_idx_base; - unsigned long idx = trig_idx_base; - struct sbi_dbtr_data_msg *recv; - unsigned long uidx = 0; + unsigned long trig_idx; struct sbi_dbtr_trigger *trig; union sbi_dbtr_shmem_entry *entry; void *shmem_base = NULL; @@ -673,18 +669,28 @@ int sbi_dbtr_update_trig(unsigned long smode, shmem_base = hart_shmem_base(hs); - for_each_set_bit_from(idx, &trig_mask, hs->total_trigs) { - trig = INDEX_TO_TRIGGER(idx); + if (trig_count >= hs->total_trigs) + return SBI_ERR_BAD_RANGE; - if (!(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED))) + for_each_trig_entry(shmem_base, trig_count, typeof(*entry), entry) { + sbi_hart_map_saddr((unsigned long)entry, sizeof(*entry)); + trig_idx = entry->id.idx; + + if (trig_idx >= hs->total_trigs) { + sbi_hart_unmap_saddr(); return SBI_ERR_INVALID_PARAM; + } + + trig = INDEX_TO_TRIGGER(trig_idx); - entry = (shmem_base + uidx * sizeof(*entry)); - recv = &entry->data; + if (!(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED))) { + sbi_hart_unmap_saddr(); + return SBI_ERR_FAILED; + } - trig->tdata2 = lle_to_cpu(recv->tdata2); + dbtr_trigger_setup(trig, &entry->data); + sbi_hart_unmap_saddr(); dbtr_trigger_enable(trig); - uidx++; } return SBI_SUCCESS; diff --git a/lib/sbi/sbi_ecall_dbtr.c b/lib/sbi/sbi_ecall_dbtr.c index 9c496c42..40a437ee 100644 --- a/lib/sbi/sbi_ecall_dbtr.c +++ b/lib/sbi/sbi_ecall_dbtr.c @@ -43,7 +43,7 @@ static int sbi_ecall_dbtr_handler(unsigned long extid, unsigned long funcid, ret = sbi_dbtr_enable_trig(regs->a0, regs->a1); break; case SBI_EXT_DBTR_TRIGGER_UPDATE: - ret = sbi_dbtr_update_trig(smode, regs->a0, regs->a1); + ret = sbi_dbtr_update_trig(smode, regs->a0); break; case SBI_EXT_DBTR_TRIGGER_DISABLE: ret = sbi_dbtr_disable_trig(regs->a0, regs->a1); |
