diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-06-19 14:09:28 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-06-20 07:42:25 +0200 |
commit | c6810c824c9445fdc44ae5c0092f9ae5355a1420 (patch) | |
tree | 72441065d38fefdef1008118d9bf51bebf71ad05 /c/src/lib/libbsp/shared | |
parent | bsps/powerpc: Fix warning (diff) | |
download | rtems-c6810c824c9445fdc44ae5c0092f9ae5355a1420.tar.bz2 |
bsps: Improve interrupt vector enable/disable API
Change bsp_interrupt_vector_enable() and bsp_interrupt_vector_disable()
to not return a status code. Add bsp_interrupt_assert() and use it to
validate the vector number in the vector enable/disable implementations.
Diffstat (limited to 'c/src/lib/libbsp/shared')
-rw-r--r-- | c/src/lib/libbsp/shared/include/irq-generic.h | 30 | ||||
-rwxr-xr-x | c/src/lib/libbsp/shared/src/irq-generic.c | 16 | ||||
-rw-r--r-- | c/src/lib/libbsp/shared/src/irq-server.c | 8 |
3 files changed, 25 insertions, 29 deletions
diff --git a/c/src/lib/libbsp/shared/include/irq-generic.h b/c/src/lib/libbsp/shared/include/irq-generic.h index 4e89d74ab3..187aea84d1 100644 --- a/c/src/lib/libbsp/shared/include/irq-generic.h +++ b/c/src/lib/libbsp/shared/include/irq-generic.h @@ -9,7 +9,7 @@ /* * Based on concepts of Pavel Pisa, Till Straumann and Eric Valette. * - * Copyright (c) 2008-2014 embedded brains GmbH. + * Copyright (c) 2008, 2017 embedded brains GmbH. * * embedded brains GmbH * Dornierstr. 4 @@ -30,6 +30,7 @@ #include <stdbool.h> #include <rtems/irq-extension.h> +#include <rtems/score/assert.h> #ifdef RTEMS_SMP #include <rtems/score/atomic.h> @@ -71,6 +72,8 @@ extern "C" { #define bsp_interrupt_fence(order) do { } while (0) #endif +#define bsp_interrupt_assert(e) _Assert(e) + struct bsp_interrupt_handler_entry { rtems_interrupt_handler handler; void *arg; @@ -215,32 +218,33 @@ rtems_status_code bsp_interrupt_facility_initialize(void); * * This function shall enable the vector at the corresponding facility (in most * cases the interrupt controller). It will be called then the first handler - * is installed for the vector in bsp_interrupt_handler_install(). It is - * guaranteed that the vector number is within the BSP_INTERRUPT_VECTOR_MIN and - * BSP_INTERRUPT_VECTOR_MAX range. + * is installed for the vector in bsp_interrupt_handler_install() for example. + * + * @note The implementation should use + * bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)) to valdiate the + * vector number. * * @note You must not install or remove an interrupt handler in this function. * This may result in a deadlock. - * - * @return On success RTEMS_SUCCESSFUL shall be returned. */ -rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector); +void bsp_interrupt_vector_enable(rtems_vector_number vector); /** * @brief Disables the interrupt vector with number @a vector. * * This function shall disable the vector at the corresponding facility (in * most cases the interrupt controller). It will be called then the last - * handler is removed for the vector in bsp_interrupt_handler_remove(). It is - * guaranteed that the vector number is within the BSP_INTERRUPT_VECTOR_MIN and - * BSP_INTERRUPT_VECTOR_MAX range. + * handler is removed for the vector in bsp_interrupt_handler_remove() for + * example. + * + * @note The implementation should use + * bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector)) to valdiate the + * vector number. * * @note You must not install or remove an interrupt handler in this function. * This may result in a deadlock. - * - * @return On success RTEMS_SUCCESSFUL shall be returned. */ -rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector); +void bsp_interrupt_vector_disable(rtems_vector_number vector); /** * @brief Sequencially calls all interrupt handlers for the vector number @a diff --git a/c/src/lib/libbsp/shared/src/irq-generic.c b/c/src/lib/libbsp/shared/src/irq-generic.c index b2a7ced64c..7f943d96cb 100755 --- a/c/src/lib/libbsp/shared/src/irq-generic.c +++ b/c/src/lib/libbsp/shared/src/irq-generic.c @@ -207,7 +207,6 @@ static rtems_status_code bsp_interrupt_handler_install( void *arg ) { - rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_interrupt_level level; rtems_vector_number index = 0; bsp_interrupt_handler_entry *head = NULL; @@ -346,11 +345,7 @@ static rtems_status_code bsp_interrupt_handler_install( /* Enable the vector if necessary */ if (enable_vector) { - sc = bsp_interrupt_vector_enable(vector); - if (sc != RTEMS_SUCCESSFUL) { - bsp_interrupt_unlock(); - return sc; - } + bsp_interrupt_vector_enable(vector); } /* Unlock */ @@ -375,7 +370,6 @@ static rtems_status_code bsp_interrupt_handler_remove( void *arg ) { - rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_interrupt_level level; rtems_vector_number index = 0; bsp_interrupt_handler_entry *head = NULL; @@ -446,7 +440,7 @@ static rtems_status_code bsp_interrupt_handler_remove( */ /* Disable the vector */ - sc = bsp_interrupt_vector_disable(vector); + bsp_interrupt_vector_disable(vector); /* Clear entry */ bsp_interrupt_disable(level); @@ -458,12 +452,6 @@ static rtems_status_code bsp_interrupt_handler_remove( /* Allow shared handlers */ bsp_interrupt_set_handler_unique(index, false); - - /* Check status code */ - if (sc != RTEMS_SUCCESSFUL) { - bsp_interrupt_unlock(); - return sc; - } } else { /* * The match is the list tail and has a predecessor. diff --git a/c/src/lib/libbsp/shared/src/irq-server.c b/c/src/lib/libbsp/shared/src/irq-server.c index 905c26198b..9a3ca9abf1 100644 --- a/c/src/lib/libbsp/shared/src/irq-server.c +++ b/c/src/lib/libbsp/shared/src/irq-server.c @@ -56,7 +56,9 @@ static void bsp_interrupt_server_trigger(void *arg) rtems_interrupt_lock_context lock_context; rtems_interrupt_server_entry *e = arg; - bsp_interrupt_vector_disable(e->vector); + if (bsp_interrupt_is_valid_vector(e->vector)) { + bsp_interrupt_vector_disable(e->vector); + } rtems_interrupt_lock_acquire(&bsp_interrupt_server_lock, &lock_context); @@ -324,7 +326,9 @@ static void bsp_interrupt_server_task(rtems_task_argument arg) (*current->handler)(current->arg); } while (action != NULL); - bsp_interrupt_vector_enable(vector); + if (bsp_interrupt_is_valid_vector(vector)) { + bsp_interrupt_vector_enable(vector); + } } } } |