[PATCH v6 04/17] libcflat: add abort() and assert()

Andrew Jones
2014-07-11T08:20:02Z

The test framework may have external dependencies. assert() provides
the ability to abort when those dependencies aren't met. However,
assert() should only be used for unlikely conditions. We can provide
more informative messages with printf() for the more likely problems.

Signed-off-by: Andrew Jones <drjones@redhat.com>
Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
---
v6: change abort() from macro to function [Paolo Bonzini]
don't use signal ambiguous status codes [Paolo Bonzini]
---
Makefile | 1 +
lib/abort.c | 20 ++++++++++++++++++++
lib/libcflat.h | 9 +++++++++
3 files changed, 30 insertions(+)
create mode 100644 lib/abort.c

diff --git a/Makefile b/Makefile
index fba58e36f272f..180189ecd6d8c 100644
--- a/Makefile
+++ b/Makefile
@@ -19,6 +19,7 @@ cflatobjs := \
lib/argv.o \
lib/printf.o \
lib/string.o \
+ lib/abort.o \
lib/report.o

# libfdt paths
diff --git a/lib/abort.c b/lib/abort.c
new file mode 100644
index 0000000000000..61f7f924aba4b
--- /dev/null
+++ b/lib/abort.c
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.
+ */
+#include "libcflat.h"
+
+/*
+ * When exit(code) is invoked, qemu will exit with ((code << 1) | 1),
+ * leaving us 128 exit status codes. To avoid confusion with signal
+ * status, we further limit exit codes to those resulting in qemu
+ * exiting with a status < 128. We give abort() the highest (127),
+ * leaving the lower status codes for unit tests.
+ */
+#define ABORT_EXIT_STATUS 63 /* 127 exit status from qemu */
+
+void abort(void)
+{
+ exit(ABORT_EXIT_STATUS);
+}
diff --git a/lib/libcflat.h b/lib/libcflat.h
index c9754695326df..9f76d6741344d 100644
--- a/lib/libcflat.h
+++ b/lib/libcflat.h
@@ -44,6 +44,7 @@ typedef _Bool bool;
#define false 0

extern void exit(int code);
+extern void abort(void);

extern int printf(const char *fmt, ...);
extern int snprintf(char *buf, int size, const char *fmt, ...);
@@ -61,4 +62,12 @@ extern long atol(const char *ptr);
void report(const char *msg_fmt, bool pass, ...);
void report_xfail(const char *msg_fmt, bool xfail, bool pass, ...);
int report_summary(void);
+
+#define assert(cond) \
+do { \
+ if (!(cond)) \
+ printf("%s:%d: assert failed\n", __FILE__, __LINE__), \
+ abort(); \
+} while (0)
+
#endif
--
1.9.3