diff options
Diffstat (limited to 'c')
-rw-r--r-- | c/src/lib/libbsp/powerpc/ChangeLog | 12 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/shared/irq/i8259.c | 16 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/shared/irq/irq.c | 64 |
3 files changed, 52 insertions, 40 deletions
diff --git a/c/src/lib/libbsp/powerpc/ChangeLog b/c/src/lib/libbsp/powerpc/ChangeLog index 58e1600e9d..dc24f73113 100644 --- a/c/src/lib/libbsp/powerpc/ChangeLog +++ b/c/src/lib/libbsp/powerpc/ChangeLog @@ -1,3 +1,15 @@ +2007-09-12 Joel Sherrill <joel.sherrill@OARcorp.com> + + PR 1257/bsps + * shared/irq/i8259.c, shared/irq/irq.c: Code outside of cpukit should + use the public API for + rtems_interrupt_disable/rtems_interrupt_enable. By bypassing the + public API and directly accessing _CPU_ISR_Disable and + _CPU_ISR_Enable, they were bypassing the compiler memory barrier + directive which could lead to problems. This patch also changes the + type of the variable passed into these routines and addresses minor + style issues. + 2007-09-07 Joel Sherrill <joel.sherrill@OARcorp.com> * shared/console/polled_io.c: Change prototype so code compiles. diff --git a/c/src/lib/libbsp/powerpc/shared/irq/i8259.c b/c/src/lib/libbsp/powerpc/shared/irq/i8259.c index 6e28b3c73d..a133d16898 100644 --- a/c/src/lib/libbsp/powerpc/shared/irq/i8259.c +++ b/c/src/lib/libbsp/powerpc/shared/irq/i8259.c @@ -33,15 +33,15 @@ volatile rtems_i8259_masks i8259s_cache = 0xfffb; +--------------------------------------------------------------------------*/ int BSP_irq_disable_at_i8259s (const rtems_irq_number irqLine) { - unsigned short mask; - unsigned int level; + unsigned short mask; + rtems_interrupt_level level; if ( ((int)irqLine < BSP_ISA_IRQ_LOWEST_OFFSET) || ((int)irqLine > BSP_ISA_IRQ_MAX_OFFSET) ) return 1; - _CPU_ISR_Disable(level); + rtems_interrupt_disable(level); mask = 1 << irqLine; i8259s_cache |= mask; @@ -54,7 +54,7 @@ int BSP_irq_disable_at_i8259s (const rtems_irq_number irqLine) { outport_byte(PIC_SLAVE_IMR_IO_PORT, ((i8259s_cache & 0xff00) >> 8)); } - _CPU_ISR_Enable (level); + rtems_interrupt_enable(level); return 0; } @@ -68,15 +68,15 @@ int BSP_irq_disable_at_i8259s (const rtems_irq_number irqLine) +--------------------------------------------------------------------------*/ int BSP_irq_enable_at_i8259s (const rtems_irq_number irqLine) { - unsigned short mask; - unsigned int level; + unsigned short mask; + rtems_interrupt_level level; if ( ((int)irqLine < BSP_ISA_IRQ_LOWEST_OFFSET) || ((int)irqLine > BSP_ISA_IRQ_MAX_OFFSET ) ) return 1; - _CPU_ISR_Disable(level); + rtems_interrupt_disable(level); mask = ~(1 << irqLine); i8259s_cache &= mask; @@ -89,7 +89,7 @@ int BSP_irq_enable_at_i8259s (const rtems_irq_number irqLine) { outport_byte(PIC_SLAVE_IMR_IO_PORT, ((i8259s_cache & 0xff00) >> 8)); } - _CPU_ISR_Enable (level); + rtems_interrupt_enable(level); return 0; } /* mask_irq */ diff --git a/c/src/lib/libbsp/powerpc/shared/irq/irq.c b/c/src/lib/libbsp/powerpc/shared/irq/irq.c index e8c3803f64..a267587a2a 100644 --- a/c/src/lib/libbsp/powerpc/shared/irq/irq.c +++ b/c/src/lib/libbsp/powerpc/shared/irq/irq.c @@ -84,7 +84,7 @@ static int isValidInterrupt(int irq) */ int BSP_install_rtems_shared_irq_handler (const rtems_irq_connect_data* irq) { - unsigned int level; + rtems_interrupt_level level; rtems_irq_connect_data* vchain; if (!isValidInterrupt(irq->name)) { @@ -92,10 +92,10 @@ int BSP_install_rtems_shared_irq_handler (const rtems_irq_connect_data* irq) return 0; } - _CPU_ISR_Disable(level); + rtems_interrupt_disable(level); if ( (int)rtems_hdl_tbl[irq->name].next_handler == -1 ) { - _CPU_ISR_Enable(level); + rtems_interrupt_enable(level); printk("IRQ vector %d already connected to an unshared handler\n",irq->name); return 0; } @@ -125,7 +125,7 @@ int BSP_install_rtems_shared_irq_handler (const rtems_irq_connect_data* irq) */ irq->on(irq); - _CPU_ISR_Enable(level); + rtems_interrupt_enable(level); return 1; } @@ -136,7 +136,7 @@ int BSP_install_rtems_shared_irq_handler (const rtems_irq_connect_data* irq) int BSP_install_rtems_irq_handler (const rtems_irq_connect_data* irq) { - unsigned int level; + rtems_interrupt_level level; if (!isValidInterrupt(irq->name)) { printk("Invalid interrupt vector %d\n",irq->name); @@ -149,9 +149,9 @@ 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); + rtems_interrupt_disable(level); if (rtems_hdl_tbl[irq->name].hdl != default_rtems_entry.hdl) { - _CPU_ISR_Enable(level); + rtems_interrupt_enable(level); printk("IRQ vector %d already connected\n",irq->name); return 0; } @@ -174,28 +174,28 @@ int BSP_install_rtems_irq_handler (const rtems_irq_connect_data* irq) */ irq->on(irq); - _CPU_ISR_Enable(level); + rtems_interrupt_enable(level); return 1; } int BSP_get_current_rtems_irq_handler (rtems_irq_connect_data* irq) { - unsigned int level; + rtems_interrupt_level level; - if (!isValidInterrupt(irq->name)) { + if (!isValidInterrupt(irq->name)) { return 0; - } - _CPU_ISR_Disable(level); - *irq = rtems_hdl_tbl[irq->name]; - _CPU_ISR_Enable(level); - return 1; + } + rtems_interrupt_disable(level); + *irq = rtems_hdl_tbl[irq->name]; + rtems_interrupt_enable(level); + return 1; } int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq) { - rtems_irq_connect_data *pchain= NULL, *vchain = NULL; - unsigned int level; + rtems_irq_connect_data *pchain= NULL, *vchain = NULL; + rtems_interrupt_level level; if (!isValidInterrupt(irq->name)) { return 0; @@ -207,9 +207,9 @@ 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); + rtems_interrupt_disable(level); if (rtems_hdl_tbl[irq->name].hdl != irq->hdl) { - _CPU_ISR_Enable(level); + rtems_interrupt_enable(level); return 0; } @@ -229,7 +229,7 @@ int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq) if( !found ) { - _CPU_ISR_Enable(level); + rtems_interrupt_enable(level); return 0; } } @@ -237,7 +237,7 @@ int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq) { if (rtems_hdl_tbl[irq->name].hdl != irq->hdl) { - _CPU_ISR_Enable(level); + rtems_interrupt_enable(level); return 0; } } @@ -281,7 +281,7 @@ int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq) free(vchain); } - _CPU_ISR_Enable(level); + rtems_interrupt_enable(level); return 1; } @@ -292,19 +292,19 @@ int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq) int BSP_rtems_irq_mngt_set(rtems_irq_global_settings* config) { - int i; - unsigned int level; - rtems_irq_connect_data* vchain; - rtems_raw_except_connect_data vectorDesc; + int i; + rtems_interrupt_level level; + rtems_irq_connect_data* vchain; + rtems_raw_except_connect_data vectorDesc; - /* - * Store various code accelerators - */ + /* + * Store various code accelerators + */ internal_config = config; default_rtems_entry = config->defaultEntry; - rtems_hdl_tbl = config->irqHdlTbl; + rtems_hdl_tbl = config->irqHdlTbl; - _CPU_ISR_Disable(level); + rtems_interrupt_disable(level); if ( !BSP_setup_the_pic(config) ) { printk("PIC setup failed; leaving IRQs OFF\n"); @@ -320,7 +320,7 @@ int BSP_rtems_irq_mngt_set(rtems_irq_global_settings* config) } } - _CPU_ISR_Enable(level); + rtems_interrupt_enable(level); /* * We must connect the raw irq handler for the two |