summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/shared
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-06-19 14:09:28 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-06-20 07:42:25 +0200
commitc6810c824c9445fdc44ae5c0092f9ae5355a1420 (patch)
tree72441065d38fefdef1008118d9bf51bebf71ad05 /c/src/lib/libbsp/shared
parentbsps/powerpc: Fix warning (diff)
downloadrtems-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.h30
-rwxr-xr-xc/src/lib/libbsp/shared/src/irq-generic.c16
-rw-r--r--c/src/lib/libbsp/shared/src/irq-server.c8
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);
+ }
}
}
}