Add atexit function to libc
authorRoberto Vargas <roberto.vargas@arm.com>
Thu, 24 May 2018 12:34:53 +0000 (13:34 +0100)
committerRoberto Vargas <roberto.vargas@arm.com>
Fri, 3 Aug 2018 10:31:39 +0000 (11:31 +0100)
We had exit but we didn't have atexit, and we were calling panic and
tf_printf from exit, which generated a dependency from exit to them.
Having atexit allows to set a different function pointer in every image.

Change-Id: I95b9556d680d96249ed3b14da159b6f417da7661
Signed-off-by: Roberto Vargas <roberto.vargas@arm.com>
bl2u/bl2u_main.c
drivers/auth/mbedtls/mbedtls_common.c
lib/libc/exit.c

index a7e3fb916ef85d3eb50c5aafa36fa43990c96630..b29d57e9db6fd5ffd2fd0ec28663112880718699 100644 (file)
@@ -17,6 +17,7 @@
 #include <platform_def.h>
 #include <stdint.h>
 
+
 /*******************************************************************************
  * This function is responsible to:
  * Load SCP_BL2U if platform has defined SCP_BL2U_BASE
index c048d005aae395f580dd4f60a7441b596bdf5ffc..64dc1967deb2f77a70b550f60a45b10badc11e86 100644 (file)
@@ -5,6 +5,7 @@
  */
 
 #include <debug.h>
+#include <stdlib.h>
 
 /* mbed TLS headers */
 #include <mbedtls/memory_buffer_alloc.h>
 #endif
 static unsigned char heap[MBEDTLS_HEAP_SIZE];
 
+static void cleanup(void)
+{
+       ERROR("EXIT from BL2\n");
+       panic();
+}
+
 /*
  * mbed TLS initialization function
  */
@@ -31,6 +38,9 @@ void mbedtls_init(void)
        static int ready;
 
        if (!ready) {
+               if (atexit(cleanup))
+                       panic();
+
                /* Initialize the mbed TLS heap */
                mbedtls_memory_buffer_alloc_init(heap, MBEDTLS_HEAP_SIZE);
 
index afc3f934390d04ec4c121461a5ace26bdd91e78d..b2fde9ca290d2d7696cb4f5bff5d3b227e5a83c2 100644 (file)
@@ -4,11 +4,23 @@
  * SPDX-License-Identifier: BSD-3-Clause
  */
 
-#include <debug.h>
 #include <stdlib.h>
 
-void exit(int v)
+static void (*exitfun)(void);
+
+void exit(int status)
 {
-       ERROR("EXIT\n");
-       panic();
+       if (exitfun)
+               (*exitfun)();
+       for (;;)
+               ;
+}
+
+int atexit(void (*fun)(void))
+{
+       if (exitfun)
+               return -1;
+       exitfun = fun;
+
+       return 0;
 }