Mbed TLS: Remove weak heap implementation
authorAmbroise Vincent <ambroise.vincent@arm.com>
Wed, 10 Apr 2019 11:50:27 +0000 (12:50 +0100)
committerAmbroise Vincent <ambroise.vincent@arm.com>
Fri, 12 Apr 2019 08:52:52 +0000 (09:52 +0100)
The implementation of the heap function plat_get_mbedtls_heap() becomes
mandatory for platforms supporting TRUSTED_BOARD_BOOT.

The shared Mbed TLS heap default weak function implementation is
converted to a helper function get_mbedtls_heap_helper() which can be
used by the platforms for their own function implementation.

Change-Id: Ic8f2994e25e3d9fcd371a21ac459fdcafe07433e
Signed-off-by: Ambroise Vincent <ambroise.vincent@arm.com>
docs/porting-guide.rst
drivers/auth/mbedtls/mbedtls_common.c
include/plat/common/platform.h
plat/arm/board/juno/juno_security.c
plat/hisilicon/hikey/hikey_tbbr.c
plat/hisilicon/hikey960/hikey960_tbbr.c
plat/imx/imx7/warp7/warp7_trusted_boot.c
plat/qemu/qemu_trusted_boot.c
plat/rpi3/rpi3_trusted_boot.c
plat/socionext/uniphier/uniphier_tbbr.c

index 3ea86b04fe9d7a457666b3ee203ac8893fc5aa89..6244a638737757d6d5af402745267dc3405b21a1 100644 (file)
@@ -841,6 +841,33 @@ utilize the C runtime environment. For further details about how TF-A
 represents the power domain topology and how this relates to the linear CPU
 index, please refer `Power Domain Topology Design`_.
 
+Function : plat_get_mbedtls_heap() [when TRUSTED_BOARD_BOOT == 1]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+    Arguments : void **heap_addr, size_t *heap_size
+    Return    : int
+
+This function is invoked during Mbed TLS library initialisation to get a heap,
+by means of a starting address and a size. This heap will then be used
+internally by the Mbed TLS library. Hence, each BL stage that utilises Mbed TLS
+must be able to provide a heap to it.
+
+A helper function can be found in `drivers/auth/mbedtls/mbedtls_common.c` in
+which a heap is statically reserved during compile time inside every image
+(i.e. every BL stage) that utilises Mbed TLS. In this default implementation,
+the function simply returns the address and size of this "pre-allocated" heap.
+For a platform to use this default implementation, only a call to the helper
+from inside plat_get_mbedtls_heap() body is enough and nothing else is needed.
+
+However, by writting their own implementation, platforms have the potential to
+optimise memory usage. For example, on some Arm platforms, the Mbed TLS heap is
+shared between BL1 and BL2 stages and, thus, the necessary space is not reserved
+twice.
+
+On success the function should return 0 and a negative error code otherwise.
+
 Common optional modifications
 -----------------------------
 
@@ -1054,29 +1081,6 @@ can override the common implementation to define a different prefix string for
 the log output. The implementation should be robust to future changes that
 increase the number of log levels.
 
-Function : plat_get_mbedtls_heap()
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-::
-
-    Arguments : void **heap_addr, size_t *heap_size
-    Return    : int
-
-This function is invoked during Mbed TLS library initialisation to get
-a heap, by means of a starting address and a size. This heap will then be used
-internally by the Mbed TLS library. The heap is requested from the current BL
-stage, i.e. the current BL image inside which Mbed TLS is used.
-
-In the default implementation a heap is statically allocated inside every image
-(i.e. every BL stage) that utilises Mbed TLS. So, in this case, the function
-simply returns the address and size of this "pre-allocated" heap. However, by
-overriding the default implementation, platforms have the potential to optimise
-memory usage. For example, on some Arm platforms, the Mbed TLS heap is shared
-between BL1 and BL2 stages and, thus, the necessary space is not reserved
-twice.
-
-On success the function should return 0 and a negative error code otherwise.
-
 Modifications specific to a Boot Loader stage
 ---------------------------------------------
 
index cdb504295f40bff299f0d556b02f7a7fe93dde69..4a8efaebb717ec408ef592d1796f5bf9a69cc9a5 100644 (file)
@@ -16,8 +16,6 @@
 #include <drivers/auth/mbedtls/mbedtls_config.h>
 #include <plat/common/platform.h>
 
-#pragma weak plat_get_mbedtls_heap
-
 static void cleanup(void)
 {
        ERROR("EXIT from BL2\n");
@@ -58,10 +56,10 @@ void mbedtls_init(void)
 }
 
 /*
- * The following default implementation of the function simply returns the
- * by default allocated heap.
+ * The following helper function simply returns the default allocated heap.
+ * It can be used by platforms for their plat_get_mbedtls_heap() implementation.
  */
-int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
+int get_mbedtls_heap_helper(void **heap_addr, size_t *heap_size)
 {
        static unsigned char heap[TF_MBEDTLS_HEAP_SIZE];
 
index 4832e491cd89ef7b4e3ea7a48374994db87b308a..3f9ab1b66261e01f546a84f6bbd415ac1f7b52cd 100644 (file)
@@ -47,6 +47,7 @@ int plat_get_image_source(unsigned int image_id,
 uintptr_t plat_get_ns_image_entrypoint(void);
 unsigned int plat_my_core_pos(void);
 int plat_core_pos_by_mpidr(u_register_t mpidr);
+int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size);
 
 #if STACK_PROTECTOR_ENABLED
 /*
@@ -103,7 +104,6 @@ void plat_panic_handler(void) __dead2;
 const char *plat_log_get_prefix(unsigned int log_level);
 void bl2_plat_preload_setup(void);
 int plat_try_next_boot_source(void);
-int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size);
 uint64_t *plat_init_apiakey(void);
 
 /*******************************************************************************
@@ -262,6 +262,7 @@ int plat_get_nv_ctr(void *cookie, unsigned int *nv_ctr);
 int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr);
 int plat_set_nv_ctr2(void *cookie, const struct auth_img_desc_s *img_desc,
                unsigned int nv_ctr);
+int get_mbedtls_heap_helper(void **heap_addr, size_t *heap_size);
 
 /*******************************************************************************
  * Secure Partitions functions
index 9d7f0e4218fbda8eeee00b01fe806a08cd4ae3bb..6566b15c87bdedf59b4516fb4969504ae0811e76 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2014-2019, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -10,6 +10,7 @@
 #include <platform_def.h>
 #include <plat/arm/common/plat_arm.h>
 #include <plat/arm/soc/common/soc_css.h>
+#include <plat/common/platform.h>
 
 #include "juno_tzmp1_def.h"
 
@@ -144,3 +145,10 @@ void plat_arm_security_setup(void)
        init_v550();
 #endif
 }
+
+#if TRUSTED_BOARD_BOOT
+int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
+{
+       return get_mbedtls_heap_helper(heap_addr, heap_size);
+}
+#endif
index 1f05d18ea04058a4767e78689f97164c553e1cd3..b7dda8d82176ee5e0f8b3f2826f24bd5a2a0cfcd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -29,3 +29,8 @@ int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr)
 {
        return 1;
 }
+
+int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
+{
+       return get_mbedtls_heap_helper(heap_addr, heap_size);
+}
index e435ec2e5d5838ed605e99865f6d0fe853e8be94..ed4da3b7fcab1e94a71283a91f549f4d38710ad6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -29,3 +29,8 @@ int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr)
 {
        return 1;
 }
+
+int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
+{
+       return get_mbedtls_heap_helper(heap_addr, heap_size);
+}
index 8157cd5c41ced14c5f2210ddedf82821371a4cfa..6a00224c96650a5b8088f828f51c612eda6b7363 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -29,3 +29,8 @@ int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr)
 {
        return 1;
 }
+
+int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
+{
+       return get_mbedtls_heap_helper(heap_addr, heap_size);
+}
index 17666b99e7221e569fefd14712dd08d86391ce46..1ef7e431b8a09a7ffd350af17355c41d160f0e27 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -29,3 +29,8 @@ int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr)
 {
        return 1;
 }
+
+int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
+{
+       return get_mbedtls_heap_helper(heap_addr, heap_size);
+}
index b306c45c23eab4fa0d3ef1d41406564ad8e06d4b..f6c669fad78aaaa8b88688be10513a5d5e17cdc3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -29,3 +29,8 @@ int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr)
 {
        return 1;
 }
+
+int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
+{
+       return get_mbedtls_heap_helper(heap_addr, heap_size);
+}
index 962a8d288e846a6d988e9509b1fa23da89f13719..e31ca03e4b2a317a7ec6b71867eba4db87922a84 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -33,3 +33,8 @@ int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr)
 {
        return 0;
 }
+
+int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
+{
+       return get_mbedtls_heap_helper(heap_addr, heap_size);
+}