summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordavidcunado-arm <david.cunado@arm.com>2017-05-19 10:54:23 +0100
committerGitHub <noreply@github.com>2017-05-19 10:54:23 +0100
commit727a68b8ef02f48316ef13903a63af2638f6bbd3 (patch)
tree733f8c8a8d13e6a0eb9c2a3c781c4bc079fe402f
parent4fd4af26cb650d34876c058a7142c91233ba5475 (diff)
parent0da2fe7e29380f1b45286ae8a5a999547d250d33 (diff)
Merge pull request #936 from antonio-nino-diaz-arm/an/assert-mem
Simplify assert() to reduce memory usage
-rw-r--r--docs/porting-guide.md11
-rw-r--r--include/lib/stdlib/assert.h23
-rw-r--r--lib/stdlib/assert.c33
3 files changed, 53 insertions, 14 deletions
diff --git a/docs/porting-guide.md b/docs/porting-guide.md
index 0189ec40..4d7a5ead 100644
--- a/docs/porting-guide.md
+++ b/docs/porting-guide.md
@@ -535,6 +535,17 @@ optionally be defined:
PLAT_PARTITION_MAX_ENTRIES := 12
$(eval $(call add_define,PLAT_PARTITION_MAX_ENTRIES))
+The following constant is optional. It should be defined to override the default
+behaviour of the `assert()` function (for example, to save memory).
+
+* **PLAT_LOG_LEVEL_ASSERT**
+ If `PLAT_LOG_LEVEL_ASSERT` is higher or equal than `LOG_LEVEL_VERBOSE`,
+ `assert()` prints the name of the file, the line number and the asserted
+ expression. Else if it is higher than `LOG_LEVEL_INFO`, it prints the file
+ name and the line number. Else if it is lower than `LOG_LEVEL_INFO`, it
+ doesn't print anything to the console. If `PLAT_LOG_LEVEL_ASSERT` isn't
+ defined, it defaults to `LOG_LEVEL`.
+
### File : plat_macros.S [mandatory]
diff --git a/include/lib/stdlib/assert.h b/include/lib/stdlib/assert.h
index 1bcd1ead..db567dbb 100644
--- a/include/lib/stdlib/assert.h
+++ b/include/lib/stdlib/assert.h
@@ -42,19 +42,36 @@
#ifndef _ASSERT_H_
#define _ASSERT_H_
+#include <debug.h>
+#include <platform_def.h>
#include <sys/cdefs.h>
+#ifndef PLAT_LOG_LEVEL_ASSERT
+#define PLAT_LOG_LEVEL_ASSERT LOG_LEVEL
+#endif
+
#if ENABLE_ASSERTIONS
#define _assert(e) assert(e)
-#define assert(e) ((e) ? (void)0 : __assert(__func__, __FILE__, \
- __LINE__, #e))
+# if PLAT_LOG_LEVEL_ASSERT >= LOG_LEVEL_VERBOSE
+# define assert(e) ((e) ? (void)0 : __assert(__FILE__, __LINE__, #e))
+# elif PLAT_LOG_LEVEL_ASSERT >= LOG_LEVEL_INFO
+# define assert(e) ((e) ? (void)0 : __assert(__FILE__, __LINE__))
+# else
+# define assert(e) ((e) ? (void)0 : __assert())
+# endif
#else
#define assert(e) ((void)0)
#define _assert(e) ((void)0)
#endif /* ENABLE_ASSERTIONS */
__BEGIN_DECLS
-void __assert(const char *, const char *, int, const char *) __dead2;
+#if PLAT_LOG_LEVEL_ASSERT >= LOG_LEVEL_VERBOSE
+void __assert(const char *, unsigned int, const char *) __dead2;
+#elif PLAT_LOG_LEVEL_ASSERT >= LOG_LEVEL_INFO
+void __assert(const char *, unsigned int) __dead2;
+#else
+void __assert(void) __dead2;
+#endif
__END_DECLS
#endif /* !_ASSERT_H_ */
diff --git a/lib/stdlib/assert.c b/lib/stdlib/assert.c
index 5220ad8f..41f70703 100644
--- a/lib/stdlib/assert.c
+++ b/lib/stdlib/assert.c
@@ -4,22 +4,33 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include <assert.h>
#include <console.h>
#include <debug.h>
#include <platform.h>
-void __assert(const char *function, const char *file, unsigned int line,
- const char *assertion)
-{
-#if LOG_LEVEL >= LOG_LEVEL_INFO
- /*
- * Only print the output if LOG_LEVEL is higher or equal to
- * LOG_LEVEL_INFO, which is the default value for builds with DEBUG=1.
- */
- tf_printf("ASSERT: %s <%d> : %s\n", function, line, assertion);
+/*
+* Only print the output if PLAT_LOG_LEVEL_ASSERT is higher or equal to
+* LOG_LEVEL_INFO, which is the default value for builds with DEBUG=1.
+*/
+#if PLAT_LOG_LEVEL_ASSERT >= LOG_LEVEL_VERBOSE
+void __assert(const char *file, unsigned int line, const char *assertion)
+{
+ tf_printf("ASSERT: %s <%d> : %s\n", file, line, assertion);
console_flush();
-#endif
-
plat_panic_handler();
}
+#elif PLAT_LOG_LEVEL_ASSERT >= LOG_LEVEL_INFO
+void __assert(const char *file, unsigned int line)
+{
+ tf_printf("ASSERT: %s <%d>\n", file, line);
+ console_flush();
+ plat_panic_handler();
+}
+#else
+void __assert(void)
+{
+ plat_panic_handler();
+}
+#endif