[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Freeipmi-devel] [PATCH 2/5] Split RSDT/XSDT parsing into new function
From: |
dann frazier |
Subject: |
[Freeipmi-devel] [PATCH 2/5] Split RSDT/XSDT parsing into new function |
Date: |
Tue, 31 Jul 2018 11:42:24 -0600 |
In preparation for adding a new ACPI table retrieval method, split the
existing code that retrieves tables out of /dev/mem into a new function.
No functional change intended.
---
libfreeipmi/locate/ipmi-locate-acpi-spmi.c | 109 +++++++++++++++++----
1 file changed, 88 insertions(+), 21 deletions(-)
diff --git a/libfreeipmi/locate/ipmi-locate-acpi-spmi.c
b/libfreeipmi/locate/ipmi-locate-acpi-spmi.c
index e710ede05..abfb987e1 100644
--- a/libfreeipmi/locate/ipmi-locate-acpi-spmi.c
+++ b/libfreeipmi/locate/ipmi-locate-acpi-spmi.c
@@ -593,6 +593,11 @@ static int _ipmi_acpi_get_table (ipmi_locate_ctx_t ctx,
char *signature,
uint8_t **acpi_table,
uint32_t *acpi_table_length);
+static int _ipmi_acpi_get_table_dev_mem (ipmi_locate_ctx_t ctx,
+ char *signature,
+ unsigned int table_instance,
+ uint8_t **acpi_table,
+ uint32_t *acpi_table_length);
static int _ipmi_acpi_get_firmware_table (ipmi_locate_ctx_t ctx,
char *signature,
unsigned int table_instance,
@@ -1131,16 +1136,16 @@ _ipmi_acpi_get_table (ipmi_locate_ctx_t ctx,
/*******************************************************************************
*
* FUNCTION:
- * _ipmi_acpi_get_firmware_table
+ * _ipmi_acpi_get_firmware_table_dev_mem
*
* PARAMETERS:
- * signature - ACPI signature for firmware table header
- * table_instance - Which instance of the firmware table
- * sign_table_data - Initialized with malloc'ed ACPI firmware table
data
- * sign_table_data_length - ACPI table DATA length
+ * signature - ACPI signature for firmware table header
+ * table_instance - Which instance of the firmware table
+ * acpi_table - Initialized with malloc'ed ACPI firmware table data
+ * acpi_table_length - ACPI table DATA length
*
* RETURN:
- * return (0) for success. ACPI table header and firmware table DATA are
+ * return (0) for success. ACPI table (including header) is
* returned through the signed_table_data parameter.
*
* DESCRIPTION:
@@ -1149,11 +1154,11 @@ _ipmi_acpi_get_table (ipmi_locate_ctx_t ctx,
*
******************************************************************************/
static int
-_ipmi_acpi_get_firmware_table (ipmi_locate_ctx_t ctx,
- char *signature,
- unsigned int table_instance,
- uint8_t **sign_table_data,
- uint32_t *sign_table_data_length)
+_ipmi_acpi_get_table_dev_mem (ipmi_locate_ctx_t ctx,
+ char *signature,
+ unsigned int table_instance,
+ uint8_t **acpi_table,
+ uint32_t *acpi_table_length)
{
uint64_t val;
@@ -1170,8 +1175,6 @@ _ipmi_acpi_get_firmware_table (ipmi_locate_ctx_t ctx,
uint8_t *rsdt_xsdt_table_data;
uint32_t rsdt_xsdt_table_data_length;
unsigned int acpi_table_count;
- uint8_t *acpi_table = NULL;
- uint32_t acpi_table_length;
fiid_obj_t obj_table = NULL;
uint64_t table_address;
@@ -1192,10 +1195,10 @@ _ipmi_acpi_get_firmware_table (ipmi_locate_ctx_t ctx,
assert (ctx);
assert (ctx->magic == IPMI_LOCATE_CTX_MAGIC);
assert (signature);
- assert (sign_table_data);
- assert (sign_table_data_length);
+ assert (acpi_table);
+ assert (acpi_table_length);
- *sign_table_data = NULL;
+ *acpi_table = NULL;
if ((acpi_table_hdr_length = fiid_template_len_bytes (tmpl_acpi_table_hdr))
< 0)
{
@@ -1319,8 +1322,8 @@ _ipmi_acpi_get_firmware_table (ipmi_locate_ctx_t ctx,
if (_ipmi_acpi_get_table (ctx,
table_address,
signature,
- &acpi_table,
- &acpi_table_length) < 0)
+ acpi_table,
+ acpi_table_length) < 0)
continue;
signature_table_count++;
@@ -1338,6 +1341,73 @@ _ipmi_acpi_get_firmware_table (ipmi_locate_ctx_t ctx,
goto cleanup;
}
+ rv = 0;
+ cleanup:
+ free (rsdt_xsdt_table);
+ fiid_obj_destroy (obj_table);
+ fiid_obj_destroy (obj_acpi_rsdp_descriptor);
+ return (rv);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:
+ * _ipmi_acpi_get_firmware_table
+ *
+ * PARAMETERS:
+ * signature - ACPI signature for firmware table header
+ * table_instance - Which instance of the firmware table
+ * sign_table_data - Initialized with malloc'ed ACPI firmware table
data
+ * sign_table_data_length - ACPI table DATA length
+ *
+ * RETURN:
+ * return (0) for success. ACPI table (including header) is returned
+ * through the signed_table_data parameter.
+ *
+ * DESCRIPTION:
+ * Top level call for any ACPI firmware table by table signature string.
+ *
+
******************************************************************************/
+static int
+_ipmi_acpi_get_firmware_table (ipmi_locate_ctx_t ctx,
+ char *signature,
+ unsigned int table_instance,
+ uint8_t **sign_table_data,
+ uint32_t *sign_table_data_length)
+{
+ uint64_t val;
+
+ int acpi_table_hdr_length;
+ int acpi_rsdp_descriptor_length;
+
+ uint8_t *acpi_table = NULL;
+ uint32_t acpi_table_length;
+
+ int rv = -1;
+
+ assert (ctx);
+ assert (ctx->magic == IPMI_LOCATE_CTX_MAGIC);
+ assert (signature);
+ assert (sign_table_data);
+ assert (sign_table_data_length);
+
+ *sign_table_data = NULL;
+
+ if ((_ipmi_acpi_get_table_dev_mem (ctx, signature,
+ table_instance,
+ &acpi_table,
+ &acpi_table_length) != 0))
+ {
+ LOCATE_SET_ERRNUM (ctx, IPMI_LOCATE_ERR_SYSTEM_ERROR);
+ goto cleanup;
+ }
+
+ if (!acpi_table)
+ {
+ LOCATE_SET_ERRNUM (ctx, IPMI_LOCATE_ERR_SYSTEM_ERROR);
+ goto cleanup;
+ }
+
*sign_table_data_length = acpi_table_length;
if (!(*sign_table_data = malloc (*sign_table_data_length)))
{
@@ -1349,9 +1419,6 @@ _ipmi_acpi_get_firmware_table (ipmi_locate_ctx_t ctx,
rv = 0;
cleanup:
free (acpi_table);
- free (rsdt_xsdt_table);
- fiid_obj_destroy (obj_table);
- fiid_obj_destroy (obj_acpi_rsdp_descriptor);
return (rv);
}
--
2.18.0
- [Freeipmi-devel] [PATCH 0/5] Parse SPMI tables using sysfs, dann frazier, 2018/07/31
- [Freeipmi-devel] [PATCH 4/5] Allow sysfs SPMI parsing on ARM platforms, dann frazier, 2018/07/31
- [Freeipmi-devel] [PATCH 3/5] Add support for parsing SPMI table exposed via sysfs, dann frazier, 2018/07/31
- [Freeipmi-devel] [PATCH 2/5] Split RSDT/XSDT parsing into new function,
dann frazier <=
- [Freeipmi-devel] [PATCH 1/5] Don't try to separate the header from the ACPI table data, dann frazier, 2018/07/31
- [Freeipmi-devel] [PATCH 5/5] Correct order of bytes in specification_revision field of ACPI SPMI table, dann frazier, 2018/07/31
- Re: [Freeipmi-devel] [PATCH 0/5] Parse SPMI tables using sysfs, Albert Chu, 2018/07/31