summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-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