From nobody Mon Feb 9 23:39:11 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass header.i=@intel.com; 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=pass(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1663236257; cv=none; d=zohomail.com; s=zohoarc; b=WU/Ur2zcMToXAJpiaK2OTfiqCc/0GsGQHwaMfoWO6yxPgd2fL1dkydwq2kgvgI4IBDWMHRcNtd2kEuJBEJmtnDYCrrOI0761tKnydCo+bXGDI3Js2QFpR6GnYJAbNjm7Na5RrzACrub/H6UdYt4TvH/wfkavfIrRA6ZCykt8CMg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1663236257; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To; bh=LVs/UWa9hoVg79Hx15p3gzhzv6le+yTR69Z/qkH9LNY=; b=VY1SxMJJLDJbnS3pZzR0b/7F7treF1zmqZe5OYCpHLS8X9KAOGUO6V5RTGQsT2EFwmnuSlTRY1nWjYQQpQJETezC1ARarXPb4sVyFmVA2sbQqN76fwPcC8Cnc7irv20tY/BipfQ+Zq42bJHiS12al15Uc5YxDD6xtbGC405QkI4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=@intel.com; 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=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 166323625779976.47328107667329; Thu, 15 Sep 2022 03:04:17 -0700 (PDT) Received: from localhost ([::1]:56794 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oYljE-0006bW-8G for importer@patchew.org; Thu, 15 Sep 2022 06:04:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:59910) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oYl4K-0005sE-Gn for qemu-devel@nongnu.org; Thu, 15 Sep 2022 05:22:01 -0400 Received: from mga18.intel.com ([134.134.136.126]:26529) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oYl4I-000425-SD for qemu-devel@nongnu.org; Thu, 15 Sep 2022 05:22:00 -0400 Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Sep 2022 02:21:56 -0700 Received: from chenyi-pc.sh.intel.com ([10.239.159.73]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Sep 2022 02:21:54 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663233718; x=1694769718; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=0del9VXeyTnxvbQjFzOC/wKBQkuUfZxt/1ML/Cb1adw=; b=hmM1kIq4AFt2zfhPlXBK28aOnynnK8NOneAOGBfwOzqhj9Ma9G7FQ/MH OhNaBK0RtfClI14o/FOb+WS8wKf9Ul2IOEXAcLD/pSBoNOt8vnLx8BFm4 yBPwW0peCsoqwF7a1R1aQ9NSxoLLHMndYSI/3X2mh4J25hHCvZUBlPA0y eB6OgjSQoY3iCP3+rFqRz6zdOGR1oGObtlMXCEbfBBeX3+eOGPX7JWugI Vccm692g60T+lCEvgZAJ3qb3hT2C++a7/XBWb3MyKR5rFUQZjSbDcVjna xR/qNrw9AxENeDPjxJl9zqClCicD/inq7iDeRWyFqVRbTP1MGLWEOye6a w==; X-IronPort-AV: E=McAfee;i="6500,9779,10470"; a="281694390" X-IronPort-AV: E=Sophos;i="5.93,317,1654585200"; d="scan'208";a="281694390" X-IronPort-AV: E=Sophos;i="5.93,317,1654585200"; d="scan'208";a="759563768" From: Chenyi Qiang To: Paolo Bonzini , Marcelo Tosatti , Richard Henderson , Eduardo Habkost , Peter Xu , Xiaoyao Li Cc: Chenyi Qiang , qemu-devel@nongnu.org, kvm@vger.kernel.org Subject: [PATCH v6 1/2] i386: kvm: extend kvm_{get, put}_vcpu_events to support pending triple fault Date: Thu, 15 Sep 2022 17:28:38 +0800 Message-Id: <20220915092839.5518-2-chenyi.qiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220915092839.5518-1-chenyi.qiang@intel.com> References: <20220915092839.5518-1-chenyi.qiang@intel.com> 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=134.134.136.126; envelope-from=chenyi.qiang@intel.com; helo=mga18.intel.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @intel.com) X-ZM-MESSAGEID: 1663236258573100001 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" For the direct triple faults, i.e. hardware detected and KVM morphed to VM-Exit, KVM will never lose them. But for triple faults sythesized by KVM, e.g. the RSM path, if KVM exits to userspace before the request is serviced, userspace could migrate the VM and lose the triple fault. A new flag KVM_VCPUEVENT_VALID_TRIPLE_FAULT is defined to signal that the event.triple_fault_pending field contains a valid state if the KVM_CAP_X86_TRIPLE_FAULT_EVENT capability is enabled. Acked-by: Peter Xu Signed-off-by: Chenyi Qiang --- target/i386/cpu.c | 1 + target/i386/cpu.h | 1 + target/i386/kvm/kvm.c | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 1db1278a59..6e107466b3 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -6017,6 +6017,7 @@ static void x86_cpu_reset(DeviceState *dev) env->exception_has_payload =3D false; env->exception_payload =3D 0; env->nmi_injected =3D false; + env->triple_fault_pending =3D false; #if !defined(CONFIG_USER_ONLY) /* We hard-wire the BSP to the first CPU. */ apic_designate_bsp(cpu->apic_state, s->cpu_index =3D=3D 0); diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 82004b65b9..b97d182e28 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1739,6 +1739,7 @@ typedef struct CPUArchState { uint8_t has_error_code; uint8_t exception_has_payload; uint64_t exception_payload; + bool triple_fault_pending; uint32_t ins_len; uint32_t sipi_vector; bool tsc_valid; diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index a1fd1f5379..3838827134 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -132,6 +132,7 @@ static int has_xcrs; static int has_pit_state2; static int has_sregs2; static int has_exception_payload; +static int has_triple_fault_event; =20 static bool has_msr_mcg_ext_ctl; =20 @@ -2483,6 +2484,16 @@ int kvm_arch_init(MachineState *ms, KVMState *s) } } =20 + has_triple_fault_event =3D kvm_check_extension(s, KVM_CAP_X86_TRIPLE_F= AULT_EVENT); + if (has_triple_fault_event) { + ret =3D kvm_vm_enable_cap(s, KVM_CAP_X86_TRIPLE_FAULT_EVENT, 0, tr= ue); + if (ret < 0) { + error_report("kvm: Failed to enable triple fault event cap: %s= ", + strerror(-ret)); + return ret; + } + } + ret =3D kvm_get_supported_msrs(s); if (ret < 0) { return ret; @@ -4299,6 +4310,11 @@ static int kvm_put_vcpu_events(X86CPU *cpu, int leve= l) } } =20 + if (has_triple_fault_event) { + events.flags |=3D KVM_VCPUEVENT_VALID_TRIPLE_FAULT; + events.triple_fault.pending =3D env->triple_fault_pending; + } + return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_VCPU_EVENTS, &events); } =20 @@ -4368,6 +4384,10 @@ static int kvm_get_vcpu_events(X86CPU *cpu) } } =20 + if (events.flags & KVM_VCPUEVENT_VALID_TRIPLE_FAULT) { + env->triple_fault_pending =3D events.triple_fault.pending; + } + env->sipi_vector =3D events.sipi_vector; =20 return 0; --=20 2.17.1