From nobody Mon Feb 9 22:37:59 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1630933987210632.136706797478; Mon, 6 Sep 2021 06:13:07 -0700 (PDT) Received: from localhost ([::1]:45768 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mNEQr-0003Un-Ov for importer@patchew.org; Mon, 06 Sep 2021 09:13:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57146) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mNEP0-0000VI-MZ for qemu-devel@nongnu.org; Mon, 06 Sep 2021 09:11:10 -0400 Received: from mail-wr1-x430.google.com ([2a00:1450:4864:20::430]:35632) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mNEOy-0007Iq-RO for qemu-devel@nongnu.org; Mon, 06 Sep 2021 09:11:10 -0400 Received: by mail-wr1-x430.google.com with SMTP id i6so9812764wrv.2 for ; Mon, 06 Sep 2021 06:11:08 -0700 (PDT) Received: from avogadro.redhat.com ([2001:b07:6468:f312:c8dd:75d4:99ab:290a]) by smtp.gmail.com with ESMTPSA id k4sm7992331wrm.74.2021.09.06.06.11.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 06 Sep 2021 06:11:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UQLhAUnm0nH7RIH9Cq6XhCgZ9K8x5CXMCZYhF+S82Lg=; b=gs49tWzVJGtPlly7cacAdV68a3iYFIHsvYPvHQd2EGpsX+BrSNR6zMDm0OANZ2kENF Ahj2Lf1gXNekAp5dADIalvPEmxY4n2u4tlGW12hm/QCPqV29XiRnVgbeyovUMhLa+voo xZrbAnllKYqWaZcLnQMLlHbOfCBt19buRkFNixZk0gZiJdBvU/4WwA0Yi/jut9nGcGFg h9O/UssSPkQvfbG2GMSNMIwRl4/XK/5GWu5fFqsmP20R6F26ALUzQ7DiIw5NTk5YMMP2 28oJf6pxoF6A9greI6MNxJMAH8Z70FDsA5WFKbpcZRHYHsl7WTTvWFWzXDl00k+yHUrv TLgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=UQLhAUnm0nH7RIH9Cq6XhCgZ9K8x5CXMCZYhF+S82Lg=; b=TqiReTdO5zX9P03+H8LXuJj4NLviglDnEoBDltuv1FqxTnFUDrIuGE1hAd+NRDFMON LLg3en26E/EXzuVqJ6LKZvaBOCMN8PkFToFgRo1exTcrdr2UzhpPdLD5FSgv5R+WAP3Y 7sIXodjuBDVV/emj3eM1R/dFJQs/WL7HsCzbLRUKwSVipmMJ9pg2HU20ySnTAvAQYwNX mLlFyuMWdKRw3eKgw/m1OcgNMme+A2epvwuuSqu8j9k8goTD/EsTWJgu+UISImRN2Wy5 +WVQIvZPFTIEAGnAP/jo3HopsFSu0GYdVguF37+/6zEVpfsK8jTrkWLhR2ufwYW4FX2z WwFw== X-Gm-Message-State: AOAM532OigP7+fiR4XvcEDDvO94s53IgIslD4HzyzfH4126YEgwKB6q/ lG8l2F41bz3MzQKbWLRblRm9kc2N41Y= X-Google-Smtp-Source: ABdhPJxSWu3fkMgj9BPxa6dlp6dqqRAwdOcDiAFdSUsc5F09r3oDAq1Wjve2NUQ23TOvb0TKBQ1ChQ== X-Received: by 2002:adf:f2c5:: with SMTP id d5mr12825371wrp.223.1630933867531; Mon, 06 Sep 2021 06:11:07 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Subject: [PULL 03/36] target/i386: Moved int_ctl into CPUX86State structure Date: Mon, 6 Sep 2021 15:10:26 +0200 Message-Id: <20210906131059.55234-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210906131059.55234-1-pbonzini@redhat.com> References: <20210906131059.55234-1-pbonzini@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::430; envelope-from=paolo.bonzini@gmail.com; helo=mail-wr1-x430.google.com X-Spam_score_int: -14 X-Spam_score: -1.5 X-Spam_bar: - X-Spam_report: (-1.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=0.25, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Lara Lazier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1630933988691100005 Content-Type: text/plain; charset="utf-8" From: Lara Lazier Moved int_ctl into the CPUX86State structure. It removes some unnecessary stores and loads, and prepares for tracking the vIRQ state even when it is masked due to vGIF. Signed-off-by: Lara Lazier Signed-off-by: Paolo Bonzini --- slirp | 2 +- target/i386/cpu.c | 2 +- target/i386/cpu.h | 1 + target/i386/machine.c | 22 ++++++++++++- target/i386/tcg/seg_helper.c | 2 +- target/i386/tcg/sysemu/misc_helper.c | 4 +-- target/i386/tcg/sysemu/svm_helper.c | 48 +++++++++------------------- 7 files changed, 42 insertions(+), 39 deletions(-) diff --git a/slirp b/slirp index a88d9ace23..8f43a99191 160000 --- a/slirp +++ b/slirp @@ -1 +1 @@ -Subproject commit a88d9ace234a24ce1c17189642ef9104799425e0 +Subproject commit 8f43a99191afb47ca3f3c6972f6306209f367ece diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 86064ea1f9..ddc3b63cb8 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -5655,7 +5655,7 @@ static void x86_cpu_reset(DeviceState *dev) env->old_exception =3D -1; =20 /* init to reset state */ - + env->int_ctl =3D 0; env->hflags2 |=3D HF2_GIF_MASK; env->hflags &=3D ~HF_GUEST_MASK; =20 diff --git a/target/i386/cpu.h b/target/i386/cpu.h index c9c7350c76..e27a1aab99 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1577,6 +1577,7 @@ typedef struct CPUX86State { uint64_t nested_cr3; uint32_t nested_pg_mode; uint8_t v_tpr; + uint32_t int_ctl; =20 /* KVM states, automatically cleared on reset */ uint8_t nmi_injected; diff --git a/target/i386/machine.c b/target/i386/machine.c index f6f094f1c9..f9ab161646 100644 --- a/target/i386/machine.c +++ b/target/i386/machine.c @@ -203,7 +203,7 @@ static int cpu_pre_save(void *opaque) X86CPU *cpu =3D opaque; CPUX86State *env =3D &cpu->env; int i; - + env->v_tpr =3D env->int_ctl & V_TPR_MASK; /* FPU */ env->fpus_vmstate =3D (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; env->fptag_vmstate =3D 0; @@ -1356,6 +1356,25 @@ static const VMStateDescription vmstate_svm_npt =3D { } }; =20 +static bool svm_guest_needed(void *opaque) +{ + X86CPU *cpu =3D opaque; + CPUX86State *env =3D &cpu->env; + + return tcg_enabled() && !env->int_ctl; +} + +static const VMStateDescription vmstate_svm_guest =3D { + .name =3D "cpu/svm_guest", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D svm_guest_needed, + .fields =3D (VMStateField[]){ + VMSTATE_UINT32(env.int_ctl, X86CPU), + VMSTATE_END_OF_LIST() + } +}; + #ifndef TARGET_X86_64 static bool intel_efer32_needed(void *opaque) { @@ -1524,6 +1543,7 @@ const VMStateDescription vmstate_x86_cpu =3D { &vmstate_msr_intel_pt, &vmstate_msr_virt_ssbd, &vmstate_svm_npt, + &vmstate_svm_guest, #ifndef TARGET_X86_64 &vmstate_efer32, #endif diff --git a/target/i386/tcg/seg_helper.c b/target/i386/tcg/seg_helper.c index 3ed20ca31d..cef68b610a 100644 --- a/target/i386/tcg/seg_helper.c +++ b/target/i386/tcg/seg_helper.c @@ -1166,7 +1166,6 @@ bool x86_cpu_exec_interrupt(CPUState *cs, int interru= pt_request) break; #if !defined(CONFIG_USER_ONLY) case CPU_INTERRUPT_VIRQ: - /* FIXME: this should respect TPR */ cpu_svm_check_intercept_param(env, SVM_EXIT_VINTR, 0, 0); intno =3D x86_ldl_phys(cs, env->vm_vmcb + offsetof(struct vmcb, control.int_vector)); @@ -1174,6 +1173,7 @@ bool x86_cpu_exec_interrupt(CPUState *cs, int interru= pt_request) "Servicing virtual hardware INT=3D0x%02x\n", intno); do_interrupt_x86_hardirq(env, intno, 1); cs->interrupt_request &=3D ~CPU_INTERRUPT_VIRQ; + env->int_ctl &=3D ~V_IRQ_MASK; break; #endif } diff --git a/target/i386/tcg/sysemu/misc_helper.c b/target/i386/tcg/sysemu/= misc_helper.c index e7a2ebde81..91b0fc916b 100644 --- a/target/i386/tcg/sysemu/misc_helper.c +++ b/target/i386/tcg/sysemu/misc_helper.c @@ -73,7 +73,7 @@ target_ulong helper_read_crN(CPUX86State *env, int reg) if (!(env->hflags2 & HF2_VINTR_MASK)) { val =3D cpu_get_apic_tpr(env_archcpu(env)->apic_state); } else { - val =3D env->v_tpr; + val =3D env->int_ctl & V_TPR_MASK; } break; } @@ -121,7 +121,7 @@ void helper_write_crN(CPUX86State *env, int reg, target= _ulong t0) cpu_set_apic_tpr(env_archcpu(env)->apic_state, t0); qemu_mutex_unlock_iothread(); } - env->v_tpr =3D t0 & 0x0f; + env->int_ctl =3D (env->int_ctl & ~V_TPR_MASK) | (t0 & V_TPR_MASK); break; default: env->cr[reg] =3D t0; diff --git a/target/i386/tcg/sysemu/svm_helper.c b/target/i386/tcg/sysemu/s= vm_helper.c index 66c2c1e61f..24c58b6a38 100644 --- a/target/i386/tcg/sysemu/svm_helper.c +++ b/target/i386/tcg/sysemu/svm_helper.c @@ -76,14 +76,14 @@ static inline void svm_load_seg_cache(CPUX86State *env,= hwaddr addr, sc->base, sc->limit, sc->flags); } =20 -static inline bool ctl_has_irq(uint32_t int_ctl) +static inline bool ctl_has_irq(CPUX86State *env) { uint32_t int_prio; uint32_t tpr; =20 - int_prio =3D (int_ctl & V_INTR_PRIO_MASK) >> V_INTR_PRIO_SHIFT; - tpr =3D int_ctl & V_TPR_MASK; - return (int_ctl & V_IRQ_MASK) && (int_prio >=3D tpr); + int_prio =3D (env->int_ctl & V_INTR_PRIO_MASK) >> V_INTR_PRIO_SHIFT; + tpr =3D env->int_ctl & V_TPR_MASK; + return (env->int_ctl & V_IRQ_MASK) && (int_prio >=3D tpr); } =20 static inline bool is_efer_invalid_state (CPUX86State *env) @@ -121,13 +121,11 @@ static inline bool is_efer_invalid_state (CPUX86State= *env) return false; } =20 -static inline bool virtual_gif_enabled(CPUX86State *env, uint32_t *int_ctl) +static inline bool virtual_gif_enabled(CPUX86State *env) { if (likely(env->hflags & HF_GUEST_MASK)) { - *int_ctl =3D x86_ldl_phys(env_cpu(env), - env->vm_vmcb + offsetof(struct vmcb, control.int_ct= l)); return (env->features[FEAT_SVM] & CPUID_SVM_VGIF) - && (*int_ctl & V_GIF_ENABLED_MASK); + && (env->int_ctl & V_GIF_ENABLED_MASK); } return false; } @@ -139,7 +137,6 @@ void helper_vmrun(CPUX86State *env, int aflag, int next= _eip_addend) target_ulong addr; uint64_t nested_ctl; uint32_t event_inj; - uint32_t int_ctl; uint32_t asid; uint64_t new_cr0; uint64_t new_cr3; @@ -292,11 +289,10 @@ void helper_vmrun(CPUX86State *env, int aflag, int ne= xt_eip_addend) cpu_x86_update_cr3(env, new_cr3); env->cr[2] =3D x86_ldq_phys(cs, env->vm_vmcb + offsetof(struct vmcb, save.cr2)); - int_ctl =3D x86_ldl_phys(cs, + env->int_ctl =3D x86_ldl_phys(cs, env->vm_vmcb + offsetof(struct vmcb, control.int_ct= l)); env->hflags2 &=3D ~(HF2_HIF_MASK | HF2_VINTR_MASK); - if (int_ctl & V_INTR_MASKING_MASK) { - env->v_tpr =3D int_ctl & V_TPR_MASK; + if (env->int_ctl & V_INTR_MASKING_MASK) { env->hflags2 |=3D HF2_VINTR_MASK; if (env->eflags & IF_MASK) { env->hflags2 |=3D HF2_HIF_MASK; @@ -362,7 +358,7 @@ void helper_vmrun(CPUX86State *env, int aflag, int next= _eip_addend) =20 env->hflags2 |=3D HF2_GIF_MASK; =20 - if (ctl_has_irq(int_ctl)) { + if (ctl_has_irq(env)) { CPUState *cs =3D env_cpu(env); =20 cs->interrupt_request |=3D CPU_INTERRUPT_VIRQ; @@ -522,11 +518,8 @@ void helper_stgi(CPUX86State *env) { cpu_svm_check_intercept_param(env, SVM_EXIT_STGI, 0, GETPC()); =20 - CPUState *cs =3D env_cpu(env); - uint32_t int_ctl; - if (virtual_gif_enabled(env, &int_ctl)) { - x86_stl_phys(cs, env->vm_vmcb + offsetof(struct vmcb, control.int_= ctl), - int_ctl | V_GIF_MASK); + if (virtual_gif_enabled(env)) { + env->int_ctl |=3D V_GIF_MASK; } else { env->hflags2 |=3D HF2_GIF_MASK; } @@ -536,11 +529,8 @@ void helper_clgi(CPUX86State *env) { cpu_svm_check_intercept_param(env, SVM_EXIT_CLGI, 0, GETPC()); =20 - CPUState *cs =3D env_cpu(env); - uint32_t int_ctl; - if (virtual_gif_enabled(env, &int_ctl)) { - x86_stl_phys(cs, env->vm_vmcb + offsetof(struct vmcb, control.int_= ctl), - int_ctl & ~V_GIF_MASK); + if (virtual_gif_enabled(env)) { + env->int_ctl &=3D ~V_GIF_MASK; } else { env->hflags2 &=3D ~HF2_GIF_MASK; } @@ -688,7 +678,6 @@ void cpu_vmexit(CPUX86State *env, uint32_t exit_code, u= int64_t exit_info_1, void do_vmexit(CPUX86State *env) { CPUState *cs =3D env_cpu(env); - uint32_t int_ctl; =20 if (env->hflags & HF_INHIBIT_IRQ_MASK) { x86_stl_phys(cs, @@ -731,16 +720,8 @@ void do_vmexit(CPUX86State *env) env->vm_vmcb + offsetof(struct vmcb, save.cr3), env->cr[3]); x86_stq_phys(cs, env->vm_vmcb + offsetof(struct vmcb, save.cr4), env->cr[4]); - - int_ctl =3D x86_ldl_phys(cs, - env->vm_vmcb + offsetof(struct vmcb, control.int_ct= l)); - int_ctl &=3D ~(V_TPR_MASK | V_IRQ_MASK); - int_ctl |=3D env->v_tpr & V_TPR_MASK; - if (cs->interrupt_request & CPU_INTERRUPT_VIRQ) { - int_ctl |=3D V_IRQ_MASK; - } x86_stl_phys(cs, - env->vm_vmcb + offsetof(struct vmcb, control.int_ctl), int_ct= l); + env->vm_vmcb + offsetof(struct vmcb, control.int_ctl), env->i= nt_ctl); =20 x86_stq_phys(cs, env->vm_vmcb + offsetof(struct vmcb, save.rflags), cpu_compute_eflags(env)); @@ -763,6 +744,7 @@ void do_vmexit(CPUX86State *env) env->intercept =3D 0; env->intercept_exceptions =3D 0; cs->interrupt_request &=3D ~CPU_INTERRUPT_VIRQ; + env->int_ctl =3D 0; env->tsc_offset =3D 0; =20 env->gdt.base =3D x86_ldq_phys(cs, env->vm_hsave + offsetof(struct vm= cb, --=20 2.31.1