Commit 57e19f05 authored by Ackerley Tng's avatar Ackerley Tng Committed by Sean Christopherson
Browse files

KVM: selftests: Add a macro to iterate over a sparsebit range



Add sparsebit_for_each_set_range() to allow iterator over a range of set
bits in a range.  This will be used by x86 SEV guests to process protected
physical pages (each such page needs to be encrypted _after_ being "added"
to the VM).

Tested-by: default avatarCarlos Bilbao <carlos.bilbao@amd.com>
Signed-off-by: default avatarAckerley Tng <ackerleytng@google.com>
[sean: split to separate patch]
Link: https://lore.kernel.org/r/20240223004258.3104051-4-seanjc@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent 35f50c91
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -66,6 +66,26 @@ void sparsebit_dump(FILE *stream, const struct sparsebit *sbit,
		    unsigned int indent);
void sparsebit_validate_internal(const struct sparsebit *sbit);

/*
 * Iterate over an inclusive ranges within sparsebit @s. In each iteration,
 * @range_begin and @range_end will take the beginning and end of the set
 * range, which are of type sparsebit_idx_t.
 *
 * For example, if the range [3, 7] (inclusive) is set, within the
 * iteration,@range_begin will take the value 3 and @range_end will take
 * the value 7.
 *
 * Ensure that there is at least one bit set before using this macro with
 * sparsebit_any_set(), because sparsebit_first_set() will abort if none
 * are set.
 */
#define sparsebit_for_each_set_range(s, range_begin, range_end)         \
	for (range_begin = sparsebit_first_set(s),                      \
	     range_end = sparsebit_next_clear(s, range_begin) - 1;	\
	     range_begin && range_end;                                  \
	     range_begin = sparsebit_next_set(s, range_end),            \
	     range_end = sparsebit_next_clear(s, range_begin) - 1)

#ifdef __cplusplus
}
#endif