diff options
author | Max Filippov | 2012-05-28 01:18:33 +0200 |
---|---|---|
committer | Blue Swirl | 2012-06-09 12:49:21 +0200 |
commit | d865f307399441919d6646545b7735e57920da04 (patch) | |
tree | 7fe0bfe1f75e87f5300078738d6ba858bd571ae6 /target-xtensa | |
parent | exec: fix TB invalidation after breakpoint insertion/deletion (diff) | |
download | qemu-d865f307399441919d6646545b7735e57920da04.tar.gz qemu-d865f307399441919d6646545b7735e57920da04.tar.xz qemu-d865f307399441919d6646545b7735e57920da04.zip |
target-xtensa: fix CCOUNT for conditional branches
Taken conditional branches fail to update CCOUNT register because
accumulated ccount_delta is reset during translation of non-taken
branch. To fix it only update CCOUNT once per conditional branch
instruction translation.
This fixes guest linux freeze on LTP waitpid06 test.
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Diffstat (limited to 'target-xtensa')
-rw-r--r-- | target-xtensa/translate.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index 521c0e6226..a542a319db 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -388,6 +388,7 @@ static bool gen_check_loop_end(DisasContext *dc, int slot) dc->next_pc == dc->lend) { int label = gen_new_label(); + gen_advance_ccount(dc); tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_SR[LCOUNT], 0, label); tcg_gen_subi_i32(cpu_SR[LCOUNT], cpu_SR[LCOUNT], 1); gen_jumpi(dc, dc->lbeg, slot); @@ -410,6 +411,7 @@ static void gen_brcond(DisasContext *dc, TCGCond cond, { int label = gen_new_label(); + gen_advance_ccount(dc); tcg_gen_brcond_i32(cond, t0, t1, label); gen_jumpi_check_loop_end(dc, 0); gen_set_label(label); |