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@xxxxxxxxxx> Acked-by: Christoffer Dall <christoffer.dall@xxxxxxxxxx> --- 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@xxxxxxxxxx> + * + * 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 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html