target-arm: Clean up DISAS_UPDATE usage in AArch32 translation code
commit577bf808958d06497928c639efaa473bf8c5e099
authorSergey Fedorov <serge.fdrv@gmail.com>
Tue, 10 Nov 2015 13:37:33 +0000 (10 13:37 +0000)
committerPeter Maydell <peter.maydell@linaro.org>
Tue, 10 Nov 2015 13:37:33 +0000 (10 13:37 +0000)
tree335e0541624e71835ff22cd468b1326c9759170c
parentfaa811f6de44d58180f5d235787678dcdd4b2e9d
target-arm: Clean up DISAS_UPDATE usage in AArch32 translation code

AArch32 translation code does not distinguish between DISAS_UPDATE and
DISAS_JUMP. Thus, we cannot use any of them without first updating PC in
CPU state. Furthermore, it is too complicated to update PC in CPU state
before PC gets updated in disas context. So it is hardly possible to
correctly end TB early if is is not likely to be executed before calling
disas_*_insn(), e.g. just after calling breakpoint check helper.

Modify DISAS_UPDATE and DISAS_JUMP usage in AArch32 translation and
apply to them the same semantic as AArch64 translation does:
 - DISAS_UPDATE: update PC in CPU state when finishing translation
 - DISAS_JUMP:   preserve current PC value in CPU state when finishing
                 translation

This patch fixes a bug in AArch32 breakpoint handling: when
check_breakpoints helper does not generate an exception, ending the TB
early with DISAS_UPDATE couldn't update PC in CPU state and execution
hangs.

Signed-off-by: Sergey Fedorov <serge.fdrv@gmail.com>
Message-id: 1447097859-586-1-git-send-email-serge.fdrv@gmail.com
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
target-arm/translate.c