summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2003-08-21 17:05:56 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2003-08-21 17:05:56 +0000
commitfe235a1e289d4ae8be6825180c6aec29cd704298 (patch)
treebf44a36809fe08cec0a1f26a00765d3dfe134f4e /c/src/lib/libbsp/powerpc
parent2003-08-21 Ralf Corsepius <corsepiu@faw.uni-ulm.de> (diff)
downloadrtems-fe235a1e289d4ae8be6825180c6aec29cd704298.tar.bz2
2003-08-21 Till Strauman <strauman@slac.stanford.edu>
PR 456/bsps * irq/irq.c: Fix race condition when installing an ISR.
Diffstat (limited to 'c/src/lib/libbsp/powerpc')
-rw-r--r--c/src/lib/libbsp/powerpc/shared/ChangeLog5
-rw-r--r--c/src/lib/libbsp/powerpc/shared/irq/irq.c16
2 files changed, 17 insertions, 4 deletions
diff --git a/c/src/lib/libbsp/powerpc/shared/ChangeLog b/c/src/lib/libbsp/powerpc/shared/ChangeLog
index 1fe14be8e8..62ce1b24a6 100644
--- a/c/src/lib/libbsp/powerpc/shared/ChangeLog
+++ b/c/src/lib/libbsp/powerpc/shared/ChangeLog
@@ -1,3 +1,8 @@
+2003-08-21 Till Strauman <strauman@slac.stanford.edu>
+
+ PR 456/bsps
+ * irq/irq.c: Fix race condition when installing an ISR.
+
2003-08-16 Ralf Corsepius <corsepiu@faw.uni-ulm.de>
* Makefile.am: Reflect having moved automake/.
diff --git a/c/src/lib/libbsp/powerpc/shared/irq/irq.c b/c/src/lib/libbsp/powerpc/shared/irq/irq.c
index ad98e6d07b..80b123edd4 100644
--- a/c/src/lib/libbsp/powerpc/shared/irq/irq.c
+++ b/c/src/lib/libbsp/powerpc/shared/irq/irq.c
@@ -131,12 +131,14 @@ int BSP_install_rtems_shared_irq_handler (const rtems_irq_connect_data* irq)
printk("Invalid interrupt vector %d\n",irq->name);
return 0;
}
+
+ _CPU_ISR_Disable(level);
+
if ( (int)rtems_hdl_tbl[irq->name].next_handler == -1 ) {
+ _CPU_ISR_Enable(level);
printk("IRQ vector %d already connected to an unshared handler\n",irq->name);
return 0;
}
- _CPU_ISR_Disable(level);
-
vchain = (rtems_irq_connect_data*)malloc(sizeof(rtems_irq_connect_data));
@@ -201,11 +203,12 @@ int BSP_install_rtems_irq_handler (const rtems_irq_connect_data* irq)
* RATIONALE : to always have the same transition by forcing the user
* to get the previous handler before accepting to disconnect.
*/
+ _CPU_ISR_Disable(level);
if (rtems_hdl_tbl[irq->name].hdl != default_rtems_entry.hdl) {
+ _CPU_ISR_Enable(level);
printk("IRQ vector %d already connected\n",irq->name);
return 0;
}
- _CPU_ISR_Disable(level);
/*
* store the data provided by user
@@ -245,10 +248,14 @@ int BSP_install_rtems_irq_handler (const rtems_irq_connect_data* irq)
int BSP_get_current_rtems_irq_handler (rtems_irq_connect_data* irq)
{
+ unsigned int level;
+
if (!isValidInterrupt(irq->name)) {
return 0;
}
+ _CPU_ISR_Disable(level);
*irq = rtems_hdl_tbl[irq->name];
+ _CPU_ISR_Enable(level);
return 1;
}
@@ -267,10 +274,11 @@ int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq)
* RATIONALE : to always have the same transition by forcing the user
* to get the previous handler before accepting to disconnect.
*/
+ _CPU_ISR_Disable(level);
if (rtems_hdl_tbl[irq->name].hdl != irq->hdl) {
+ _CPU_ISR_Enable(level);
return 0;
}
- _CPU_ISR_Disable(level);
if( (int)rtems_hdl_tbl[irq->name].next_handler != -1 )
{