From fe235a1e289d4ae8be6825180c6aec29cd704298 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 21 Aug 2003 17:05:56 +0000 Subject: 2003-08-21 Till Strauman PR 456/bsps * irq/irq.c: Fix race condition when installing an ISR. --- c/src/lib/libbsp/powerpc/shared/ChangeLog | 5 +++++ c/src/lib/libbsp/powerpc/shared/irq/irq.c | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) (limited to 'c/src/lib/libbsp/powerpc') 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 + + PR 456/bsps + * irq/irq.c: Fix race condition when installing an ISR. + 2003-08-16 Ralf Corsepius * 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 ) { -- cgit v1.2.3