summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorTill Straumann <strauman@slac.stanford.edu>2008-05-14 22:33:32 +0000
committerTill Straumann <strauman@slac.stanford.edu>2008-05-14 22:33:32 +0000
commit21637fd3804d0bcda03ed8695357e8f26427d215 (patch)
tree2776189f770c57e0e8dabd85e48781aa08a9d914 /c
parent2008-05-14 Joel Sherrill <joel.sherrill@OARcorp.com> (diff)
downloadrtems-21637fd3804d0bcda03ed8695357e8f26427d215.tar.bz2
2008-05-14 Till Straumann <strauman@slac.stanford.edu>
* new-exceptions/bspsupport/irq.c: moved malloc/free outside of irq-protected critical section.
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libcpu/powerpc/ChangeLog5
-rw-r--r--c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/irq.c9
2 files changed, 11 insertions, 3 deletions
diff --git a/c/src/lib/libcpu/powerpc/ChangeLog b/c/src/lib/libcpu/powerpc/ChangeLog
index 360e3cba50..d53193ec07 100644
--- a/c/src/lib/libcpu/powerpc/ChangeLog
+++ b/c/src/lib/libcpu/powerpc/ChangeLog
@@ -1,3 +1,8 @@
+2008-05-14 Till Straumann <strauman@slac.stanford.edu>
+
+ * new-exceptions/bspsupport/irq.c: moved malloc/free
+ outside of irq-protected critical section.
+
2008-04-24 Joel Sherrill <joel.sherrill@OARcorp.com>
* mpc8260/console-generic/console-generic.c,
diff --git a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/irq.c b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/irq.c
index d972ba9b7b..1b9dcafefe 100644
--- a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/irq.c
+++ b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/irq.c
@@ -86,16 +86,18 @@ int BSP_install_rtems_shared_irq_handler (const rtems_irq_connect_data* irq)
return 0;
}
+ /* pre-allocate memory outside of critical section */
+ vchain = (rtems_irq_connect_data*)malloc(sizeof(rtems_irq_connect_data));
+
rtems_interrupt_disable(level);
if ( (int)rtems_hdl_tbl[irq->name].next_handler == -1 ) {
rtems_interrupt_enable(level);
printk("IRQ vector %d already connected to an unshared handler\n",irq->name);
+ free(vchain);
return 0;
}
- vchain = (rtems_irq_connect_data*)malloc(sizeof(rtems_irq_connect_data));
-
/* save off topmost handler */
vchain[0]= rtems_hdl_tbl[irq->name];
@@ -267,7 +269,6 @@ int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq)
vchain = vchain->next_handler;
rtems_hdl_tbl[irq->name]= *vchain;
}
- free(vchain);
}
/* Only disable at PIC if we removed the last handler */
@@ -282,6 +283,8 @@ int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq)
rtems_interrupt_enable(level);
+ free(vchain);
+
return 1;
}