From: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
To: Igor Mammedov <imammedo@redhat.com>,
"Michael S . Tsirkin" <mst@redhat.com>
Cc: Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Shiju Jose <shiju.jose@huawei.com>,
qemu-arm@nongnu.org, qemu-devel@nongnu.org,
Mauro Carvalho Chehab <mchehab+huawei@kernel.org>,
Ani Sinha <anisinha@redhat.com>,
Dongjiu Geng <gengdongjiu1@gmail.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH v6 07/19] acpi/ghes: Use HEST table offsets when preparing GHES records
Date: Thu, 27 Feb 2025 17:00:45 +0100 [thread overview]
Message-ID: <fd14cbb98c05e2e1ce79b86fe4b83c62b5eb30bb.1740671863.git.mchehab+huawei@kernel.org> (raw)
In-Reply-To: <cover.1740671863.git.mchehab+huawei@kernel.org>
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 <mchehab+huawei@kernel.org>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
---
hw/acpi/ghes.c | 100 +++++++++++++++++++++++++++++++++++++++++
include/hw/acpi/ghes.h | 2 +-
2 files changed, 101 insertions(+), 1 deletion(-)
diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c
index cbc96c1909f0..668ca72587c7 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
+/*
+ * 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
+/*
+ * 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 = ghes_addr + sizeof(uint64_t);
}
+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 += ACPI_DESC_HEADER_OFFSET;
+
+ cpu_physical_memory_read(hest_addr, &num_sources,
+ sizeof(num_sources));
+ num_sources = le32_to_cpu(num_sources);
+
+ err_source_entry = hest_addr + sizeof(num_sources);
+
+ /*
+ * Currently, HEST Error source navigates only for GHESv2 tables
+ */
+ for (i = 0; i < num_sources; i++) {
+ uint64_t addr = err_source_entry;
+ uint16_t type, src_id;
+
+ cpu_physical_memory_read(addr, &type, sizeof(type));
+ type = le16_to_cpu(type);
+
+ /* For now, we only know the size of GHESv2 table */
+ if (type != 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 += sizeof(type);
+ cpu_physical_memory_read(addr, &src_id, sizeof(src_id));
+ if (le16_to_cpu(src_id) == source_id) {
+ break;
+ }
+
+ err_source_entry += HEST_GHES_V2_ENTRY_SIZE;
+ }
+ if (i == num_sources) {
+ error_setg(errp, "HEST: Source %d not found.", source_id);
+ return;
+ }
+
+ /* Navigate through table address pointers */
+ hest_err_block_addr = 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 = le64_to_cpu(error_block_addr);
+
+ cpu_physical_memory_read(error_block_addr, cper_addr,
+ sizeof(*cper_addr));
+ *cper_addr = le64_to_cpu(*cper_addr);
+
+ hest_read_ack_addr = 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 = 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);
}
cpu_physical_memory_read(read_ack_register_addr,
diff --git a/include/hw/acpi/ghes.h b/include/hw/acpi/ghes.h
index ea9baab764e2..5265102ba51f 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;
void acpi_build_hest(AcpiGhesState *ags, GArray *table_data,
--
2.48.1
next prev parent reply other threads:[~2025-02-27 16:03 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-27 16:00 [PATCH v6 00/19] Change ghes to use HEST-based offsets and add support for error inject Mauro Carvalho Chehab
2025-02-27 16:00 ` [PATCH v6 01/19] tests/acpi: virt: add an empty HEST file Mauro Carvalho Chehab
2025-02-28 9:16 ` Jonathan Cameron via
2025-02-27 16:00 ` [PATCH v6 02/19] tests/qtest/bios-tables-test: extend to also check HEST table Mauro Carvalho Chehab
2025-02-28 9:17 ` Jonathan Cameron via
2025-02-27 16:00 ` [PATCH v6 03/19] tests/acpi: virt: update HEST file with its current data Mauro Carvalho Chehab
2025-02-28 9:18 ` Jonathan Cameron via
2025-02-27 16:00 ` [PATCH v6 04/19] acpi/ghes: Cleanup the code which gets ghes ged state Mauro Carvalho Chehab
2025-02-28 9:19 ` Jonathan Cameron via
2025-02-27 16:00 ` [PATCH v6 05/19] acpi/ghes: prepare to change the way HEST offsets are calculated Mauro Carvalho Chehab
2025-02-28 9:26 ` Jonathan Cameron via
2025-02-28 12:57 ` Igor Mammedov
2025-02-27 16:00 ` [PATCH v6 06/19] acpi/ghes: add a firmware file with HEST address Mauro Carvalho Chehab
2025-02-27 16:00 ` Mauro Carvalho Chehab [this message]
2025-02-27 16:00 ` [PATCH v6 08/19] acpi/ghes: don't hard-code the number of sources for HEST table Mauro Carvalho Chehab
2025-02-27 16:00 ` [PATCH v6 09/19] acpi/ghes: add a notifier to notify when error data is ready Mauro Carvalho Chehab
2025-02-28 12:58 ` Igor Mammedov
2025-02-27 16:00 ` [PATCH v6 10/19] acpi/generic_event_device: Update GHES migration to cover hest addr Mauro Carvalho Chehab
2025-02-27 16:00 ` [PATCH v6 11/19] acpi/generic_event_device: add logic to detect if HEST addr is available Mauro Carvalho Chehab
2025-02-27 16:00 ` [PATCH v6 12/19] acpi/generic_event_device: add an APEI error device Mauro Carvalho Chehab
2025-02-27 16:00 ` [PATCH v6 13/19] tests/acpi: virt: allow acpi table changes at DSDT and HEST tables Mauro Carvalho Chehab
2025-02-28 9:28 ` Jonathan Cameron via
2025-02-27 16:00 ` [PATCH v6 14/19] arm/virt: Wire up a GED error device for ACPI / GHES Mauro Carvalho Chehab
2025-02-27 16:00 ` [PATCH v6 15/19] qapi/acpi-hest: add an interface to do generic CPER error injection Mauro Carvalho Chehab
2025-02-27 16:00 ` [PATCH v6 16/19] acpi/generic_event_device.c: enable use_hest_addr for QEMU 10.x Mauro Carvalho Chehab
2025-02-28 9:29 ` Jonathan Cameron via
2025-02-28 12:59 ` Igor Mammedov
2025-02-27 16:00 ` [PATCH v6 17/19] tests/acpi: virt: update HEST and DSDT tables Mauro Carvalho Chehab
2025-02-28 9:33 ` Jonathan Cameron via
2025-02-28 9:44 ` Mauro Carvalho Chehab
2025-02-28 13:04 ` Igor Mammedov
2025-02-27 16:00 ` [PATCH v6 18/19] docs: hest: add new "etc/acpi_table_hest_addr" and update workflow Mauro Carvalho Chehab
2025-02-28 9:36 ` Jonathan Cameron via
2025-02-28 13:08 ` Igor Mammedov
2025-02-27 16:00 ` [PATCH v6 19/19] scripts/ghes_inject: add a script to generate GHES error inject Mauro Carvalho Chehab
2025-02-27 16:43 ` [PATCH v6 00/19] Change ghes to use HEST-based offsets and add support for " Igor Mammedov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fd14cbb98c05e2e1ce79b86fe4b83c62b5eb30bb.1740671863.git.mchehab+huawei@kernel.org \
--to=mchehab+huawei@kernel.org \
--cc=Jonathan.Cameron@huawei.com \
--cc=anisinha@redhat.com \
--cc=gengdongjiu1@gmail.com \
--cc=imammedo@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=shiju.jose@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).