[PATCH 4/8] lib: sbi: memregion: Introduce memregion_start/end macros

Gregor Haas gregorhaas1997 at gmail.com
Wed Jul 31 11:16:25 PDT 2024


Various disparate parts of the memregion handling code calculate the base and
bounds of memregions. Standardize these calculations into two new macros:
memregion_start() and memregion_end(). This will reduce the amount of code
changes later, when we make memregions keep track of raw sizes rather than
rounded orders.
---
 include/sbi/sbi_memregion.h |  6 ++++++
 lib/sbi/sbi_memregion.c     | 23 ++++++++++-------------
 2 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/include/sbi/sbi_memregion.h b/include/sbi/sbi_memregion.h
index 0aa9a44..6e1b771 100644
--- a/include/sbi/sbi_memregion.h
+++ b/include/sbi/sbi_memregion.h
@@ -145,6 +145,12 @@ struct sbi_memregion {
 	unsigned long flags;
 };
 
+#define memregion_start(reg) \
+	((reg)->base)
+
+#define memregion_end(reg) \
+	((reg)->order < __riscv_xlen) ? \
+	      (reg)->base + ((1UL << (reg)->order) - 1) : -1UL;
 /**
  * Initialize a domain memory region based on it's physical
  * address and size.
diff --git a/lib/sbi/sbi_memregion.c b/lib/sbi/sbi_memregion.c
index 4abd20a..8978793 100644
--- a/lib/sbi/sbi_memregion.c
+++ b/lib/sbi/sbi_memregion.c
@@ -37,10 +37,10 @@ void sbi_memregion_init(unsigned long addr,
 static bool is_region_subset(const struct sbi_memregion *regA,
 			     const struct sbi_memregion *regB)
 {
-	ulong regA_start = regA->base;
-	ulong regA_end = regA->base + (BIT(regA->order) - 1);
-	ulong regB_start = regB->base;
-	ulong regB_end = regB->base + (BIT(regB->order) - 1);
+	ulong regA_start = memregion_start(regA);
+	ulong regA_end = memregion_end(regA);
+	ulong regB_start = memregion_start(regB);
+	ulong regB_end = memregion_end(regB);
 
 	if ((regB_start <= regA_start) &&
 	    (regA_start < regB_end) &&
@@ -217,9 +217,8 @@ bool sbi_domain_check_addr(const struct sbi_domain *dom,
 					(rflags & SBI_MEMREGION_SU_ACCESS_MASK)
 						>> SBI_MEMREGION_SU_ACCESS_SHIFT);
 
-		rstart = reg->base;
-		rend = (reg->order < __riscv_xlen) ?
-						     rstart + ((1UL << reg->order) - 1) : -1UL;
+		rstart = memregion_start(reg);
+		rend = memregion_end(reg);
 		if (rstart <= addr && addr <= rend) {
 			rmmio = (rflags & SBI_MEMREGION_MMIO) ? true : false;
 			if (mmio != rmmio)
@@ -239,9 +238,8 @@ static const struct sbi_memregion *find_region(
 	struct sbi_memregion *reg;
 
 	sbi_domain_for_each_memregion(dom, reg) {
-		rstart = reg->base;
-		rend = (reg->order < __riscv_xlen) ?
-						     rstart + ((1UL << reg->order) - 1) : -1UL;
+		rstart = memregion_start(reg);
+		rend = memregion_end(reg);
 		if (rstart <= addr && addr <= rend)
 			return reg;
 	}
@@ -307,9 +305,8 @@ void sbi_domain_dump_memregions(const struct sbi_domain *dom, const char *suffix
 	int i = 0, k;
 
 	sbi_domain_for_each_memregion(dom, reg) {
-		rstart = reg->base;
-		rend = (reg->order < __riscv_xlen) ?
-		        rstart + ((1UL << reg->order) - 1) : -1UL;
+		rstart = memregion_start(reg);
+		rend = memregion_end(reg);
 
 		sbi_printf("Domain%d Region%02d    %s: 0x%" PRILX "-0x%" PRILX " ",
 			   dom->index, i, suffix, rstart, rend);
-- 
2.45.2




More information about the opensbi mailing list