accel/tcg: Improve can_do_io management
commitdcd092a0636ec36e69e42a3dbbe447d97cb0d113
authorRichard Henderson <richard.henderson@linaro.org>
Sat, 6 Apr 2024 22:17:57 +0000 (6 12:17 -1000)
committerRichard Henderson <richard.henderson@linaro.org>
Tue, 9 Apr 2024 17:45:10 +0000 (9 07:45 -1000)
tree93a452ee3dc90cfb52afa2bf0542d4b2ec87fd70
parentb338970f8cdcba114dad467e085f3ff13dfa9a43
accel/tcg: Improve can_do_io management

We already attempted to set and clear can_do_io before the first
and last insns, but only used the initial value of max_insns and
the call to translator_io_start to find those insns.

Now that we track insn_start in DisasContextBase, and now that
we have emit_before_op, we can wait until we have finished
translation to identify the true first and last insns and emit
the sets of can_do_io at that time.

This fixes the case of a translation block which crossed a page
boundary, and for which the second page turned out to be mmio.
In this case we truncate the block, and the previous logic for
can_do_io could leave a block with a single insn with can_do_io
set to false, which would fail an assertion in cpu_io_recompile.

Reported-by: Jørgen Hansen <Jorgen.Hansen@wdc.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Tested-by: Jørgen Hansen <Jorgen.Hansen@wdc.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
accel/tcg/translator.c
include/exec/translator.h