summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2007-09-12 15:16:02 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2007-09-12 15:16:02 +0000
commitc83c3254d417d29e2d6809ebd3e6832105505da0 (patch)
tree8d4b68981fb529080f815fc5a824d88de500d166 /c
parent2007-09-12 Joel Sherrill <joel.sherrill@OARcorp.com> (diff)
downloadrtems-c83c3254d417d29e2d6809ebd3e6832105505da0.tar.bz2
2007-09-12 Joel Sherrill <joel.sherrill@OARcorp.com>
PR 1257/bsps * shared/irq/idt.c, shared/irq/irq.c, shared/irq/irq_init.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.
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/i386/ChangeLog12
-rw-r--r--c/src/lib/libbsp/i386/shared/irq/idt.c24
-rw-r--r--c/src/lib/libbsp/i386/shared/irq/irq.c61
-rw-r--r--c/src/lib/libbsp/i386/shared/irq/irq_init.c4
4 files changed, 57 insertions, 44 deletions
diff --git a/c/src/lib/libbsp/i386/ChangeLog b/c/src/lib/libbsp/i386/ChangeLog
index 3b764828a4..19fb7faf2a 100644
--- a/c/src/lib/libbsp/i386/ChangeLog
+++ b/c/src/lib/libbsp/i386/ChangeLog
@@ -1,3 +1,15 @@
+2007-09-12 Joel Sherrill <joel.sherrill@OARcorp.com>
+
+ PR 1257/bsps
+ * shared/irq/idt.c, shared/irq/irq.c, shared/irq/irq_init.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-03-30 Ralf Corsépius <ralf.corsepius@rtems.org>
* shared/pci/pcibios.c, shared/pci/pcibios.h:
diff --git a/c/src/lib/libbsp/i386/shared/irq/idt.c b/c/src/lib/libbsp/i386/shared/irq/idt.c
index ddaeadd878..07c748bf44 100644
--- a/c/src/lib/libbsp/i386/shared/irq/idt.c
+++ b/c/src/lib/libbsp/i386/shared/irq/idt.c
@@ -62,7 +62,7 @@ int i386_set_idt_entry (const rtems_raw_irq_connect_data* irq)
{
interrupt_gate_descriptor* idt_entry_tbl;
unsigned limit;
- unsigned int level;
+ rtems_interrupt_level level;
i386_get_info_from_IDTR (&idt_entry_tbl, &limit);
@@ -83,13 +83,13 @@ int i386_set_idt_entry (const rtems_raw_irq_connect_data* irq)
return 0;
}
- _CPU_ISR_Disable(level);
+ rtems_interrupt_disable(level);
raw_irq_table [irq->idtIndex] = *irq;
create_interrupt_gate_descriptor (&idt_entry_tbl[irq->idtIndex], irq->hdl);
irq->on(irq);
- _CPU_ISR_Enable(level);
+ rtems_interrupt_enable(level);
return 1;
}
@@ -100,7 +100,7 @@ void _CPU_ISR_install_vector (uint32_t vector,
interrupt_gate_descriptor* idt_entry_tbl;
unsigned limit;
interrupt_gate_descriptor new;
- unsigned int level;
+ rtems_interrupt_level level;
i386_get_info_from_IDTR (&idt_entry_tbl, &limit);
@@ -110,14 +110,14 @@ void _CPU_ISR_install_vector (uint32_t vector,
if (vector >= limit) {
return;
}
- _CPU_ISR_Disable(level)
+ rtems_interrupt_disable(level);
* ((unsigned int *) oldHdl) = idt_entry_tbl[vector].low_offsets_bits |
(idt_entry_tbl[vector].high_offsets_bits << 16);
create_interrupt_gate_descriptor(&new, hdl);
idt_entry_tbl[vector] = new;
- _CPU_ISR_Enable(level);
+ rtems_interrupt_enable(level);
}
int i386_get_current_idt_entry (rtems_raw_irq_connect_data* irq)
@@ -144,7 +144,7 @@ int i386_delete_idt_entry (const rtems_raw_irq_connect_data* irq)
{
interrupt_gate_descriptor* idt_entry_tbl;
unsigned limit;
- unsigned int level;
+ rtems_interrupt_level level;
i386_get_info_from_IDTR (&idt_entry_tbl, &limit);
@@ -164,7 +164,7 @@ int i386_delete_idt_entry (const rtems_raw_irq_connect_data* irq)
if (get_hdl_from_vector(irq->idtIndex) != irq->hdl){
return 0;
}
- _CPU_ISR_Disable(level);
+ rtems_interrupt_disable(level);
idt_entry_tbl[irq->idtIndex] = default_idt_entry;
@@ -173,7 +173,7 @@ int i386_delete_idt_entry (const rtems_raw_irq_connect_data* irq)
raw_irq_table[irq->idtIndex] = default_raw_irq_entry;
raw_irq_table[irq->idtIndex].idtIndex = irq->idtIndex;
- _CPU_ISR_Enable(level);
+ rtems_interrupt_enable(level);
return 1;
}
@@ -185,7 +185,7 @@ int i386_init_idt (rtems_raw_irq_global_settings* config)
{
unsigned limit;
unsigned i;
- unsigned level;
+ rtems_interrupt_level level;
interrupt_gate_descriptor* idt_entry_tbl;
i386_get_info_from_IDTR (&idt_entry_tbl, &limit);
@@ -203,7 +203,7 @@ int i386_init_idt (rtems_raw_irq_global_settings* config)
local_settings = config;
default_raw_irq_entry = config->defaultRawEntry;
- _CPU_ISR_Disable(level);
+ rtems_interrupt_disable(level);
create_interrupt_gate_descriptor (&default_idt_entry, default_raw_irq_entry.hdl);
@@ -218,7 +218,7 @@ int i386_init_idt (rtems_raw_irq_global_settings* config)
raw_irq_table[i].off(&raw_irq_table[i]);
}
}
- _CPU_ISR_Enable(level);
+ rtems_interrupt_enable(level);
return 1;
}
diff --git a/c/src/lib/libbsp/i386/shared/irq/irq.c b/c/src/lib/libbsp/i386/shared/irq/irq.c
index a8d57442f9..78fdcfcaf5 100644
--- a/c/src/lib/libbsp/i386/shared/irq/irq.c
+++ b/c/src/lib/libbsp/i386/shared/irq/irq.c
@@ -56,15 +56,15 @@ 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_LOWEST_OFFSET) ||
((int)irqLine > BSP_MAX_OFFSET )
)
return 1;
- _CPU_ISR_Disable(level);
+ rtems_interrupt_disable(level);
mask = 1 << irqLine;
i8259s_cache |= mask;
@@ -77,7 +77,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;
}
@@ -91,15 +91,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_LOWEST_OFFSET) ||
((int)irqLine > BSP_MAX_OFFSET )
)
return 1;
- _CPU_ISR_Disable(level);
+ rtems_interrupt_disable(level);
mask = ~(1 << irqLine);
i8259s_cache &= mask;
@@ -112,7 +112,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 */
@@ -200,7 +200,7 @@ static int isValidInterrupt(int irq)
int BSP_install_rtems_irq_handler (const rtems_irq_connect_data* irq)
{
- unsigned int level;
+ rtems_interrupt_level level;
if (!isValidInterrupt(irq->name)) {
return 0;
@@ -212,9 +212,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);
return 0;
}
@@ -231,27 +231,27 @@ 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)
{
- unsigned int level;
+ rtems_interrupt_level level;
if (!isValidInterrupt(irq->name)) {
return 0;
@@ -263,9 +263,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;
}
@@ -284,7 +284,7 @@ int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq)
*/
rtems_hdl_tbl[irq->name] = default_rtems_entry;
- _CPU_ISR_Enable(level);
+ rtems_interrupt_enable(level);
return 1;
}
@@ -295,16 +295,17 @@ 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;
- /*
- * Store various code accelerators
- */
+ int i;
+ rtems_interrupt_level level;
+
+ /*
+ * Store various code accelerators
+ */
internal_config = config;
default_rtems_entry = config->defaultEntry;
rtems_hdl_tbl = config->irqHdlTbl;
- _CPU_ISR_Disable(level);
+ rtems_interrupt_disable(level);
/*
* set up internal tables used by rtems interrupt prologue
*/
@@ -324,7 +325,7 @@ int BSP_rtems_irq_mngt_set(rtems_irq_global_settings* config)
* must enable slave pic anyway
*/
BSP_irq_enable_at_i8259s (2);
- _CPU_ISR_Enable(level);
+ rtems_interrupt_enable(level);
return 1;
}
diff --git a/c/src/lib/libbsp/i386/shared/irq/irq_init.c b/c/src/lib/libbsp/i386/shared/irq/irq_init.c
index 67aae142f7..5c00859c16 100644
--- a/c/src/lib/libbsp/i386/shared/irq/irq_init.c
+++ b/c/src/lib/libbsp/i386/shared/irq/irq_init.c
@@ -114,7 +114,7 @@ void rtems_irq_mngt_init()
int i;
interrupt_gate_descriptor* idt_entry_tbl;
unsigned int limit;
- unsigned int level;
+ rtems_interrupt_level level;
i386_get_info_from_IDTR(&idt_entry_tbl, &limit);
@@ -126,7 +126,7 @@ void rtems_irq_mngt_init()
while(1);
}
- _CPU_ISR_Disable(level);
+ rtems_interrupt_disable(level);
/*
* Init the complete IDT vector table with defaultRawIrq value