freeipmi-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]