These will soon gain a couple of users. Signed-off-by: Emilio G. Cota <c...@braap.org> --- accel/tcg/translate-all.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c index 8f6f8f1..396c10c 100644 --- a/accel/tcg/translate-all.c +++ b/accel/tcg/translate-all.c @@ -115,6 +115,25 @@ typedef struct PageDesc { #endif } PageDesc; +/* list iterators for lists of tagged pointers in TranslationBlock */ +#define tb_for_each_tagged(head, tb, n, field) \ + for (n = (head) & 1, \ + tb = (TranslationBlock *)((head) & ~1); \ + tb; \ + tb = (TranslationBlock *)tb->field[n], \ + n = (uintptr_t)tb & 1, \ + tb = (TranslationBlock *)((uintptr_t)tb & ~1)) + +/* prev is a *uintptr_t. It allows us to safely remove tb */ +#define tb_for_each_tagged_safe(head, tb, n, field, prev) \ + for (prev = &(head), \ + n = *prev & 1, \ + tb = (TranslationBlock *)(*prev & ~1); \ + tb; \ + prev = &tb->field[n], \ + n = (uintptr_t)*prev & 1, \ + tb = (TranslationBlock *)(*prev & ~1)) + /* In system mode we want L1_MAP to be based on ram offsets, while in user mode we want it to be based on virtual addresses. */ #if !defined(CONFIG_USER_ONLY) -- 2.7.4