Add image_id to bl1_plat_handle_post/pre_image_load()
authorSoby Mathew <soby.mathew@arm.com>
Thu, 8 Feb 2018 17:45:12 +0000 (17:45 +0000)
committerSoby Mathew <soby.mathew@arm.com>
Mon, 26 Feb 2018 16:29:29 +0000 (16:29 +0000)
This patch adds an argument to bl1_plat_post/pre_image_load() APIs
to make it more future proof. The default implementation of
these are moved to `plat_bl1_common.c` file.

These APIs are now invoked appropriately in the FWU code path prior
to or post image loading by BL1 and are not restricted
to LOAD_IMAGE_V2.

The patch also reorganizes some common platform files. The previous
`plat_bl2_el3_common.c` and `platform_helpers_default.c` files are
merged into a new `plat_bl_common.c` file.

NOTE: The addition of an argument to the above mentioned platform APIs
is not expected to have a great impact because these APIs were only
recently added and are unlikely to be used.

Change-Id: I0519caaee0f774dd33638ff63a2e597ea178c453
Signed-off-by: Soby Mathew <soby.mathew@arm.com>
Makefile
bl1/bl1_fwu.c
bl1/bl1_main.c
bl2/bl2.mk
docs/porting-guide.rst
include/plat/common/platform.h
plat/common/plat_bl1_common.c
plat/common/plat_bl2_el3_common.c [deleted file]
plat/common/plat_bl_common.c [new file with mode: 0644]
plat/common/platform_helpers_default.c [deleted file]

index 83b8808d10ed37eb4c61a4f3f16fc7a0679bb53a..06422eaac8ecec796ee0a602666e4745fe3bf7fa 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -192,8 +192,8 @@ BL_COMMON_SOURCES   +=      common/bl_common.c                      \
                                common/${ARCH}/debug.S                  \
                                lib/${ARCH}/cache_helpers.S             \
                                lib/${ARCH}/misc_helpers.S              \
+                               plat/common/plat_bl_common.c            \
                                plat/common/plat_log_common.c           \
-                               plat/common/platform_helpers_default.c  \
                                plat/common/${ARCH}/plat_common.c       \
                                plat/common/${ARCH}/platform_helpers.S  \
                                ${COMPILER_RT_SRCS}                     \
index 07a7fc8143d5d08cd5f35bbb6d6a0c3aa63b0427..387808334c99c5ba75d7dd551458e186a8f856f8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -350,6 +350,15 @@ static int bl1_fwu_image_copy(unsigned int image_id,
                return -ENOMEM;
        }
 
+       /* Allow the platform to handle pre-image load before copying */
+       if (image_desc->state == IMAGE_STATE_RESET) {
+               if (bl1_plat_handle_pre_image_load(image_id) != 0) {
+                       ERROR("BL1-FWU: Failure in pre-image load of image id %d\n",
+                                       image_id);
+                       return -EPERM;
+               }
+       }
+
        /* Everything looks sane. Go ahead and copy the block of data. */
        dest_addr = image_desc->image_info.image_base + image_desc->copied_size;
        memcpy((void *) dest_addr, (const void *) image_src, block_size);
@@ -474,6 +483,18 @@ static int bl1_fwu_image_auth(unsigned int image_id,
        /* Indicate that image is in authenticated state. */
        image_desc->state = IMAGE_STATE_AUTHENTICATED;
 
+       /* Allow the platform to handle post-image load */
+       result = bl1_plat_handle_post_image_load(image_id);
+       if (result != 0) {
+               ERROR("BL1-FWU: Failure %d in post-image load of image id %d\n",
+                               result, image_id);
+               /*
+                * Panic here as the platform handling of post-image load is
+                * not correct.
+                */
+               plat_error_handler(result);
+       }
+
        /*
         * Flush image_info to memory so that other
         * secure world images can see changes.
index 91b5f0b168210bc4b0b3c77ae305375d1e8a54f9..fe09070b9af6987ecc8cc18b8afa338a730ddbad 100644 (file)
@@ -177,13 +177,13 @@ void bl1_load_bl2(void)
 
        INFO("BL1: Loading BL2\n");
 
-#if LOAD_IMAGE_V2
-       err = bl1_plat_handle_pre_image_load();
+       err = bl1_plat_handle_pre_image_load(BL2_IMAGE_ID);
        if (err) {
                ERROR("Failure in pre image load handling of BL2 (%d)\n", err);
                plat_error_handler(err);
        }
 
+#if LOAD_IMAGE_V2
        err = load_auth_image(BL2_IMAGE_ID, image_info);
 #else
        /* Load the BL2 image */
@@ -200,14 +200,14 @@ void bl1_load_bl2(void)
                plat_error_handler(err);
        }
 
-#if LOAD_IMAGE_V2
        /* Allow platform to handle image information. */
-       err = bl1_plat_handle_post_image_load();
+       err = bl1_plat_handle_post_image_load(BL2_IMAGE_ID);
        if (err) {
                ERROR("Failure in post image load handling of BL2 (%d)\n", err);
                plat_error_handler(err);
        }
 
+#if LOAD_IMAGE_V2
        /*
         * Create a new layout of memory for BL2 as seen by BL1 i.e.
         * tell it the amount of total and free memory available.
index 9d75286fb1806296bf3dbaa605987e30c4837be5..a856fb738eadde84e2b948e1826837f022a77568 100644 (file)
@@ -29,7 +29,6 @@ BL2_LINKERFILE                :=      bl2/bl2.ld.S
 else
 BL2_SOURCES            +=      bl2/${ARCH}/bl2_el3_entrypoint.S        \
                                bl2/${ARCH}/bl2_el3_exceptions.S        \
-                               plat/common/plat_bl2_el3_common.c       \
                                lib/cpus/${ARCH}/cpu_helpers.S          \
                                lib/cpus/errata_report.c
 BL2_LINKERFILE         :=      bl2/bl2_el3.ld.S
index de05e03381b7efcfdeed268c675ba51a99037663..71c7a93aadc47e80adb430e80cd14cc74941b178 100644 (file)
@@ -1264,24 +1264,24 @@ Function : bl1\_plat\_handle\_pre\_image\_load() [optional]
 
 ::
 
-    Argument : void
+    Argument : unsigned int image_id
     Return   : int
 
 This function can be used by the platforms to update/use image information
-for BL2. This function is currently invoked in BL1 before loading BL2,
-when LOAD\_IMAGE\_V2 is enabled.
+corresponding to ``image_id``. This function is invoked in BL1, both in cold
+boot and FWU code path, before loading the image.
 
 Function : bl1\_plat\_handle\_post\_image\_load() [optional]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 ::
 
-    Argument : void
+    Argument : unsigned int image_id
     Return   : int
 
 This function can be used by the platforms to update/use image information
-for BL2. This function is currently invoked in BL1 after loading BL2,
-when LOAD\_IMAGE\_V2 is enabled.
+corresponding to ``image_id``. This function is invoked in BL1, both in cold
+boot and FWU code path, after loading and authenticating the image.
 
 Function : bl1\_plat\_fwu\_done() [optional]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
index e2f1cfdc371a164f4ffc9fb5bbe1775b1e9a9a45..5c0672554d01f6f5d67805f9f03582ed148c66ab 100644 (file)
@@ -155,15 +155,12 @@ struct image_desc *bl1_plat_get_image_desc(unsigned int image_id);
  */
 __dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved);
 
-#if LOAD_IMAGE_V2
 /*
- * This function can be used by the platforms to update/use image
- * information for BL2.
+ * This BL1 function can be used by the platforms to update/use image
+ * information for a given `image_id`.
  */
-int bl1_plat_handle_pre_image_load(void);
-int bl1_plat_handle_post_image_load(void);
-
-#endif /* LOAD_IMAGE_V2 */
+int bl1_plat_handle_pre_image_load(unsigned int image_id);
+int bl1_plat_handle_post_image_load(unsigned int image_id);
 
 /*******************************************************************************
  * Mandatory BL2 functions
index b92cf54b0063e95d554984a37e347365a7f5a308..cee34ae2a4c2e691e00f8612b228e230ae84150c 100644 (file)
@@ -9,6 +9,7 @@
 #include <bl_common.h>
 #include <debug.h>
 #include <errno.h>
+#include <platform.h>
 #include <platform_def.h>
 
 /*
@@ -21,6 +22,8 @@
 #pragma weak bl1_plat_set_ep_info
 #pragma weak bl1_plat_get_image_desc
 #pragma weak bl1_plat_fwu_done
+#pragma weak bl1_plat_handle_pre_image_load
+#pragma weak bl1_plat_handle_post_image_load
 
 
 unsigned int bl1_plat_get_next_image_id(void)
@@ -35,6 +38,16 @@ void bl1_plat_set_ep_info(unsigned int image_id,
 
 }
 
+int bl1_plat_handle_pre_image_load(unsigned int image_id)
+{
+       return 0;
+}
+
+int bl1_plat_handle_post_image_load(unsigned int image_id)
+{
+       return 0;
+}
+
 /*
  * Following is the default definition that always
  * returns BL2 image details.
diff --git a/plat/common/plat_bl2_el3_common.c b/plat/common/plat_bl2_el3_common.c
deleted file mode 100644 (file)
index 358a02d..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <arch_helpers.h>
-#include <assert.h>
-#include <bl_common.h>
-#include <debug.h>
-#include <errno.h>
-#include <platform_def.h>
-
-/*
- * The following platform functions are weakly defined. They
- * are default implementations that allow BL2 to compile in
- * absence of real definitions. The Platforms may override
- * with more complex definitions.
- */
-#pragma weak bl2_el3_plat_prepare_exit
-
-void bl2_el3_plat_prepare_exit(void)
-{
-}
diff --git a/plat/common/plat_bl_common.c b/plat/common/plat_bl_common.c
new file mode 100644 (file)
index 0000000..4123df3
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <arch_helpers.h>
+#include <assert.h>
+#include <bl_common.h>
+#include <debug.h>
+#include <errno.h>
+
+/*
+ * The following platform functions are weakly defined. The Platforms
+ * may redefine with strong definition.
+ */
+#pragma weak bl2_el3_plat_prepare_exit
+#pragma weak plat_error_handler
+#pragma weak bl2_plat_preload_setup
+#pragma weak bl2_plat_handle_pre_image_load
+#pragma weak bl2_plat_handle_post_image_load
+#pragma weak plat_try_next_boot_source
+
+void bl2_el3_plat_prepare_exit(void)
+{
+}
+
+void __dead2 plat_error_handler(int err)
+{
+       while (1)
+               wfi();
+}
+
+void bl2_plat_preload_setup(void)
+{
+}
+
+int bl2_plat_handle_pre_image_load(unsigned int image_id)
+{
+       return 0;
+}
+
+int bl2_plat_handle_post_image_load(unsigned int image_id)
+{
+       return 0;
+}
+
+int plat_try_next_boot_source(void)
+{
+       return 0;
+}
diff --git a/plat/common/platform_helpers_default.c b/plat/common/platform_helpers_default.c
deleted file mode 100644 (file)
index ce1a731..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <arch_helpers.h>
-#include <platform.h>
-
-/*
- * Placeholder functions which can be redefined by each platfrom.
- */
-
-#pragma weak plat_error_handler
-#pragma weak bl1_plat_handle_pre_image_load
-#pragma weak bl1_plat_handle_post_image_load
-#pragma weak bl2_plat_preload_setup
-#pragma weak bl2_plat_handle_pre_image_load
-#pragma weak bl2_plat_handle_post_image_load
-#pragma weak plat_try_next_boot_source
-
-void __dead2 plat_error_handler(int err)
-{
-       while (1)
-               wfi();
-}
-
-int bl1_plat_handle_pre_image_load(void)
-{
-       return 0;
-}
-
-int bl1_plat_handle_post_image_load(void)
-{
-       return 0;
-}
-
-void bl2_plat_preload_setup(void)
-{
-}
-
-int bl2_plat_handle_pre_image_load(unsigned int image_id)
-{
-       return 0;
-}
-
-int bl2_plat_handle_post_image_load(unsigned int image_id)
-{
-       return 0;
-}
-
-int plat_try_next_boot_source(void)
-{
-       return 0;
-}