mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 17:53:56 -06:00
target-i386: defer VMEXIT to do_interrupt
Paths through the softmmu code during code generation now need to be audited to check for double locking of tb_lock. In particular, VMEXIT can take tb_lock through cpu_vmexit -> cpu_x86_update_cr4 -> tlb_flush. To avoid this, split VMEXIT delivery in two parts, similar to what is done with exceptions. cpu_vmexit only records the VMEXIT exit code and information, and cc->do_interrupt can then deliver it when it is safe to take the lock. Reported-by: Alexander Boettcher <alexander.boettcher@genode-labs.com> Suggested-by: Richard Henderson <rth@twiddle.net> Tested-by: Alexander Boettcher <alexander.boettcher@genode-labs.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <rth@twiddle.net>
This commit is contained in:
parent
d394698d73
commit
10cde894b6
3 changed files with 26 additions and 18 deletions
|
@ -697,6 +697,7 @@ typedef uint32_t FeatureWordArray[FEATURE_WORDS];
|
|||
|
||||
#define EXCP_SYSCALL 0x100 /* only happens in user only emulation
|
||||
for syscall instruction */
|
||||
#define EXCP_VMEXIT 0x100
|
||||
|
||||
/* i386-specific interrupt pending bits. */
|
||||
#define CPU_INTERRUPT_POLL CPU_INTERRUPT_TGT_EXT_1
|
||||
|
@ -1632,6 +1633,7 @@ void cpu_svm_check_intercept_param(CPUX86State *env1, uint32_t type,
|
|||
uint64_t param, uintptr_t retaddr);
|
||||
void cpu_vmexit(CPUX86State *nenv, uint32_t exit_code, uint64_t exit_info_1,
|
||||
uintptr_t retaddr);
|
||||
void do_vmexit(CPUX86State *env, uint32_t exit_code, uint64_t exit_info_1);
|
||||
|
||||
/* seg_helper.c */
|
||||
void do_interrupt_x86_hardirq(CPUX86State *env, int intno, int is_hw);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue