summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-01-27 14:02:50 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-02-12 09:31:27 +0100
commit68f36d144adfa1294f026bdf2d348c22365543fc (patch)
treecb0aa1bdd384583752af252b0c693fb0a4badc89
parentbsp/lpc32xx: Add BSP_USB_OTG_TRANSCEIVER_VBUS (diff)
downloadrtems-68f36d144adfa1294f026bdf2d348c22365543fc.tar.bz2
score: Add and use rtems_assert_context
-rw-r--r--cpukit/libcsupport/src/__assert.c9
-rw-r--r--cpukit/sapi/include/rtems/fatal.h10
-rw-r--r--cpukit/score/include/rtems/score/interr.h4
-rw-r--r--testsuites/sptests/spfatal10/testcase.h23
-rw-r--r--testsuites/sptests/spfatal_support/init.c13
5 files changed, 52 insertions, 7 deletions
diff --git a/cpukit/libcsupport/src/__assert.c b/cpukit/libcsupport/src/__assert.c
index be0fa6c2e9..d29ea0b7e0 100644
--- a/cpukit/libcsupport/src/__assert.c
+++ b/cpukit/libcsupport/src/__assert.c
@@ -34,6 +34,13 @@ void __assert_func(
const char *failedexpr
)
{
+ rtems_assert_context assert_context = {
+ .file = file,
+ .line = line,
+ .function = func,
+ .failed_expression = failedexpr
+ };
+
printk("assertion \"%s\" failed: file \"%s\", line %d%s%s\n",
failedexpr,
file,
@@ -41,7 +48,7 @@ void __assert_func(
(func) ? ", function: " : "",
(func) ? func : ""
);
- rtems_fatal( RTEMS_FATAL_SOURCE_ASSERT, (rtems_fatal_code) func );
+ rtems_fatal( RTEMS_FATAL_SOURCE_ASSERT, (rtems_fatal_code) &assert_context );
}
#endif
diff --git a/cpukit/sapi/include/rtems/fatal.h b/cpukit/sapi/include/rtems/fatal.h
index 66236462d8..47bf74f279 100644
--- a/cpukit/sapi/include/rtems/fatal.h
+++ b/cpukit/sapi/include/rtems/fatal.h
@@ -34,6 +34,16 @@ extern "C" {
/**@{**/
/**
+ * @brief Assert context.
+ */
+typedef struct {
+ const char *file;
+ int line;
+ const char *function;
+ const char *failed_expression;
+} rtems_assert_context;
+
+/**
* @brief Exception frame.
*/
typedef CPU_Exception_frame rtems_exception_frame;
diff --git a/cpukit/score/include/rtems/score/interr.h b/cpukit/score/include/rtems/score/interr.h
index 2580c72253..a047ca6766 100644
--- a/cpukit/score/include/rtems/score/interr.h
+++ b/cpukit/score/include/rtems/score/interr.h
@@ -88,7 +88,9 @@ typedef enum {
/**
* @brief Fatal source of assert().
*
- * The fatal code is the pointer value of the function string.
+ * The fatal code is the pointer value of the assert context.
+ *
+ * @see rtems_assert_context.
*/
RTEMS_FATAL_SOURCE_ASSERT,
diff --git a/testsuites/sptests/spfatal10/testcase.h b/testsuites/sptests/spfatal10/testcase.h
index 9af96d9637..895a0c21e5 100644
--- a/testsuites/sptests/spfatal10/testcase.h
+++ b/testsuites/sptests/spfatal10/testcase.h
@@ -9,18 +9,33 @@
*/
#include <assert.h>
-
-static const char func [] = "Init";
+#include <string.h>
#define FATAL_ERROR_TEST_NAME "10"
#define FATAL_ERROR_DESCRIPTION "asserting with non-NULL strings..."
#define FATAL_ERROR_EXPECTED_SOURCE RTEMS_FATAL_SOURCE_ASSERT
#define FATAL_ERROR_EXPECTED_IS_INTERNAL FALSE
-#define FATAL_ERROR_EXPECTED_ERROR ((rtems_fatal_code) func)
+#define FATAL_ERROR_EXPECTED_ERROR_CHECK spfatal10_is_expected_error
+
+#define ASSERT_FILE "testcase.h"
+#define ASSERT_LINE 38
+#define ASSERT_FUNC "Init"
+#define ASSERT_FEXP "forced"
+
+static inline bool spfatal10_is_expected_error( rtems_fatal_code error )
+{
+ const rtems_assert_context *assert_context =
+ (const rtems_assert_context *) error;
+
+ return strcmp( assert_context->file, ASSERT_FILE ) == 0
+ && assert_context->line == ASSERT_LINE
+ && strcmp( assert_context->function, ASSERT_FUNC ) == 0
+ && strcmp( assert_context->failed_expression, ASSERT_FEXP ) == 0;
+}
void force_error()
{
- __assert_func( __FILE__, __LINE__, func, "forced" );
+ __assert_func( ASSERT_FILE, ASSERT_LINE, ASSERT_FUNC, ASSERT_FEXP );
/* we will not run this far */
}
diff --git a/testsuites/sptests/spfatal_support/init.c b/testsuites/sptests/spfatal_support/init.c
index eb7a167361..216c766b91 100644
--- a/testsuites/sptests/spfatal_support/init.c
+++ b/testsuites/sptests/spfatal_support/init.c
@@ -80,6 +80,15 @@ void Put_Source( rtems_fatal_source source )
printk( "%s", rtems_fatal_source_description( source ) );
}
+static bool is_expected_error( rtems_fatal_code error )
+{
+#ifdef FATAL_ERROR_EXPECTED_ERROR
+ return error == FATAL_ERROR_EXPECTED_ERROR;
+#else /* FATAL_ERROR_EXPECTED_ERROR */
+ return FATAL_ERROR_EXPECTED_ERROR_CHECK( error );
+#endif /* FATAL_ERROR_EXPECTED_ERROR */
+}
+
void Fatal_extension(
rtems_fatal_source source,
bool is_internal,
@@ -109,6 +118,7 @@ void Fatal_extension(
);
}
+#ifdef FATAL_ERROR_EXPECTED_ERROR
if ( error != FATAL_ERROR_EXPECTED_ERROR ) {
printk( "ERROR==> Fatal Error Expected (");
Put_Error( source, FATAL_ERROR_EXPECTED_ERROR );
@@ -116,11 +126,12 @@ void Fatal_extension(
Put_Error( source, error );
printk( ")\n" );
}
+#endif /* FATAL_ERROR_EXPECTED_ERROR */
if (
source == FATAL_ERROR_EXPECTED_SOURCE
&& is_internal == FATAL_ERROR_EXPECTED_IS_INTERNAL
- && error == FATAL_ERROR_EXPECTED_ERROR
+ && is_expected_error( error )
) {
printk( "*** END OF TEST FATAL " FATAL_ERROR_TEST_NAME " ***\n" );
}