From: Richard Henderson Date: Tue, 23 Sep 2025 23:02:03 +0000 (-0700) Subject: accel/tcg: Properly unlink a TB linked to itself X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=03fe6659803f83690b8587d01f8ee56bb4be4b90;p=thirdparty%2Fqemu.git accel/tcg: Properly unlink a TB linked to itself When we remove dest from orig's links, we lose the link that we rely on later to reset links. This can lead to failure to release from spinlock with self-modifying code. Cc: qemu-stable@nongnu.org Reported-by: 李威威 Signed-off-by: Richard Henderson Reviewed-by: Anton Johansson Tested-by: Anton Johansson --- diff --git a/accel/tcg/tb-maint.c b/accel/tcg/tb-maint.c index 0048316f99a..e6d45c9c127 100644 --- a/accel/tcg/tb-maint.c +++ b/accel/tcg/tb-maint.c @@ -836,6 +836,14 @@ static inline void tb_remove_from_jmp_list(TranslationBlock *orig, int n_orig) * We first acquired the lock, and since the destination pointer matches, * we know for sure that @orig is in the jmp list. */ + if (dest == orig) { + /* + * In the case of a TB that links to itself, removing the entry + * from the list means that it won't be present later during + * tb_jmp_unlink -- unlink now. + */ + tb_reset_jump(orig, n_orig); + } pprev = &dest->jmp_list_head; TB_FOR_EACH_JMP(dest, tb, n) { if (tb == orig && n == n_orig) {