[PATCH 06/18] dbtr: Improve trigger update error checking
Himanshu Chauhan
himanshu.chauhan at oss.qualcomm.com
Mon May 4 08:23:18 PDT 2026
On Fri, Mar 13, 2026 at 03:19:35PM +1000, Nicholas Piggin wrote:
> Trigger updates should ensure all triggers can be upated without failure
> before making any changes. Updates that change the trigger type must
> also be disallowed according to SBI specification.
>
> Change the style of shmem access and checking to match the trigger
> install code and perform all checks first. Add the missing check to
> prevent type change.
>
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
> ---
> lib/sbi/sbi_dbtr.c | 33 ++++++++++++++++++++++++++-------
> 1 file changed, 26 insertions(+), 7 deletions(-)
>
> diff --git a/lib/sbi/sbi_dbtr.c b/lib/sbi/sbi_dbtr.c
> index 224f2350..d2845fec 100644
> --- a/lib/sbi/sbi_dbtr.c
> +++ b/lib/sbi/sbi_dbtr.c
> @@ -727,9 +727,9 @@ int sbi_dbtr_enable_trig(unsigned long trig_idx_base,
> int sbi_dbtr_update_trig(unsigned long smode,
> unsigned long trig_count, unsigned long *out)
> {
> - unsigned long trig_idx;
> struct sbi_dbtr_trigger *trig;
> union sbi_dbtr_shmem_entry *entry;
> + struct sbi_dbtr_data_msg *recv;
> void *shmem_base = NULL;
> struct sbi_dbtr_hart_triggers_state *hs = NULL;
>
> @@ -744,30 +744,49 @@ int sbi_dbtr_update_trig(unsigned long smode,
> return SBI_ERR_NO_SHMEM;
>
> shmem_base = hart_shmem_base(hs);
> + sbi_hart_protection_map_range((unsigned long)shmem_base,
> + trig_count * sizeof(*entry));
Hi Nicholas,
I would suggest to verify the value of trig_count before making a large map entry.
It would also help in the two loops below.
>
> + /* Check requested triggers configuration */
> for_each_trig_entry(shmem_base, trig_count, typeof(*entry), entry) {
> - sbi_hart_protection_map_range((unsigned long)entry, sizeof(*entry));
> - trig_idx = entry->id.idx;
> + unsigned long trig_idx, tdata1;
>
> + trig_idx = entry->id.idx;
> if (trig_idx >= hs->total_trigs) {
> - sbi_hart_protection_unmap_range((unsigned long)entry, sizeof(*entry));
> *out = _idx;
> + sbi_hart_protection_unmap_range((unsigned long)shmem_base,
> + trig_count * sizeof(*entry));
A forward goto to bailout in success/error condition would be better.
Thanks
Regards
Himanshu
> return SBI_ERR_INVALID_PARAM;
> }
>
> trig = INDEX_TO_TRIGGER(trig_idx);
> -
> if (!(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED))) {
> - sbi_hart_protection_unmap_range((unsigned long)entry, sizeof(*entry));
> *out = _idx;
> + sbi_hart_protection_unmap_range((unsigned long)shmem_base,
> + trig_count * sizeof(*entry));
> return SBI_ERR_FAILED;
> }
>
> + recv = (struct sbi_dbtr_data_msg *)(&entry->data);
> + tdata1 = lle_to_cpu(recv->tdata1);
> + if (TDATA1_GET_TYPE(tdata1) != TDATA1_GET_TYPE(trig->tdata1)) {
> + *out = _idx;
> + sbi_hart_protection_unmap_range((unsigned long)shmem_base,
> + trig_count * sizeof(*entry));
> + return SBI_ERR_INVALID_PARAM;
> + }
> + }
> +
> + /* Update triggers */
> + for_each_trig_entry(shmem_base, trig_count, typeof(*entry), entry) {
> + trig = INDEX_TO_TRIGGER(entry->id.idx);
> dbtr_trigger_setup(trig, &entry->data);
> - sbi_hart_protection_unmap_range((unsigned long)entry, sizeof(*entry));
> dbtr_trigger_enable(trig);
> }
>
> + sbi_hart_protection_unmap_range((unsigned long)shmem_base,
> + trig_count * sizeof(*entry));
> +
> return SBI_SUCCESS;
> }
>
> --
> 2.51.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
More information about the opensbi
mailing list