Skip to contentSkip to conversation

lib: sbi: dbtr: Fix update_triggers to match SBI

PATCH Applied Jesse Taube 4 participants 4 messages May 28, 2025 – Jun 16, 2025

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 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")
---
 include/sbi/sbi_dbtr.h   |  3 +--
 lib/sbi/sbi_dbtr.c       | 33 ++++++++++++++++++++-------------
 lib/sbi/sbi_ecall_dbtr.c |  2 +-
 3 files changed, 22 insertions(+), 16 deletions(-)
include/sbi/sbi_dbtr.h +1 -2
index 8cb776c..b1cfb5b 100644
@@ -117,8 +117,7 @@ int sbi_dbtr_uninstall_trig(unsigned long trig_idx_base,
 int sbi_dbtr_enable_trig(unsigned long trig_idx_base,
 			 unsigned long trig_idx_mask);
 int sbi_dbtr_update_trig(unsigned long smode,
-			 unsigned long trig_idx_base,
-			 unsigned long trig_idx_mask);
+			 unsigned long trig_count);
 int sbi_dbtr_disable_trig(unsigned long trig_idx_base,
 			  unsigned long trig_idx_mask);
 
lib/sbi/sbi_dbtr.c +20 -13
index f0e9128..1248634 100644
@@ -651,13 +651,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;
 	struct sbi_dbtr_shmem_entry *entry;
 	void *shmem_base = NULL;
@@ -672,18 +668,29 @@ 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->state & RV_DBTR_BIT_MASK(TS, MAPPED)))
+	if (trig_count >= hs->total_trigs)
+		return SBI_ERR_BAD_RANGE;
+
+	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;
+		}
 
-		entry = (shmem_base + uidx * sizeof(*entry));
-		recv = &entry->data;
+		trig = INDEX_TO_TRIGGER(trig_idx);
 
-		trig->tdata2 = lle_to_cpu(recv->tdata2);
+		if (!(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED))) {
+			sbi_hart_unmap_saddr();
+			return SBI_ERR_FAILED;
+		}
+
+		dbtr_trigger_setup(trig, &entry->data);
+		sbi_hart_unmap_saddr();
 		dbtr_trigger_enable(trig);
-		uidx++;
 	}
 
 	return SBI_SUCCESS;
lib/sbi/sbi_ecall_dbtr.c +1 -1
index 9c496c4..40a437e 100644
@@ -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);
Signature · 7 lines
2.43.0


-- 
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi
Tested-by Reviewed-by on v1 1/1
#1 lore raw
Quoted 6 lines · Jesse Taube

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)

Quoted 6 lines

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")
Quoted 93 lines
---
 include/sbi/sbi_dbtr.h   |  3 +--
 lib/sbi/sbi_dbtr.c       | 33 ++++++++++++++++++++-------------
 lib/sbi/sbi_ecall_dbtr.c |  2 +-
 3 files changed, 22 insertions(+), 16 deletions(-)
include/sbi/sbi_dbtr.h +1 -2
index 8cb776c..b1cfb5b 100644
@@ -117,8 +117,7 @@ int sbi_dbtr_uninstall_trig(unsigned long trig_idx_base,
 int sbi_dbtr_enable_trig(unsigned long trig_idx_base,
 			 unsigned long trig_idx_mask);
 int sbi_dbtr_update_trig(unsigned long smode,
-			 unsigned long trig_idx_base,
-			 unsigned long trig_idx_mask);
+			 unsigned long trig_count);
 int sbi_dbtr_disable_trig(unsigned long trig_idx_base,
 			  unsigned long trig_idx_mask);
 
lib/sbi/sbi_dbtr.c +20 -13
index f0e9128..1248634 100644
@@ -651,13 +651,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;
 	struct sbi_dbtr_shmem_entry *entry;
 	void *shmem_base = NULL;
@@ -672,18 +668,29 @@ 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->state & RV_DBTR_BIT_MASK(TS, MAPPED)))
+	if (trig_count >= hs->total_trigs)
+		return SBI_ERR_BAD_RANGE;
+
+	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;
+		}
 
-		entry = (shmem_base + uidx * sizeof(*entry));
-		recv = &entry->data;
+		trig = INDEX_TO_TRIGGER(trig_idx);
 
-		trig->tdata2 = lle_to_cpu(recv->tdata2);
+		if (!(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED))) {
+			sbi_hart_unmap_saddr();
+			return SBI_ERR_FAILED;
+		}
+
+		dbtr_trigger_setup(trig, &entry->data);
+		sbi_hart_unmap_saddr();
 		dbtr_trigger_enable(trig);
-		uidx++;
 	}
 
 	return SBI_SUCCESS;
lib/sbi/sbi_ecall_dbtr.c +1 -1
index 9c496c4..40a437e 100644
@@ -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);
Signature · 1 line
2.43.0
Signature · 3 lines
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi
Reviewed-by on v1 1/1
#2 lore raw
In reply to Jesse Taube
Quoted 6 lines · Jesse Taube

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)

Quoted 6 lines

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")
Quoted 90 lines
---
  include/sbi/sbi_dbtr.h   |  3 +--
  lib/sbi/sbi_dbtr.c       | 33 ++++++++++++++++++++-------------
  lib/sbi/sbi_ecall_dbtr.c |  2 +-
  3 files changed, 22 insertions(+), 16 deletions(-)
include/sbi/sbi_dbtr.h +1 -2
index 8cb776c..b1cfb5b 100644
@@ -117,8 +117,7 @@ int sbi_dbtr_uninstall_trig(unsigned long trig_idx_base,
  int sbi_dbtr_enable_trig(unsigned long trig_idx_base,
  			 unsigned long trig_idx_mask);
  int sbi_dbtr_update_trig(unsigned long smode,
-			 unsigned long trig_idx_base,
-			 unsigned long trig_idx_mask);
+			 unsigned long trig_count);
  int sbi_dbtr_disable_trig(unsigned long trig_idx_base,
  			  unsigned long trig_idx_mask);
 
lib/sbi/sbi_dbtr.c +20 -13
index f0e9128..1248634 100644
@@ -651,13 +651,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;
  	struct sbi_dbtr_shmem_entry *entry;
  	void *shmem_base = NULL;
@@ -672,18 +668,29 @@ 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->state & RV_DBTR_BIT_MASK(TS, MAPPED)))
+	if (trig_count >= hs->total_trigs)
+		return SBI_ERR_BAD_RANGE;
+
+	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;
+		}
 
-		entry = (shmem_base + uidx * sizeof(*entry));
-		recv = &entry->data;
+		trig = INDEX_TO_TRIGGER(trig_idx);
 
-		trig->tdata2 = lle_to_cpu(recv->tdata2);
+		if (!(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED))) {
+			sbi_hart_unmap_saddr();
+			return SBI_ERR_FAILED;
+		}
+
+		dbtr_trigger_setup(trig, &entry->data);
+		sbi_hart_unmap_saddr();
  		dbtr_trigger_enable(trig);
-		uidx++;
  	}
 
  	return SBI_SUCCESS;
lib/sbi/sbi_ecall_dbtr.c +1 -1
index 9c496c4..40a437e 100644
@@ -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);
Signature · 3 lines
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi
Applied
#3 lore raw
In reply to Jesse Taube
Quoted 7 lines · Jesse Taube

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)

Quoted 6 lines

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")

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

Quoted 93 lines
---
 include/sbi/sbi_dbtr.h   |  3 +--
 lib/sbi/sbi_dbtr.c       | 33 ++++++++++++++++++++-------------
 lib/sbi/sbi_ecall_dbtr.c |  2 +-
 3 files changed, 22 insertions(+), 16 deletions(-)
include/sbi/sbi_dbtr.h +1 -2
index 8cb776c..b1cfb5b 100644
@@ -117,8 +117,7 @@ int sbi_dbtr_uninstall_trig(unsigned long trig_idx_base,
 int sbi_dbtr_enable_trig(unsigned long trig_idx_base,
                         unsigned long trig_idx_mask);
 int sbi_dbtr_update_trig(unsigned long smode,
-                        unsigned long trig_idx_base,
-                        unsigned long trig_idx_mask);
+                        unsigned long trig_count);
 int sbi_dbtr_disable_trig(unsigned long trig_idx_base,
                          unsigned long trig_idx_mask);
 
lib/sbi/sbi_dbtr.c +20 -13
index f0e9128..1248634 100644
@@ -651,13 +651,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;
        struct sbi_dbtr_shmem_entry *entry;
        void *shmem_base = NULL;
@@ -672,18 +668,29 @@ 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->state & RV_DBTR_BIT_MASK(TS, MAPPED)))
+       if (trig_count >= hs->total_trigs)
+               return SBI_ERR_BAD_RANGE;
+
+       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;
+               }
 
-               entry = (shmem_base + uidx * sizeof(*entry));
-               recv = &entry->data;
+               trig = INDEX_TO_TRIGGER(trig_idx);
 
-               trig->tdata2 = lle_to_cpu(recv->tdata2);
+               if (!(trig->state & RV_DBTR_BIT_MASK(TS, MAPPED))) {
+                       sbi_hart_unmap_saddr();
+                       return SBI_ERR_FAILED;
+               }
+
+               dbtr_trigger_setup(trig, &entry->data);
+               sbi_hart_unmap_saddr();
                dbtr_trigger_enable(trig);
-               uidx++;
        }
 
        return SBI_SUCCESS;
lib/sbi/sbi_ecall_dbtr.c +1 -2
index 9c496c4..40a437e 100644
@@ -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);
--

2.43.0

Signature · 3 lines
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi