[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v2 1/8] include/plat: Helpers for iterating over memory regions
Introduces two helpers for iterating over memory region descriptors: - One helper to find a memory region from a given starting point that fulfill given flags - A `foreach` macro to iterate over regions that fulfill given flags Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> --- include/uk/plat/memory.h | 49 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/include/uk/plat/memory.h b/include/uk/plat/memory.h index 60e52e6d..51b1b234 100644 --- a/include/uk/plat/memory.h +++ b/include/uk/plat/memory.h @@ -78,6 +78,55 @@ int ukplat_memregion_count(void); */ int ukplat_memregion_get(int i, struct ukplat_memregion_desc *mrd); +/** + * Searches for the next memory region after `i` that has at least `sflags` + * flags set. + * @param i Memory region number to start searching + * To start searching from the beginning, set `i` to `-1` + * @param sflags Find only memory regions that have at least `sflags` flags set. + * If no flags are given (`0x0`), any found region is returned + * @Param mrd Pointer to memory region descriptor that will be filled out + * @return On success the function returns the next region number after `i` + * that fulfills `sflags`. `mrd` is filled out with the memory region + * details. A value < 0 is returned if no more region could be found + * that fulfills the search criteria. `mrd` may be filled out with + * undefined values. + */ +static inline int ukplat_memregion_find_next(int i, int sflags, + struct ukplat_memregion_desc *mrd) +{ + int rc, count; + + count = ukplat_memregion_count(); + + if (i >= count) + return -1; + + do + rc = ukplat_memregion_get(++i, mrd); + while (i < count && (rc < 0 || ((mrd->flags & sflags) != sflags))); + + if (i == count) + return -1; + return i; +} + +/** + * Iterates over all memory regions that have at least `sflags` flags set. + * @param mrd Pointer to memory region descriptor that will be filled out + * during iteration + * @param sflags Iterate only over memory regions that have at least `sflags` + * flags set. If no flags are given (`0x0`), every existing region is + * iterated. + */ +#define ukplat_memregion_foreach(mrd, sflags) \ + for (int __ukplat_memregion_foreach_i \ + = ukplat_memregion_find_next(-1, (sflags), (mrd)); \ + __ukplat_memregion_foreach_i >= 0; \ + __ukplat_memregion_foreach_i \ + = ukplat_memregion_find_next(__ukplat_memregion_foreach_i,\ + (sflags), (mrd))) + /** * Sets the platform memory allocator and triggers the platform memory mappings * for which an allocator is needed. -- 2.20.1 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |