qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC v4 33/71] i386: use cpu_reset_interrupt


From: Alex Bennée
Subject: Re: [Qemu-devel] [RFC v4 33/71] i386: use cpu_reset_interrupt
Date: Wed, 31 Oct 2018 16:34:35 +0000
User-agent: mu4e 1.1.0; emacs 26.1.50

Emilio G. Cota <address@hidden> writes:

> From: Paolo Bonzini <address@hidden>
>
> Reviewed-by: Richard Henderson <address@hidden>
> Signed-off-by: Paolo Bonzini <address@hidden>
> Signed-off-by: Emilio G. Cota <address@hidden>

Reviewed-by: Alex Bennée <address@hidden>

> ---
>  target/i386/hax-all.c    |  4 ++--
>  target/i386/hvf/x86hvf.c |  8 ++++----
>  target/i386/kvm.c        | 14 +++++++-------
>  target/i386/seg_helper.c | 13 ++++++-------
>  target/i386/svm_helper.c |  2 +-
>  target/i386/whpx-all.c   | 10 +++++-----
>  6 files changed, 25 insertions(+), 26 deletions(-)
>
> diff --git a/target/i386/hax-all.c b/target/i386/hax-all.c
> index f095c527e3..8b53a9708f 100644
> --- a/target/i386/hax-all.c
> +++ b/target/i386/hax-all.c
> @@ -433,7 +433,7 @@ static int hax_vcpu_interrupt(CPUArchState *env)
>          irq = cpu_get_pic_interrupt(env);
>          if (irq >= 0) {
>              hax_inject_interrupt(env, irq);
> -            cpu->interrupt_request &= ~CPU_INTERRUPT_HARD;
> +            cpu_reset_interrupt(cpu, CPU_INTERRUPT_HARD);
>          }
>      }
>
> @@ -483,7 +483,7 @@ static int hax_vcpu_hax_exec(CPUArchState *env)
>      cpu_halted_set(cpu, 0);
>
>      if (cpu->interrupt_request & CPU_INTERRUPT_POLL) {
> -        cpu->interrupt_request &= ~CPU_INTERRUPT_POLL;
> +        cpu_reset_interrupt(cpu, CPU_INTERRUPT_POLL);
>          apic_poll_irq(x86_cpu->apic_state);
>      }
>
> diff --git a/target/i386/hvf/x86hvf.c b/target/i386/hvf/x86hvf.c
> index 163bbed23f..e8b13ed534 100644
> --- a/target/i386/hvf/x86hvf.c
> +++ b/target/i386/hvf/x86hvf.c
> @@ -402,7 +402,7 @@ bool hvf_inject_interrupts(CPUState *cpu_state)
>
>      if (cpu_state->interrupt_request & CPU_INTERRUPT_NMI) {
>          if (!(env->hflags2 & HF2_NMI_MASK) && !(info & VMCS_INTR_VALID)) {
> -            cpu_state->interrupt_request &= ~CPU_INTERRUPT_NMI;
> +            cpu_reset_interrupt(cpu_state, CPU_INTERRUPT_NMI);
>              info = VMCS_INTR_VALID | VMCS_INTR_T_NMI | NMI_VEC;
>              wvmcs(cpu_state->hvf_fd, VMCS_ENTRY_INTR_INFO, info);
>          } else {
> @@ -414,7 +414,7 @@ bool hvf_inject_interrupts(CPUState *cpu_state)
>          (cpu_state->interrupt_request & CPU_INTERRUPT_HARD) &&
>          (EFLAGS(env) & IF_MASK) && !(info & VMCS_INTR_VALID)) {
>          int line = cpu_get_pic_interrupt(&x86cpu->env);
> -        cpu_state->interrupt_request &= ~CPU_INTERRUPT_HARD;
> +        cpu_reset_interrupt(cpu_state, CPU_INTERRUPT_HARD);
>          if (line >= 0) {
>              wvmcs(cpu_state->hvf_fd, VMCS_ENTRY_INTR_INFO, line |
>                    VMCS_INTR_VALID | VMCS_INTR_T_HWINTR);
> @@ -440,7 +440,7 @@ int hvf_process_events(CPUState *cpu_state)
>      }
>
>      if (cpu_state->interrupt_request & CPU_INTERRUPT_POLL) {
> -        cpu_state->interrupt_request &= ~CPU_INTERRUPT_POLL;
> +        cpu_reset_interrupt(cpu_state, CPU_INTERRUPT_POLL);
>          apic_poll_irq(cpu->apic_state);
>      }
>      if (((cpu_state->interrupt_request & CPU_INTERRUPT_HARD) &&
> @@ -453,7 +453,7 @@ int hvf_process_events(CPUState *cpu_state)
>          do_cpu_sipi(cpu);
>      }
>      if (cpu_state->interrupt_request & CPU_INTERRUPT_TPR) {
> -        cpu_state->interrupt_request &= ~CPU_INTERRUPT_TPR;
> +        cpu_reset_interrupt(cpu_state, CPU_INTERRUPT_TPR);
>          hvf_cpu_synchronize_state(cpu_state);
>          apic_handle_tpr_access_report(cpu->apic_state, env->eip,
>                                        env->tpr_access_type);
> diff --git a/target/i386/kvm.c b/target/i386/kvm.c
> index d593818cd5..effaf87f01 100644
> --- a/target/i386/kvm.c
> +++ b/target/i386/kvm.c
> @@ -2709,7 +2709,7 @@ static int kvm_put_vcpu_events(X86CPU *cpu, int level)
>               */
>              events.smi.pending = cs->interrupt_request & CPU_INTERRUPT_SMI;
>              events.smi.latched_init = cs->interrupt_request & 
> CPU_INTERRUPT_INIT;
> -            cs->interrupt_request &= ~(CPU_INTERRUPT_INIT | 
> CPU_INTERRUPT_SMI);
> +            cpu_reset_interrupt(cs, CPU_INTERRUPT_INIT | CPU_INTERRUPT_SMI);
>          } else {
>              /* Keep these in cs->interrupt_request.  */
>              events.smi.pending = 0;
> @@ -3005,7 +3005,7 @@ void kvm_arch_pre_run(CPUState *cpu, struct kvm_run 
> *run)
>      if (cpu->interrupt_request & (CPU_INTERRUPT_NMI | CPU_INTERRUPT_SMI)) {
>          if (cpu->interrupt_request & CPU_INTERRUPT_NMI) {
>              qemu_mutex_lock_iothread();
> -            cpu->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);
> @@ -3016,7 +3016,7 @@ void kvm_arch_pre_run(CPUState *cpu, struct kvm_run 
> *run)
>          }
>          if (cpu->interrupt_request & CPU_INTERRUPT_SMI) {
>              qemu_mutex_lock_iothread();
> -            cpu->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);
> @@ -3052,7 +3052,7 @@ void kvm_arch_pre_run(CPUState *cpu, struct kvm_run 
> *run)
>              (env->eflags & IF_MASK)) {
>              int irq;
>
> -            cpu->interrupt_request &= ~CPU_INTERRUPT_HARD;
> +            cpu_reset_interrupt(cpu, CPU_INTERRUPT_HARD);
>              irq = cpu_get_pic_interrupt(env);
>              if (irq >= 0) {
>                  struct kvm_interrupt intr;
> @@ -3123,7 +3123,7 @@ int kvm_arch_process_async_events(CPUState *cs)
>          /* We must not raise CPU_INTERRUPT_MCE if it's not supported. */
>          assert(env->mcg_cap);
>
> -        cs->interrupt_request &= ~CPU_INTERRUPT_MCE;
> +        cpu_reset_interrupt(cs, CPU_INTERRUPT_MCE);
>
>          kvm_cpu_synchronize_state(cs);
>
> @@ -3153,7 +3153,7 @@ int kvm_arch_process_async_events(CPUState *cs)
>      }
>
>      if (cs->interrupt_request & CPU_INTERRUPT_POLL) {
> -        cs->interrupt_request &= ~CPU_INTERRUPT_POLL;
> +        cpu_reset_interrupt(cs, CPU_INTERRUPT_POLL);
>          apic_poll_irq(cpu->apic_state);
>      }
>      if (((cs->interrupt_request & CPU_INTERRUPT_HARD) &&
> @@ -3166,7 +3166,7 @@ int kvm_arch_process_async_events(CPUState *cs)
>          do_cpu_sipi(cpu);
>      }
>      if (cs->interrupt_request & CPU_INTERRUPT_TPR) {
> -        cs->interrupt_request &= ~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,
>                                        env->tpr_access_type);
> diff --git a/target/i386/seg_helper.c b/target/i386/seg_helper.c
> index 33714bc6e1..ac5497de79 100644
> --- a/target/i386/seg_helper.c
> +++ b/target/i386/seg_helper.c
> @@ -1332,7 +1332,7 @@ bool x86_cpu_exec_interrupt(CPUState *cs, int 
> interrupt_request)
>      switch (interrupt_request) {
>  #if !defined(CONFIG_USER_ONLY)
>      case CPU_INTERRUPT_POLL:
> -        cs->interrupt_request &= ~CPU_INTERRUPT_POLL;
> +        cpu_reset_interrupt(cs, CPU_INTERRUPT_POLL);
>          apic_poll_irq(cpu->apic_state);
>          break;
>  #endif
> @@ -1341,23 +1341,22 @@ bool x86_cpu_exec_interrupt(CPUState *cs, int 
> interrupt_request)
>          break;
>      case CPU_INTERRUPT_SMI:
>          cpu_svm_check_intercept_param(env, SVM_EXIT_SMI, 0, 0);
> -        cs->interrupt_request &= ~CPU_INTERRUPT_SMI;
> +        cpu_reset_interrupt(cs, CPU_INTERRUPT_SMI);
>          do_smm_enter(cpu);
>          break;
>      case CPU_INTERRUPT_NMI:
>          cpu_svm_check_intercept_param(env, SVM_EXIT_NMI, 0, 0);
> -        cs->interrupt_request &= ~CPU_INTERRUPT_NMI;
> +        cpu_reset_interrupt(cs, CPU_INTERRUPT_NMI);
>          env->hflags2 |= HF2_NMI_MASK;
>          do_interrupt_x86_hardirq(env, EXCP02_NMI, 1);
>          break;
>      case CPU_INTERRUPT_MCE:
> -        cs->interrupt_request &= ~CPU_INTERRUPT_MCE;
> +        cpu_reset_interrupt(cs, CPU_INTERRUPT_MCE);
>          do_interrupt_x86_hardirq(env, EXCP12_MCHK, 0);
>          break;
>      case CPU_INTERRUPT_HARD:
>          cpu_svm_check_intercept_param(env, SVM_EXIT_INTR, 0, 0);
> -        cs->interrupt_request &= ~(CPU_INTERRUPT_HARD |
> -                                   CPU_INTERRUPT_VIRQ);
> +        cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD | CPU_INTERRUPT_VIRQ);
>          intno = cpu_get_pic_interrupt(env);
>          qemu_log_mask(CPU_LOG_TB_IN_ASM,
>                        "Servicing hardware INT=0x%02x\n", intno);
> @@ -1372,7 +1371,7 @@ bool x86_cpu_exec_interrupt(CPUState *cs, int 
> interrupt_request)
>          qemu_log_mask(CPU_LOG_TB_IN_ASM,
>                        "Servicing virtual hardware INT=0x%02x\n", intno);
>          do_interrupt_x86_hardirq(env, intno, 1);
> -        cs->interrupt_request &= ~CPU_INTERRUPT_VIRQ;
> +        cpu_reset_interrupt(cs, CPU_INTERRUPT_VIRQ);
>          break;
>  #endif
>      }
> diff --git a/target/i386/svm_helper.c b/target/i386/svm_helper.c
> index 9fd22a883b..a6d33e55d8 100644
> --- a/target/i386/svm_helper.c
> +++ b/target/i386/svm_helper.c
> @@ -700,7 +700,7 @@ void do_vmexit(CPUX86State *env, uint32_t exit_code, 
> uint64_t exit_info_1)
>      env->hflags &= ~HF_GUEST_MASK;
>      env->intercept = 0;
>      env->intercept_exceptions = 0;
> -    cs->interrupt_request &= ~CPU_INTERRUPT_VIRQ;
> +    cpu_reset_interrupt(cs, CPU_INTERRUPT_VIRQ);
>      env->tsc_offset = 0;
>
>      env->gdt.base  = x86_ldq_phys(cs, env->vm_hsave + offsetof(struct vmcb,
> diff --git a/target/i386/whpx-all.c b/target/i386/whpx-all.c
> index b9c79ccd99..9673bdc219 100644
> --- a/target/i386/whpx-all.c
> +++ b/target/i386/whpx-all.c
> @@ -728,14 +728,14 @@ static void whpx_vcpu_pre_run(CPUState *cpu)
>      if (!vcpu->interruption_pending &&
>          cpu->interrupt_request & (CPU_INTERRUPT_NMI | CPU_INTERRUPT_SMI)) {
>          if (cpu->interrupt_request & CPU_INTERRUPT_NMI) {
> -            cpu->interrupt_request &= ~CPU_INTERRUPT_NMI;
> +            cpu_reset_interrupt(cpu, CPU_INTERRUPT_NMI);
>              vcpu->interruptable = false;
>              new_int.InterruptionType = WHvX64PendingNmi;
>              new_int.InterruptionPending = 1;
>              new_int.InterruptionVector = 2;
>          }
>          if (cpu->interrupt_request & CPU_INTERRUPT_SMI) {
> -            cpu->interrupt_request &= ~CPU_INTERRUPT_SMI;
> +            cpu_reset_interrupt(cpu, CPU_INTERRUPT_SMI);
>          }
>      }
>
> @@ -758,7 +758,7 @@ static void whpx_vcpu_pre_run(CPUState *cpu)
>          vcpu->interruptable && (env->eflags & IF_MASK)) {
>          assert(!new_int.InterruptionPending);
>          if (cpu->interrupt_request & CPU_INTERRUPT_HARD) {
> -            cpu->interrupt_request &= ~CPU_INTERRUPT_HARD;
> +            cpu_reset_interrupt(cpu, CPU_INTERRUPT_HARD);
>              irq = cpu_get_pic_interrupt(env);
>              if (irq >= 0) {
>                  new_int.InterruptionType = WHvX64PendingInterrupt;
> @@ -850,7 +850,7 @@ static void whpx_vcpu_process_async_events(CPUState *cpu)
>      }
>
>      if (cpu->interrupt_request & CPU_INTERRUPT_POLL) {
> -        cpu->interrupt_request &= ~CPU_INTERRUPT_POLL;
> +        cpu_reset_interrupt(cpu, CPU_INTERRUPT_POLL);
>          apic_poll_irq(x86_cpu->apic_state);
>      }
>
> @@ -868,7 +868,7 @@ static void whpx_vcpu_process_async_events(CPUState *cpu)
>      }
>
>      if (cpu->interrupt_request & CPU_INTERRUPT_TPR) {
> -        cpu->interrupt_request &= ~CPU_INTERRUPT_TPR;
> +        cpu_reset_interrupt(cpu, CPU_INTERRUPT_TPR);
>          if (!cpu->vcpu_dirty) {
>              whpx_get_registers(cpu);
>          }


--
Alex Bennée



reply via email to

[Prev in Thread] Current Thread [Next in Thread]