From nobody Tue Sep 9 19:03:25 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail header.i=@intel.com; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1752132482882771.7012441670302; Thu, 10 Jul 2025 00:28:02 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id E58FFC2E; Thu, 10 Jul 2025 03:28:01 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 2C5A4151A; Thu, 10 Jul 2025 03:23:04 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 938381272; Thu, 10 Jul 2025 03:22:53 -0400 (EDT) Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 198CB12C8 for ; Thu, 10 Jul 2025 03:22:28 -0400 (EDT) Received: from orviesa002.jf.intel.com ([10.64.159.142]) by orvoesa111.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Jul 2025 00:22:27 -0700 Received: from unknown (HELO gnr-sp-2s-612.sh.intel.com) ([10.112.230.229]) by orviesa002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Jul 2025 00:22:24 -0700 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-3.0 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1752132149; x=1783668149; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=6O/lWz4V0zgH/ir0A/rL7qHrt3KZv+8kuyzPeHzMY+4=; b=na+Z4fk8HdPNmUF+A5hP6d3CgcZHa+zHxMOLNHQCHvkN6+K9vY2Rb4X1 locLfrZZVUvKUn7wAfkhTt3V2NBS0GFJuoQYDA9rXErMMHPRxZzhCAM8T yjz64vOcxO9Ik7WS2R1jtn/lnU/vlN8B93fQ1GMhr6DQyEtOgtkT8GVaR ci/WdK3EsRiB3dcPs4Xafpb646Y1ZAabVKyR5feSAcUhdOTEj1oY7HoQ6 3ERLQT5KGEq5ui7ob138UMQVF845Sr5liqxuSSS2mOsLuojZHyFxogPta xkkjMjD99Yqi/OTaMAwwjksydIQSJZVkYBqzIxqhkLrNvwVac0IPRub+F Q==; X-CSE-ConnectionGUID: BwFUeq26QYefx03ENpmTjg== X-CSE-MsgGUID: Q2i6mVmGSF23Ljaus4h2YQ== X-IronPort-AV: E=McAfee;i="6800,10657,11489"; a="54257079" X-IronPort-AV: E=Sophos;i="6.16,300,1744095600"; d="scan'208";a="54257079" X-CSE-ConnectionGUID: 1ZYERnDqR1KdNV8ZjEN82w== X-CSE-MsgGUID: WaCDZvVtQ8+bz/mDYSGrUQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.16,300,1744095600"; d="scan'208";a="186997176" From: Zhenzhong Duan To: devel@lists.libvirt.org Subject: [PATCH v4 12/23] qemu: log the crash information for TDX Date: Thu, 10 Jul 2025 03:21:14 -0400 Message-ID: <20250710072127.695558-13-zhenzhong.duan@intel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250710072127.695558-1-zhenzhong.duan@intel.com> References: <20250710072127.695558-1-zhenzhong.duan@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 5EXRDP6NLAJLRBO3IJZEA5KSF7YN6K7A X-Message-ID-Hash: 5EXRDP6NLAJLRBO3IJZEA5KSF7YN6K7A X-MailFrom: zhenzhong.duan@intel.com X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0 CC: phrdina@redhat.com, pkrempa@redhat.com, jjongsma@redhat.com, jsuchane@redhat.com, chenyi.qiang@intel.com, isaku.yamahata@intel.com, xiaoyao.li@intel.com, chao.p.peng@intel.com, Zhenzhong Duan X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1752132484031116600 Content-Type: text/plain; charset="utf-8" Since QEMU 10.1.0 commit id '6e250463b08b' guest crash information for TDX is available in the QEMU monitor, e.g.: { "timestamp": { "seconds": 1752118704, "microseconds": 27480 }, "event": "GUEST_PANICKED", "data": { "action": "pause", "info": { "error-code": 0, "message": "TD misconfiguration: SEPT #VE has to be disable= d", "type": "tdx" } } } Let's log this information into the domain log file, e.g.: 2025-07-10 03:39:18.243+0000: panic tdx: error_code=3D'0x0' message=3D'= TD misconfiguration: SEPT #VE has to be disabled' Suggested-by: Daniel P. Berrang=C3=A9 Signed-off-by: Zhenzhong Duan Reviewed-by: Daniel P. Berrang=C3=A9 --- src/qemu/qemu_monitor.c | 16 ++++++++++++++++ src/qemu/qemu_monitor.h | 11 +++++++++++ src/qemu/qemu_monitor_json.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 95c88fd5e8..b06949ab66 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3912,6 +3912,19 @@ qemuMonitorGuestPanicEventInfoFormatMsg(qemuMonitorE= ventPanicInfo *info) info->data.s390.psw_addr, info->data.s390.reason); break; + case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_TDX: + if (info->data.tdx.has_gpa) + ret =3D g_strdup_printf("tdx: error_code=3D'0x%x' message=3D'%= s' " + "additional error information can be fou= nd " + "at gpa page: '0x%016llx'", + info->data.tdx.error_code, + info->data.tdx.message, + info->data.tdx.gpa); + else + ret =3D g_strdup_printf("tdx: error_code=3D'0x%x' message=3D'%= s'", + info->data.tdx.error_code, + info->data.tdx.message); + break; case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_NONE: case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_LAST: break; @@ -3931,6 +3944,9 @@ qemuMonitorEventPanicInfoFree(qemuMonitorEventPanicIn= fo *info) case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_S390: g_free(info->data.s390.reason); break; + case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_TDX: + g_free(info->data.tdx.message); + break; case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_NONE: case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_HYPERV: case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_LAST: diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 6030c31598..98eabbb89f 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -38,6 +38,7 @@ typedef enum { QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_NONE =3D 0, QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_HYPERV, QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_S390, + QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_TDX, =20 QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_LAST } qemuMonitorEventPanicInfoType; @@ -61,12 +62,22 @@ struct _qemuMonitorEventPanicInfoS390 { char *reason; }; =20 +typedef struct _qemuMonitorEventPanicInfoTDX qemuMonitorEventPanicInfoTDX; +struct _qemuMonitorEventPanicInfoTDX { + /* TDX specific guest panic information */ + int error_code; + char *message; + bool has_gpa; + unsigned long long gpa; +}; + typedef struct _qemuMonitorEventPanicInfo qemuMonitorEventPanicInfo; struct _qemuMonitorEventPanicInfo { qemuMonitorEventPanicInfoType type; union { qemuMonitorEventPanicInfoHyperv hyperv; qemuMonitorEventPanicInfoS390 s390; + qemuMonitorEventPanicInfoTDX tdx; } data; }; =20 diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 5297ffb027..6c2051ebfb 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -621,6 +621,36 @@ qemuMonitorJSONGuestPanicExtractInfoS390(virJSONValue = *data) return g_steal_pointer(&ret); } =20 +static qemuMonitorEventPanicInfo * +qemuMonitorJSONGuestPanicExtractInfoTDX(virJSONValue *data) +{ + g_autoptr(qemuMonitorEventPanicInfo) ret =3D NULL; + int error_code; + unsigned long long gpa; + const char *message =3D NULL; + bool has_gpa; + + ret =3D g_new0(qemuMonitorEventPanicInfo, 1); + + ret->type =3D QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_TDX; + has_gpa =3D virJSONValueObjectHasKey(data, "gpa"); + + if (virJSONValueObjectGetNumberInt(data, "error-code", &error_code) < = 0 || + !(message =3D virJSONValueObjectGetString(data, "message")) || + (has_gpa && virJSONValueObjectGetNumberUlong(data, "gpa", &gpa) < = 0)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("malformed TDX pani= c data")); + return NULL; + } + + ret->data.tdx.error_code =3D error_code; + ret->data.tdx.gpa =3D gpa; + ret->data.tdx.has_gpa =3D has_gpa; + + ret->data.tdx.message =3D g_strdup(message); + + return g_steal_pointer(&ret); +} + static qemuMonitorEventPanicInfo * qemuMonitorJSONGuestPanicExtractInfo(virJSONValue *data) { @@ -630,6 +660,8 @@ qemuMonitorJSONGuestPanicExtractInfo(virJSONValue *data) return qemuMonitorJSONGuestPanicExtractInfoHyperv(data); else if (STREQ_NULLABLE(type, "s390")) return qemuMonitorJSONGuestPanicExtractInfoS390(data); + else if (STREQ_NULLABLE(type, "tdx")) + return qemuMonitorJSONGuestPanicExtractInfoTDX(data); =20 virReportError(VIR_ERR_INTERNAL_ERROR, _("unknown panic info type '%1$s'"), NULLSTR(type)); --=20 2.47.1