kvmvapic: patch_instruction fix
PATCH 1/1 kvmvapic: patch_instruction fix
When QEMU works in icount mode cpu_restore_state function performs two actions:
restoring the program counter and updating icount to the correct value. kvmvapic's patch_instruction function is called by cpu_report_tpr_access function which also invokes cpu_restore_state. It results to calling cpu_restore_state twice - in cpu_report_tpr_access and in patch_instruction. When icount is disabled second call is safe. But when icount is enabled, cpu_restore_state modifies instructions counter twice, which leads to incorrect behavior. This patch removes useless cpu_restore_state call from kvmvapic.
--- hw/i386/kvmvapic.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-)
hw/i386/kvmvapic.c +0 -1
@@ -405,7 +405,6 @@ static void patch_instruction(VAPICROMState *s, X86CPU *cpu, target_ulong ip) }if (!kvm_enabled ()) { -cpu_restore_state (cs, cs->mem_io_pc);cpu_get_tb_cpu_state (env, ¤t_pc, ¤t_cs_base, ¤t_flags); }
Quoted 20 lines · Pavel Dovgalyuk
When QEMU works in icount mode
cpu_restore_statefunction performs two actions:
restoring the program counter and updating icount to the correct value. kvmvapic'spatch_instructionfunction is called bycpu_report_tpr_accessfunction which also invokescpu_restore_state. It results to callingcpu_restore_statetwice - incpu_report_tpr_accessand inpatch_instruction. When icount is disabled second call is safe. But when icount is enabled,cpu_restore_statemodifies instructions counter twice, which leads to incorrect behavior. This patch removes uselesscpu_restore_statecall from kvmvapic.Signed-off-by Pavel Dovgalyuk <[email protected]>--- hw/i386/kvmvapic.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-)hw/i386/kvmvapic.c +0
-0
hw/i386/kvmvapic.c static void patch_instruction(VAPICROMState *s, X86CPU *cpu, target_ulong ip) · line 410
Quoted 7 lines
hw/i386/kvmvapic.c +0
-1@@ -405,7 +405,6 @@ static void patch_instruction(VAPICROMState *s, X86CPU *cpu, target_ulong ip) }if (!kvm_enabled ()) { -cpu_restore_state (cs, cs->mem_io_pc);cpu_get_tb_cpu_state (env, ¤t_pc, ¤t_cs_base, ¤t_flags); }
Thanks, applying.
Paolo