summaryrefslogtreecommitdiffstats
path: root/testsuites/smptests
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-01-24 09:43:20 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-01-24 09:44:02 +0100
commit436a4b384b70b4b050d5c5967c169a2b79f90042 (patch)
treeba183ea8bf71a40bbe817186eafd741349d15fab /testsuites/smptests
parentsparc: Relax CPU_STACK_ALIGNMENT (diff)
downloadrtems-436a4b384b70b4b050d5c5967c169a2b79f90042.tar.bz2
smptests/smpsignal01: Check signal ISR level
Close #2751.
Diffstat (limited to 'testsuites/smptests')
-rw-r--r--testsuites/smptests/smpsignal01/init.c74
-rw-r--r--testsuites/smptests/smpsignal01/smpsignal01.doc1
2 files changed, 68 insertions, 7 deletions
diff --git a/testsuites/smptests/smpsignal01/init.c b/testsuites/smptests/smpsignal01/init.c
index af524bf9b1..aa7aac159f 100644
--- a/testsuites/smptests/smpsignal01/init.c
+++ b/testsuites/smptests/smpsignal01/init.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2013, 2017 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -38,6 +38,8 @@ typedef struct {
rtems_id producer;
uint32_t consumer_processor;
uint32_t producer_processor;
+ rtems_id timer;
+ volatile bool done;
} test_context;
static void change_state(test_context *ctx, test_state new_state)
@@ -61,6 +63,8 @@ static void signal_handler(rtems_signal_set signal)
{
test_context *ctx = &ctx_instance;
+ rtems_test_assert(_ISR_Get_level() == 0);
+
switch (ctx->state) {
case SIG_0_ENABLE:
change_state(ctx, SIG_0_PROCESSED);
@@ -119,15 +123,11 @@ static void producer(rtems_task_argument arg)
rtems_test_assert(0);
}
-static void test(void)
+static void test_two_processors(test_context *ctx)
{
- test_context *ctx = &ctx_instance;
rtems_status_code sc;
rtems_mode mode;
- ctx->consumer = rtems_task_self();
- ctx->consumer_processor = rtems_get_current_processor();
-
sc = rtems_signal_catch(signal_handler, RTEMS_DEFAULT_MODES);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
@@ -151,6 +151,7 @@ static void test(void)
sc = rtems_task_mode(RTEMS_ASR, RTEMS_ASR_MASK, &mode);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+ rtems_test_assert(mode == RTEMS_NO_ASR);
wait_for_state(ctx, SIG_0_PROCESSED);
@@ -162,12 +163,69 @@ static void test(void)
check_consumer_processor(ctx);
}
+static void isr_level_timer(rtems_id timer, void *arg)
+{
+ test_context *ctx = arg;
+ rtems_status_code sc;
+
+ sc = rtems_signal_send(ctx->consumer, TEST_SIGNAL);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void isr_level_handler(rtems_signal_set signal)
+{
+ test_context *ctx = &ctx_instance;
+
+ rtems_test_assert(_ISR_Get_level() == 0);
+
+ ctx->done = true;
+}
+
+static void test_isr_level(test_context *ctx)
+{
+ rtems_status_code sc;
+ rtems_mode mode;
+
+ sc = rtems_task_mode(RTEMS_ASR, RTEMS_ASR_MASK, &mode);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+ rtems_test_assert(mode == RTEMS_NO_ASR);
+
+ sc = rtems_timer_create(rtems_build_name('T', 'I', 'M', 'R'), &ctx->timer);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ rtems_test_assert(!ctx->done);
+
+ sc = rtems_signal_catch(isr_level_handler, RTEMS_DEFAULT_MODES);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_timer_fire_after(ctx->timer, 1, isr_level_timer, ctx);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ while (!ctx->done) {
+ /* Wait for timer */
+ }
+
+ sc = rtems_timer_delete(ctx->timer);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_task_mode(RTEMS_NO_ASR, RTEMS_ASR_MASK, &mode);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+ rtems_test_assert(mode == RTEMS_ASR);
+}
+
static void Init(rtems_task_argument arg)
{
+ test_context *ctx = &ctx_instance;
+
TEST_BEGIN();
+ ctx->consumer = rtems_task_self();
+ ctx->consumer_processor = rtems_get_current_processor();
+
+ test_isr_level(ctx);
+
if (rtems_get_processor_count() >= 2) {
- test();
+ test_two_processors(ctx);
}
TEST_END();
@@ -183,6 +241,8 @@ static void Init(rtems_task_argument arg)
#define CONFIGURE_MAXIMUM_TASKS 2
+#define CONFIGURE_MAXIMUM_TIMERS 1
+
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
diff --git a/testsuites/smptests/smpsignal01/smpsignal01.doc b/testsuites/smptests/smpsignal01/smpsignal01.doc
index 98a2a85d70..4d085f2a9a 100644
--- a/testsuites/smptests/smpsignal01/smpsignal01.doc
+++ b/testsuites/smptests/smpsignal01/smpsignal01.doc
@@ -9,4 +9,5 @@ directives:
concepts:
+ - Ensure that signal handlers are called with interrupts enabled.
- Ensure that Classic Signals work on SMP.