diff --git a/docs/porting-guide.rst b/docs/porting-guide.rst index 3ea86b04fe9d7a457666b3ee203ac8893fc5aa89..6244a638737757d6d5af402745267dc3405b21a1 100644 --- a/docs/porting-guide.rst +++ b/docs/porting-guide.rst @@ -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 --------------------------------------------- diff --git a/drivers/auth/mbedtls/mbedtls_common.c b/drivers/auth/mbedtls/mbedtls_common.c index cdb504295f40bff299f0d556b02f7a7fe93dde69..4a8efaebb717ec408ef592d1796f5bf9a69cc9a5 100644 --- a/drivers/auth/mbedtls/mbedtls_common.c +++ b/drivers/auth/mbedtls/mbedtls_common.c @@ -16,8 +16,6 @@ #include #include -#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]; diff --git a/include/plat/common/platform.h b/include/plat/common/platform.h index 4832e491cd89ef7b4e3ea7a48374994db87b308a..3f9ab1b66261e01f546a84f6bbd415ac1f7b52cd 100644 --- a/include/plat/common/platform.h +++ b/include/plat/common/platform.h @@ -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 diff --git a/plat/arm/board/juno/juno_security.c b/plat/arm/board/juno/juno_security.c index 9d7f0e4218fbda8eeee00b01fe806a08cd4ae3bb..6566b15c87bdedf59b4516fb4969504ae0811e76 100644 --- a/plat/arm/board/juno/juno_security.c +++ b/plat/arm/board/juno/juno_security.c @@ -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 #include #include +#include #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 diff --git a/plat/hisilicon/hikey/hikey_tbbr.c b/plat/hisilicon/hikey/hikey_tbbr.c index 1f05d18ea04058a4767e78689f97164c553e1cd3..b7dda8d82176ee5e0f8b3f2826f24bd5a2a0cfcd 100644 --- a/plat/hisilicon/hikey/hikey_tbbr.c +++ b/plat/hisilicon/hikey/hikey_tbbr.c @@ -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); +} diff --git a/plat/hisilicon/hikey960/hikey960_tbbr.c b/plat/hisilicon/hikey960/hikey960_tbbr.c index e435ec2e5d5838ed605e99865f6d0fe853e8be94..ed4da3b7fcab1e94a71283a91f549f4d38710ad6 100644 --- a/plat/hisilicon/hikey960/hikey960_tbbr.c +++ b/plat/hisilicon/hikey960/hikey960_tbbr.c @@ -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); +} diff --git a/plat/imx/imx7/warp7/warp7_trusted_boot.c b/plat/imx/imx7/warp7/warp7_trusted_boot.c index 8157cd5c41ced14c5f2210ddedf82821371a4cfa..6a00224c96650a5b8088f828f51c612eda6b7363 100644 --- a/plat/imx/imx7/warp7/warp7_trusted_boot.c +++ b/plat/imx/imx7/warp7/warp7_trusted_boot.c @@ -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); +} diff --git a/plat/qemu/qemu_trusted_boot.c b/plat/qemu/qemu_trusted_boot.c index 17666b99e7221e569fefd14712dd08d86391ce46..1ef7e431b8a09a7ffd350af17355c41d160f0e27 100644 --- a/plat/qemu/qemu_trusted_boot.c +++ b/plat/qemu/qemu_trusted_boot.c @@ -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); +} diff --git a/plat/rpi3/rpi3_trusted_boot.c b/plat/rpi3/rpi3_trusted_boot.c index b306c45c23eab4fa0d3ef1d41406564ad8e06d4b..f6c669fad78aaaa8b88688be10513a5d5e17cdc3 100644 --- a/plat/rpi3/rpi3_trusted_boot.c +++ b/plat/rpi3/rpi3_trusted_boot.c @@ -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); +} diff --git a/plat/socionext/uniphier/uniphier_tbbr.c b/plat/socionext/uniphier/uniphier_tbbr.c index 962a8d288e846a6d988e9509b1fa23da89f13719..e31ca03e4b2a317a7ec6b71867eba4db87922a84 100644 --- a/plat/socionext/uniphier/uniphier_tbbr.c +++ b/plat/socionext/uniphier/uniphier_tbbr.c @@ -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); +}