diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/sbi/sbi_domain.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h index 3360e09..c8a6da9 100644 --- a/include/sbi/sbi_domain.h +++ b/include/sbi/sbi_domain.h @@ -164,6 +164,25 @@ struct sbi_domain_memregion { unsigned long flags; }; +/** Check if regionA is sub-region of regionB */ +static inline bool sbi_domain_memregion_is_subset( + const struct sbi_domain_memregion *regA, + const struct sbi_domain_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); + + if ((regB_start <= regA_start) && + (regA_start < regB_end) && + (regB_start < regA_end) && + (regA_end <= regB_end)) + return true; + + return false; +} + /** Representation of OpenSBI domain */ struct sbi_domain { /** Node in linked list of domains */ @@ -222,6 +241,9 @@ extern struct sbi_dlist domain_list; #define sbi_domain_for_each_memregion(__d, __r) \ for ((__r) = (__d)->regions; (__r)->order; (__r)++) +#define sbi_domain_for_each_memregion_idx(__d, __r, __i) \ + for ((__r) = (__d)->regions, (__i) = 0; (__r)->order; (__r)++, (__i)++) + /** * Check whether given HART is assigned to specified domain * @param dom pointer to domain |
