diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-01-24 09:43:20 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-01-24 09:44:02 +0100 |
commit | 436a4b384b70b4b050d5c5967c169a2b79f90042 (patch) | |
tree | ba183ea8bf71a40bbe817186eafd741349d15fab /testsuites/smptests/smpsignal01 | |
parent | sparc: Relax CPU_STACK_ALIGNMENT (diff) | |
download | rtems-436a4b384b70b4b050d5c5967c169a2b79f90042.tar.bz2 |
smptests/smpsignal01: Check signal ISR level
Close #2751.
Diffstat (limited to 'testsuites/smptests/smpsignal01')
-rw-r--r-- | testsuites/smptests/smpsignal01/init.c | 74 | ||||
-rw-r--r-- | testsuites/smptests/smpsignal01/smpsignal01.doc | 1 |
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. |