From nobody Fri Nov 14 23:27:54 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; 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=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1759691915; cv=none; d=zohomail.com; s=zohoarc; b=JXkM+K9dSGpTM7psmJuumVQUdhRBRgdhvGsO0mwe5ilWONctDHkR5TryZI031YT1M2C1/WmWI3pvWHdOe8mZHGVXDB6QeMPt6unuJcT/QVa7tvB0ggX91RHlrqP5B0MkliIp0wBluv4ciUPJJRt6FDnDA2naGCDYK+1iTL4awFQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1759691915; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=KJibYfYpYtxiVqZnl6aI5IzK4xu2t0BO2IPKoEwaGFY=; b=hq5N5V26iuZfReP6oLZ/IZFIeeH7lEhD8mrqfc2sL5eD/my/UKhA66efzg1HDoEjLsmkUOi3kNjlhXWrSfPD4ir83zwrcLymCDck4s0Vb7LB008MnOho/Ik4tOMqnN/L/cw/if851O/E7YYIGYxQqX9VtZuRPkBJTEIC566PtLg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=quarantine dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1759691915705722.9797318169315; Sun, 5 Oct 2025 12:18:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v5UE6-0007gi-Sn; Sun, 05 Oct 2025 15:17:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v5UDz-0007f0-20 for qemu-devel@nongnu.org; Sun, 05 Oct 2025 15:16:51 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v5UDx-0006QN-EX for qemu-devel@nongnu.org; Sun, 05 Oct 2025 15:16:50 -0400 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-517-Q5yMXP6vPBKcIgfuW6bh7w-1; Sun, 05 Oct 2025 15:16:47 -0400 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-46e35baddc1so22644295e9.2 for ; Sun, 05 Oct 2025 12:16:47 -0700 (PDT) Received: from redhat.com ([2a0d:6fc0:1518:6900:b69a:73e1:9698:9cd3]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-46e723432c9sm124137125e9.1.2025.10.05.12.16.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 05 Oct 2025 12:16:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1759691808; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=KJibYfYpYtxiVqZnl6aI5IzK4xu2t0BO2IPKoEwaGFY=; b=YT+58reBFxJ/9OAqsk+b6rbzKKhLuWL+9dyTnL7z1aqWBAckhivY72CtB6vaTMaqgZZgxh 45EmlQW3X1aLKhNfCzZHFeGIBVtRUZvQJ5EbJKSUuQcTBBVmho1GrYeH3Wz5UyEWoZeWK0 U198XG9+B0uEDOHPf11rD3zF2Kyr+SQ= X-MC-Unique: Q5yMXP6vPBKcIgfuW6bh7w-1 X-Mimecast-MFC-AGG-ID: Q5yMXP6vPBKcIgfuW6bh7w_1759691806 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759691806; x=1760296606; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=KJibYfYpYtxiVqZnl6aI5IzK4xu2t0BO2IPKoEwaGFY=; b=Ddq0D+PxqGaYJbcEP4LyvonTH3RFBOsRuqKbW8+OMZejFJmDv4OS0cX5pPas/gnk2n K30K42NJImKbHZSpumLZJNhM23h16Z0Kld14PybMtfd5qT0nOxSoHcurpwVqLXdOBy4D 0F5uO7KVuRy+eMvYqZL45uuqLdHmABa5GFUh/kI0fV3hjbSdzqC+2RuLYKrTV7+49zBx vXnjchkvuaWoS/ihXCM1Iymy6N4JWgTZR65+cK/1GZbVLnQg0wHstsLwNz4rHopvBvxC ZHmU7ux4/ySqc8+LHXe6X8SEQmNizQKveD25uHFRVvdwew34fSnmX3h/wWOLdwxfn5Ua vxfA== X-Gm-Message-State: AOJu0YzaMxbJ+eR+v4jvly9LgUzuQ4p9kW8VB5RZYxFtYEiHW0d/bJWh v0+/l8Qc3KMMZLaU7jm/odE7qs5Xxy1rnPq+q/FNXR8jZbfiDMLuSY+E1SEksD6rO4f4lDgJqNU Fb1iUFPBDACmFkVCeNU/2TZ59gdm/Ck2sHIA10aW3A+QPu1zdJH1QjNnSUP3f+pchxaoAhG6qyP Qki2k0cG/zuuGhrP9wlLWJiDJ8CkxuPdyfEw== X-Gm-Gg: ASbGncsNOf/CzfPoIWgE++fua7f0hks1h0FeSUWvWxdyKF2zXziJ+Ci5qcTZPXa4h5o LO5Gr8LNdApvB4EGroq1QlG4ZNHQ/9DagvbVJgM3awA+HmzHeCBlZwBomdRlpu8EMjLlblWwoDl bVFDQnRJwmu/6atRCKjKu+/qaxZCHWID3OkW34Q0QW/RAbuqsgPlBdx1n6N01Yo82O5U3rdsGaL 1RIjN5sSWN1+wgc8xPoPiq/Dv8JBxJrvsaLnIXpFo9Davi8wk8LYieKr10C7nSv04RvP8O+wdOO cUbJpUredtrT4onpWBeZD8m95/BaoNRLDBuvIFs= X-Received: by 2002:a05:600c:3d9b:b0:46e:45fd:946e with SMTP id 5b1f17b1804b1-46e711474c0mr79374685e9.31.1759691805849; Sun, 05 Oct 2025 12:16:45 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGXvSC4mMBfZswAakLq/v+QW6TW6WS+i3dHLhzCs7je25xzjM6vHgSWsV2vtseAs0CZmk3jcQ== X-Received: by 2002:a05:600c:3d9b:b0:46e:45fd:946e with SMTP id 5b1f17b1804b1-46e711474c0mr79374485e9.31.1759691805342; Sun, 05 Oct 2025 12:16:45 -0700 (PDT) Date: Sun, 5 Oct 2025 15:16:43 -0400 From: "Michael S. Tsirkin" To: qemu-devel@nongnu.org Cc: Peter Maydell , Mauro Carvalho Chehab , Jonathan Cameron , Igor Mammedov , Dongjiu Geng , Ani Sinha , qemu-arm@nongnu.org Subject: [PULL 19/75] acpi/ghes: Use HEST table offsets when preparing GHES records Message-ID: References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-Mailer: git-send-email 2.27.0.106.g8ac3dc51b1 X-Mutt-Fcc: =sent 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=170.10.129.124; envelope-from=mst@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.43, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=unavailable 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-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1759691918420116600 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Mauro Carvalho Chehab There are two pointers that are needed during error injection: 1. The start address of the CPER block to be stored; 2. The address of the read ack. It is preferable to calculate them from the HEST table. This allows checking the source ID, the size of the table and the type of the HEST error block structures. Yet, keep the old code, as this is needed for migration purposes from older QEMU versions. Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron Reviewed-by: Igor Mammedov Reviewed-by: Michael S. Tsirkin Message-ID: Signed-off-by: Michael S. Tsirkin --- include/hw/acpi/ghes.h | 2 +- hw/acpi/ghes.c | 100 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) diff --git a/include/hw/acpi/ghes.h b/include/hw/acpi/ghes.h index ea9baab764..5265102ba5 100644 --- a/include/hw/acpi/ghes.h +++ b/include/hw/acpi/ghes.h @@ -78,7 +78,7 @@ enum { typedef struct AcpiGhesState { uint64_t hest_addr_le; uint64_t hw_error_le; - bool use_hest_addr; /* Currently, always false */ + bool use_hest_addr; /* True if HEST address is present */ } AcpiGhesState; =20 void acpi_build_hest(AcpiGhesState *ags, GArray *table_data, diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c index cbc96c1909..668ca72587 100644 --- a/hw/acpi/ghes.c +++ b/hw/acpi/ghes.c @@ -41,6 +41,12 @@ /* Address offset in Generic Address Structure(GAS) */ #define GAS_ADDR_OFFSET 4 =20 +/* + * ACPI spec 1.0b + * 5.2.3 System Description Table Header + */ +#define ACPI_DESC_HEADER_OFFSET 36 + /* * The total size of Generic Error Data Entry * ACPI 6.1/6.2: 18.3.2.7.1 Generic Error Data, @@ -61,6 +67,30 @@ */ #define ACPI_GHES_GESB_SIZE 20 =20 +/* + * See the memory layout map at docs/specs/acpi_hest_ghes.rst. + */ + +/* + * ACPI 6.1: 18.3.2.8 Generic Hardware Error Source version 2 + * Table 18-344 Generic Hardware Error Source version 2 (GHESv2) Structure + */ +#define HEST_GHES_V2_ENTRY_SIZE 92 + +/* + * ACPI 6.1: 18.3.2.8 Generic Hardware Error Source version 2 + * Table 18-344 Generic Hardware Error Source version 2 (GHESv2) Structure + * Read Ack Register + */ +#define GHES_READ_ACK_ADDR_OFF 64 + +/* + * ACPI 6.1: 18.3.2.7: Generic Hardware Error Source + * Table 18-341 Generic Hardware Error Source Structure + * Error Status Address + */ +#define GHES_ERR_STATUS_ADDR_OFF 20 + /* * Values for error_severity field */ @@ -408,6 +438,73 @@ static void get_hw_error_offsets(uint64_t ghes_addr, *read_ack_register_addr =3D ghes_addr + sizeof(uint64_t); } =20 +static void get_ghes_source_offsets(uint16_t source_id, + uint64_t hest_addr, + uint64_t *cper_addr, + uint64_t *read_ack_start_addr, + Error **errp) +{ + uint64_t hest_err_block_addr, hest_read_ack_addr; + uint64_t err_source_entry, error_block_addr; + uint32_t num_sources, i; + + hest_addr +=3D ACPI_DESC_HEADER_OFFSET; + + cpu_physical_memory_read(hest_addr, &num_sources, + sizeof(num_sources)); + num_sources =3D le32_to_cpu(num_sources); + + err_source_entry =3D hest_addr + sizeof(num_sources); + + /* + * Currently, HEST Error source navigates only for GHESv2 tables + */ + for (i =3D 0; i < num_sources; i++) { + uint64_t addr =3D err_source_entry; + uint16_t type, src_id; + + cpu_physical_memory_read(addr, &type, sizeof(type)); + type =3D le16_to_cpu(type); + + /* For now, we only know the size of GHESv2 table */ + if (type !=3D ACPI_GHES_SOURCE_GENERIC_ERROR_V2) { + error_setg(errp, "HEST: type %d not supported.", type); + return; + } + + /* Compare CPER source ID at the GHESv2 structure */ + addr +=3D sizeof(type); + cpu_physical_memory_read(addr, &src_id, sizeof(src_id)); + if (le16_to_cpu(src_id) =3D=3D source_id) { + break; + } + + err_source_entry +=3D HEST_GHES_V2_ENTRY_SIZE; + } + if (i =3D=3D num_sources) { + error_setg(errp, "HEST: Source %d not found.", source_id); + return; + } + + /* Navigate through table address pointers */ + hest_err_block_addr =3D err_source_entry + GHES_ERR_STATUS_ADDR_OFF + + GAS_ADDR_OFFSET; + + cpu_physical_memory_read(hest_err_block_addr, &error_block_addr, + sizeof(error_block_addr)); + error_block_addr =3D le64_to_cpu(error_block_addr); + + cpu_physical_memory_read(error_block_addr, cper_addr, + sizeof(*cper_addr)); + *cper_addr =3D le64_to_cpu(*cper_addr); + + hest_read_ack_addr =3D err_source_entry + GHES_READ_ACK_ADDR_OFF + + GAS_ADDR_OFFSET; + cpu_physical_memory_read(hest_read_ack_addr, read_ack_start_addr, + sizeof(*read_ack_start_addr)); + *read_ack_start_addr =3D le64_to_cpu(*read_ack_start_addr); +} + void ghes_record_cper_errors(AcpiGhesState *ags, const void *cper, size_t = len, uint16_t source_id, Error **errp) { @@ -423,6 +520,9 @@ void ghes_record_cper_errors(AcpiGhesState *ags, const = void *cper, size_t len, if (!ags->use_hest_addr) { get_hw_error_offsets(le64_to_cpu(ags->hw_error_le), &cper_addr, &read_ack_register_addr); + } else { + get_ghes_source_offsets(source_id, le64_to_cpu(ags->hest_addr_le), + &cper_addr, &read_ack_register_addr, errp); } =20 cpu_physical_memory_read(read_ack_register_addr, --=20 MST