text: /*
   * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
   *
   * SPDX-License-Identifier: BSD-3-Clause
   */
  
  #include <assert.h>
  #include <stddef.h>
  
  /* mbed TLS headers */
  #include <mbedtls/memory_buffer_alloc.h>
  #include <mbedtls/platform.h>
  
  #include <common/debug.h>
  #include <drivers/auth/mbedtls/mbedtls_common.h>
  #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");
  	panic();
  }
  
  /*
   * mbed TLS initialization function
   */
  void mbedtls_init(void)
  {
  	static int ready;
  	void *heap_addr;
  	size_t heap_size = 0;
  	int err;
  
  	if (!ready) {
  		if (atexit(cleanup))
  			panic();
  
  		err = plat_get_mbedtls_heap(&heap_addr, &heap_size);
  
  		/* Ensure heap setup is proper */
  		if (err < 0) {
  			ERROR("Mbed TLS failed to get a heap\n");
  			panic();
  		}
  		assert(heap_size >= TF_MBEDTLS_HEAP_SIZE);
  
  		/* Initialize the mbed TLS heap */
  		mbedtls_memory_buffer_alloc_init(heap_addr, heap_size);
  
  #ifdef MBEDTLS_PLATFORM_SNPRINTF_ALT
  		mbedtls_platform_set_snprintf(snprintf);
  #endif
  		ready = 1;
  	}
  }
  
  /*
   * The following default implementation of the function simply returns the
   * by default allocated heap.
   */
  int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
  {
  	static unsigned char heap[TF_MBEDTLS_HEAP_SIZE];
  
  	assert(heap_addr != NULL);
  	assert(heap_size != NULL);
  
  	*heap_addr = heap;
  	*heap_size = sizeof(heap);
  	return 0;
  }
  