[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v7 40/73] i386/kvm: convert to cpu_interrupt_request
From: |
Emilio G. Cota |
Subject: |
[Qemu-devel] [PATCH v7 40/73] i386/kvm: convert to cpu_interrupt_request |
Date: |
Mon, 4 Mar 2019 13:17:40 -0500 |
Reviewed-by: Richard Henderson <address@hidden>
Reviewed-by: Alex Bennée <address@hidden>
Signed-off-by: Emilio G. Cota <address@hidden>
---
target/i386/kvm.c | 58 ++++++++++++++++++++++++++++-------------------
1 file changed, 35 insertions(+), 23 deletions(-)
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
index f2e187e40f..44a9e3d243 100644
--- a/target/i386/kvm.c
+++ b/target/i386/kvm.c
@@ -2888,11 +2888,14 @@ static int kvm_put_vcpu_events(X86CPU *cpu, int level)
events.smi.smm = !!(env->hflags & HF_SMM_MASK);
events.smi.smm_inside_nmi = !!(env->hflags2 & HF2_SMM_INSIDE_NMI_MASK);
if (kvm_irqchip_in_kernel()) {
+ uint32_t interrupt_request;
+
/* As soon as these are moved to the kernel, remove them
* from cs->interrupt_request.
*/
- events.smi.pending = cs->interrupt_request & CPU_INTERRUPT_SMI;
- events.smi.latched_init = cs->interrupt_request &
CPU_INTERRUPT_INIT;
+ interrupt_request = cpu_interrupt_request(cs);
+ events.smi.pending = interrupt_request & CPU_INTERRUPT_SMI;
+ events.smi.latched_init = interrupt_request & CPU_INTERRUPT_INIT;
cpu_reset_interrupt(cs, CPU_INTERRUPT_INIT | CPU_INTERRUPT_SMI);
} else {
/* Keep these in cs->interrupt_request. */
@@ -3183,14 +3186,14 @@ void kvm_arch_pre_run(CPUState *cpu, struct kvm_run
*run)
{
X86CPU *x86_cpu = X86_CPU(cpu);
CPUX86State *env = &x86_cpu->env;
+ uint32_t interrupt_request;
int ret;
+ interrupt_request = cpu_interrupt_request(cpu);
/* Inject NMI */
- if (cpu->interrupt_request & (CPU_INTERRUPT_NMI | CPU_INTERRUPT_SMI)) {
- if (cpu->interrupt_request & CPU_INTERRUPT_NMI) {
- qemu_mutex_lock_iothread();
+ if (interrupt_request & (CPU_INTERRUPT_NMI | CPU_INTERRUPT_SMI)) {
+ if (interrupt_request & CPU_INTERRUPT_NMI) {
cpu_reset_interrupt(cpu, CPU_INTERRUPT_NMI);
- qemu_mutex_unlock_iothread();
DPRINTF("injected NMI\n");
ret = kvm_vcpu_ioctl(cpu, KVM_NMI);
if (ret < 0) {
@@ -3198,10 +3201,8 @@ void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run)
strerror(-ret));
}
}
- if (cpu->interrupt_request & CPU_INTERRUPT_SMI) {
- qemu_mutex_lock_iothread();
+ if (interrupt_request & CPU_INTERRUPT_SMI) {
cpu_reset_interrupt(cpu, CPU_INTERRUPT_SMI);
- qemu_mutex_unlock_iothread();
DPRINTF("injected SMI\n");
ret = kvm_vcpu_ioctl(cpu, KVM_SMI);
if (ret < 0) {
@@ -3215,16 +3216,22 @@ void kvm_arch_pre_run(CPUState *cpu, struct kvm_run
*run)
qemu_mutex_lock_iothread();
}
+ /*
+ * We might have cleared some bits in cpu->interrupt_request since reading
+ * it; read it again.
+ */
+ interrupt_request = cpu_interrupt_request(cpu);
+
/* Force the VCPU out of its inner loop to process any INIT requests
* or (for userspace APIC, but it is cheap to combine the checks here)
* pending TPR access reports.
*/
- if (cpu->interrupt_request & (CPU_INTERRUPT_INIT | CPU_INTERRUPT_TPR)) {
- if ((cpu->interrupt_request & CPU_INTERRUPT_INIT) &&
+ if (interrupt_request & (CPU_INTERRUPT_INIT | CPU_INTERRUPT_TPR)) {
+ if ((interrupt_request & CPU_INTERRUPT_INIT) &&
!(env->hflags & HF_SMM_MASK)) {
cpu->exit_request = 1;
}
- if (cpu->interrupt_request & CPU_INTERRUPT_TPR) {
+ if (interrupt_request & CPU_INTERRUPT_TPR) {
cpu->exit_request = 1;
}
}
@@ -3232,7 +3239,7 @@ void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run)
if (!kvm_pic_in_kernel()) {
/* Try to inject an interrupt if the guest can accept it */
if (run->ready_for_interrupt_injection &&
- (cpu->interrupt_request & CPU_INTERRUPT_HARD) &&
+ (interrupt_request & CPU_INTERRUPT_HARD) &&
(env->eflags & IF_MASK)) {
int irq;
@@ -3256,7 +3263,7 @@ void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run)
* interrupt, request an interrupt window exit. This will
* cause a return to userspace as soon as the guest is ready to
* receive interrupts. */
- if ((cpu->interrupt_request & CPU_INTERRUPT_HARD)) {
+ if ((cpu_interrupt_request(cpu) & CPU_INTERRUPT_HARD)) {
run->request_interrupt_window = 1;
} else {
run->request_interrupt_window = 0;
@@ -3302,8 +3309,9 @@ int kvm_arch_process_async_events(CPUState *cs)
{
X86CPU *cpu = X86_CPU(cs);
CPUX86State *env = &cpu->env;
+ uint32_t interrupt_request;
- if (cs->interrupt_request & CPU_INTERRUPT_MCE) {
+ if (cpu_interrupt_request(cs) & CPU_INTERRUPT_MCE) {
/* We must not raise CPU_INTERRUPT_MCE if it's not supported. */
assert(env->mcg_cap);
@@ -3326,7 +3334,7 @@ int kvm_arch_process_async_events(CPUState *cs)
}
}
- if ((cs->interrupt_request & CPU_INTERRUPT_INIT) &&
+ if ((cpu_interrupt_request(cs) & CPU_INTERRUPT_INIT) &&
!(env->hflags & HF_SMM_MASK)) {
kvm_cpu_synchronize_state(cs);
do_cpu_init(cpu);
@@ -3336,20 +3344,21 @@ int kvm_arch_process_async_events(CPUState *cs)
return 0;
}
- if (cs->interrupt_request & CPU_INTERRUPT_POLL) {
+ if (cpu_interrupt_request(cs) & CPU_INTERRUPT_POLL) {
cpu_reset_interrupt(cs, CPU_INTERRUPT_POLL);
apic_poll_irq(cpu->apic_state);
}
- if (((cs->interrupt_request & CPU_INTERRUPT_HARD) &&
+ interrupt_request = cpu_interrupt_request(cs);
+ if (((interrupt_request & CPU_INTERRUPT_HARD) &&
(env->eflags & IF_MASK)) ||
- (cs->interrupt_request & CPU_INTERRUPT_NMI)) {
+ (interrupt_request & CPU_INTERRUPT_NMI)) {
cpu_halted_set(cs, 0);
}
- if (cs->interrupt_request & CPU_INTERRUPT_SIPI) {
+ if (interrupt_request & CPU_INTERRUPT_SIPI) {
kvm_cpu_synchronize_state(cs);
do_cpu_sipi(cpu);
}
- if (cs->interrupt_request & CPU_INTERRUPT_TPR) {
+ if (cpu_interrupt_request(cs) & CPU_INTERRUPT_TPR) {
cpu_reset_interrupt(cs, CPU_INTERRUPT_TPR);
kvm_cpu_synchronize_state(cs);
apic_handle_tpr_access_report(cpu->apic_state, env->eip,
@@ -3363,10 +3372,13 @@ static int kvm_handle_halt(X86CPU *cpu)
{
CPUState *cs = CPU(cpu);
CPUX86State *env = &cpu->env;
+ uint32_t interrupt_request;
+
+ interrupt_request = cpu_interrupt_request(cs);
- if (!((cs->interrupt_request & CPU_INTERRUPT_HARD) &&
+ if (!((interrupt_request & CPU_INTERRUPT_HARD) &&
(env->eflags & IF_MASK)) &&
- !(cs->interrupt_request & CPU_INTERRUPT_NMI)) {
+ !(interrupt_request & CPU_INTERRUPT_NMI)) {
cpu_halted_set(cs, 1);
return EXCP_HLT;
}
--
2.17.1
- [Qemu-devel] [PATCH v7 54/73] moxie: convert to cpu_interrupt_request, (continued)
- [Qemu-devel] [PATCH v7 54/73] moxie: convert to cpu_interrupt_request, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 42/73] i386/whpx-all: convert to cpu_interrupt_request, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 67/73] sparc: convert to cpu_has_work_with_iothread_lock, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 69/73] cpu: rename all_cpu_threads_idle to qemu_tcg_rr_all_cpu_threads_idle, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 39/73] i386: convert to cpu_interrupt_request, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 45/73] sh4: convert to cpu_interrupt_request, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 55/73] sparc: convert to cpu_interrupt_request, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 68/73] xtensa: convert to cpu_has_work_with_iothread_lock, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 46/73] cris: convert to cpu_interrupt_request, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 57/73] unicore32: convert to cpu_interrupt_request, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 40/73] i386/kvm: convert to cpu_interrupt_request,
Emilio G. Cota <=
- [Qemu-devel] [PATCH v7 71/73] cpus-common: release BQL earlier in run_on_cpu, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 73/73] cputlb: queue async flush jobs without the BQL, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 56/73] openrisc: convert to cpu_interrupt_request, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 62/73] cpu: introduce cpu_has_work_with_iothread_lock, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 63/73] ppc: convert to cpu_has_work_with_iothread_lock, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 48/73] lm32: convert to cpu_interrupt_request, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 52/73] s390x: convert to cpu_interrupt_request, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 60/73] cpu: convert to interrupt_request, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 41/73] i386/hax-all: convert to cpu_interrupt_request, Emilio G. Cota, 2019/03/04
- [Qemu-devel] [PATCH v7 43/73] i386/hvf: convert to cpu_request_interrupt, Emilio G. Cota, 2019/03/04