Add helper to parse BL31 parameters (both versions)
authorJulius Werner <jwerner@chromium.org>
Thu, 30 May 2019 00:01:46 +0000 (17:01 -0700)
committerJulius Werner <jwerner@chromium.org>
Wed, 24 Jul 2019 03:25:34 +0000 (20:25 -0700)
BL31 used to take a single bl31_params_t parameter structure with entry
point information in arg0. In commit 726002263 (Add new version of image
loading.) this API was changed to a more flexible linked list approach,
and the old parameter structure was copied into all platforms that still
used the old format. This duplicated code unnecessarily among all these
platforms.

This patch adds a helper function that platforms can optionally link to
outsource the task of interpreting arg0. Many platforms are just
interested in the BL32 and BL33 entry point information anyway. Since
some platforms still need to support the old version 1 parameters, the
helper will support both formats when ERROR_DEPRECATED == 0. This allows
those platforms to drop a bunch of boilerplate code and asynchronously
update their BL2 implementation to the newer format.

Change-Id: I9e6475adb1a7d4bccea666118bd1c54962e9fc38
Signed-off-by: Julius Werner <jwerner@chromium.org>
common/desc_image_load.c
include/common/desc_image_load.h

index 405bb83486efc863fa17ec216b8cbd15973fec6d..f2e8f60546a4ea61d31458819ac0486e381b6dde 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2016-2019, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -9,6 +9,7 @@
 #include <arch_helpers.h>
 #include <common/bl_common.h>
 #include <common/desc_image_load.h>
+#include <common/tbbr/tbbr_img_def.h>
 
 static bl_load_info_t bl_load_info;
 static bl_params_t next_bl_params;
@@ -275,3 +276,47 @@ void populate_next_bl_params_config(bl_params_t *bl2_to_next_bl_params)
                }
        }
 }
+
+/*******************************************************************************
+ * Helper to extract BL32/BL33 entry point info from arg0 passed to BL31, for
+ * platforms that are only interested in those. Platforms that need to extract
+ * more information can parse the structures themselves.
+ ******************************************************************************/
+
+void bl31_params_parse_helper(u_register_t param,
+                             entry_point_info_t *bl32_ep_info_out,
+                             entry_point_info_t *bl33_ep_info_out)
+{
+       bl_params_node_t *node;
+       bl_params_t *v2 = (void *)(uintptr_t)param;
+
+#if !ERROR_DEPRECATED
+       if (v2->h.version == PARAM_VERSION_1) {
+               struct { /* Deprecated version 1 parameter structure. */
+                       param_header_t h;
+                       image_info_t *bl31_image_info;
+                       entry_point_info_t *bl32_ep_info;
+                       image_info_t *bl32_image_info;
+                       entry_point_info_t *bl33_ep_info;
+                       image_info_t *bl33_image_info;
+               } *v1 = (void *)(uintptr_t)param;
+               assert(v1->h.type == PARAM_BL31);
+               if (bl32_ep_info_out)
+                       *bl32_ep_info_out = *v1->bl32_ep_info;
+               if (bl33_ep_info_out)
+                       *bl33_ep_info_out = *v1->bl33_ep_info;
+               return;
+       }
+#endif /* !ERROR_DEPRECATED */
+
+       assert(v2->h.version == PARAM_VERSION_2);
+       assert(v2->h.type == PARAM_BL_PARAMS);
+       for (node = v2->head; node; node = node->next_params_info) {
+               if (node->image_id == BL32_IMAGE_ID)
+                       if (bl32_ep_info_out)
+                               *bl32_ep_info_out = *node->ep_info;
+               if (node->image_id == BL33_IMAGE_ID)
+                       if (bl33_ep_info_out)
+                               *bl33_ep_info_out = *node->ep_info;
+       }
+}
index e46eb2796688d044a1b56f8ce8a288a51382f9b8..b044f3e75411d371da2f18fe5548906c5c0249b4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2016-2019, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -40,4 +40,9 @@ bl_load_info_t *get_bl_load_info_from_mem_params_desc(void);
 bl_params_t *get_next_bl_params_from_mem_params_desc(void);
 void populate_next_bl_params_config(bl_params_t *bl2_to_next_bl_params);
 
+/* Helper to extract BL32/BL33 entry point info from arg0 passed to BL31. */
+void bl31_params_parse_helper(u_register_t param,
+                             entry_point_info_t *bl32_ep_info_out,
+                             entry_point_info_t *bl33_ep_info_out);
+
 #endif /* DESC_IMAGE_LOAD_H */