Commit f9c5b66f authored by Sergey Fedorov's avatar Sergey Fedorov Committed by Richard Henderson
Browse files

tcg: Clean up tb_jmp_unlink()



Unify the code of this function with tb_jmp_remove_from_list(). Making
these functions similar improves their readability. Also this could be a
step towards making this function thread-safe.

Signed-off-by: default avatarSergey Fedorov <serge.fdrv@gmail.com>
Signed-off-by: default avatarSergey Fedorov <sergey.fedorov@linaro.org>
Reviewed-by: default avatarAlex Bennée <alex.bennee@linaro.org>
Signed-off-by: default avatarRichard Henderson <rth@twiddle.net>
parent 89bba496
Loading
Loading
Loading
Loading
+9 −12
Original line number Diff line number Diff line
@@ -965,25 +965,22 @@ static inline void tb_reset_jump(TranslationBlock *tb, int n)
/* remove any jumps to the TB */
static inline void tb_jmp_unlink(TranslationBlock *tb)
{
    uintptr_t tb1, tb2;
    TranslationBlock *tb1;
    uintptr_t *ptb, ntb;
    unsigned int n1;

    tb1 = tb->jmp_list_first;
    ptb = &tb->jmp_list_first;
    for (;;) {
        TranslationBlock *tmp_tb;
        n1 = tb1 & 3;
        ntb = *ptb;
        n1 = ntb & 3;
        tb1 = (TranslationBlock *)(ntb & ~3);
        if (n1 == 2) {
            break;
        }
        tmp_tb = (TranslationBlock *)(tb1 & ~3);
        tb2 = tmp_tb->jmp_list_next[n1];
        tb_reset_jump(tmp_tb, n1);
        tmp_tb->jmp_list_next[n1] = (uintptr_t)NULL;
        tb1 = tb2;
        tb_reset_jump(tb1, n1);
        *ptb = tb1->jmp_list_next[n1];
        tb1->jmp_list_next[n1] = (uintptr_t)NULL;
    }

    assert(((uintptr_t)tb & 3) == 0);
    tb->jmp_list_first = (uintptr_t)tb | 2; /* fail safe */
}

/* invalidate one TB */