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: 李威威 <liweiwei@kubuds.cn> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Anton Johansson <anjo@rev.ng> Tested-by: Anton Johansson <anjo@rev.ng>
This commit is contained in:
parent
9ea2880581
commit
03fe665980
1 changed files with 8 additions and 0 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue