summaryrefslogtreecommitdiffstats
path: root/c/src
diff options
context:
space:
mode:
authorJennifer Averett <Jennifer.Averett@OARcorp.com>2005-04-18 17:25:59 +0000
committerJennifer Averett <Jennifer.Averett@OARcorp.com>2005-04-18 17:25:59 +0000
commitf0a25283d9eaa0ed70b66caebfc0541965d72cce (patch)
treec76e2a9f0fe382e8d737e97393220165dadd114e /c/src
parent2005-04-18 Eric Valette <eric.valette@free.fr> (diff)
downloadrtems-f0a25283d9eaa0ed70b66caebfc0541965d72cce.tar.bz2
2005-04-18 Eric Valette <eric.valette@free.fr>
* irq/irq.c, irq/irq.h, irq/irq_asm.S, irq/irq_init.c: Added parameter to irq handler
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/i386/shared/ChangeLog5
-rw-r--r--c/src/lib/libbsp/i386/shared/irq/irq.c35
-rw-r--r--c/src/lib/libbsp/i386/shared/irq/irq.h7
-rw-r--r--c/src/lib/libbsp/i386/shared/irq/irq_asm.S10
-rw-r--r--c/src/lib/libbsp/i386/shared/irq/irq_init.c4
5 files changed, 27 insertions, 34 deletions
diff --git a/c/src/lib/libbsp/i386/shared/ChangeLog b/c/src/lib/libbsp/i386/shared/ChangeLog
index 96c1b70eaf..55adb20a53 100644
--- a/c/src/lib/libbsp/i386/shared/ChangeLog
+++ b/c/src/lib/libbsp/i386/shared/ChangeLog
@@ -1,3 +1,8 @@
+2005-04-18 Eric Valette <eric.valette@free.fr>
+
+ * irq/irq.c, irq/irq.h, irq/irq_asm.S, irq/irq_init.c: Added parameter
+ to irq handler
+
2005-03-14 Joel Sherrill <joel@OARcorp.com>
* pci/pcibios.c, pci/pcibios.h: Continue PCI API unification. All use
diff --git a/c/src/lib/libbsp/i386/shared/irq/irq.c b/c/src/lib/libbsp/i386/shared/irq/irq.c
index c30ee820e8..b71e1f64ff 100644
--- a/c/src/lib/libbsp/i386/shared/irq/irq.c
+++ b/c/src/lib/libbsp/i386/shared/irq/irq.c
@@ -27,13 +27,6 @@
rtems_i8259_masks irq_mask_or_tbl[BSP_IRQ_LINES_NUMBER];
/*
- * Copy of data given via initial BSP_rtems_irq_mngt_set() for
- * the sake of efficiency.
- * CAUTION : this table is accessed directly by interrupt routine
- * prologue.
- */
-rtems_irq_hdl current_irq[BSP_IRQ_LINES_NUMBER];
-/*
* default handler connected on each irq after bsp initialization
*/
static rtems_irq_connect_data default_rtems_entry;
@@ -43,7 +36,7 @@ static rtems_irq_connect_data default_rtems_entry;
* management.
*/
static rtems_irq_global_settings* internal_config;
-static rtems_irq_connect_data* rtems_hdl_tbl;
+rtems_irq_connect_data* rtems_hdl_tbl;
/*-------------------------------------------------------------------------+
| Cache for 1st and 2nd PIC IRQ line's status (enabled or disabled) register.
+--------------------------------------------------------------------------*/
@@ -190,19 +183,6 @@ static void compute_i8259_masks_from_prio ()
}
/*
- * Caution : this function assumes the variable "internal_config"
- * is already set and that the tables it contains are still valid
- * and accessible.
- */
-static void make_copy_of_handlers ()
-{
- int i;
- for (i=0; i < internal_config->irqNb; i++) {
- current_irq [i] = internal_config->irqHdlTbl[i].hdl;
- }
-}
-
-/*
* This function check that the value given for the irq line
* is valid.
*/
@@ -243,10 +223,6 @@ int BSP_install_rtems_irq_handler (const rtems_irq_connect_data* irq)
*/
rtems_hdl_tbl[irq->name] = *irq;
/*
- * update table used directly by rtems interrupt prologue
- */
- current_irq [irq->name] = irq->hdl;
- /*
* Enable interrupt at PIC level
*/
BSP_irq_enable_at_i8259s (irq->name);
@@ -308,8 +284,6 @@ int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq)
*/
rtems_hdl_tbl[irq->name] = default_rtems_entry;
- current_irq[irq->name] = default_rtems_entry.hdl;
-
_CPU_ISR_Enable(level);
return 1;
@@ -335,7 +309,6 @@ int BSP_rtems_irq_mngt_set(rtems_irq_global_settings* config)
* set up internal tables used by rtems interrupt prologue
*/
compute_i8259_masks_from_prio ();
- make_copy_of_handlers ();
for (i=0; i < internal_config->irqNb; i++) {
if (rtems_hdl_tbl[i].hdl != default_rtems_entry.hdl) {
@@ -379,3 +352,9 @@ void _ThreadProcessSignalsFromIrq (CPU_Exception_frame* ctx)
* This will include DEBUG session requested from keyboard...
*/
}
+
+void processIrq(unsigned index)
+{
+ rtems_hdl_tbl[index].hdl(rtems_hdl_tbl[index].handle);
+}
+
diff --git a/c/src/lib/libbsp/i386/shared/irq/irq.h b/c/src/lib/libbsp/i386/shared/irq/irq.h
index 84651e7755..8aa0053f64 100644
--- a/c/src/lib/libbsp/i386/shared/irq/irq.h
+++ b/c/src/lib/libbsp/i386/shared/irq/irq.h
@@ -70,7 +70,8 @@ extern rtems_i8259_masks i8259s_cache;
struct __rtems_irq_connect_data__; /* forward declaratiuon */
-typedef void (*rtems_irq_hdl) (void);
+typedef void *rtems_irq_hdl_param;
+typedef void (*rtems_irq_hdl) (rtems_irq_hdl_param);
typedef void (*rtems_irq_enable) (const struct __rtems_irq_connect_data__*);
typedef void (*rtems_irq_disable) (const struct __rtems_irq_connect_data__*);
typedef int (*rtems_irq_is_enabled) (const struct __rtems_irq_connect_data__*);
@@ -85,6 +86,10 @@ typedef struct __rtems_irq_connect_data__ {
*/
rtems_irq_hdl hdl;
/*
+ * Handler handle to store private data
+ */
+ rtems_irq_hdl_param handle;
+ /*
* function for enabling interrupts at device level (ONLY!).
* The BSP code will automatically enable it at i8259s level.
* RATIONALE : anyway such code has to exist in current driver code.
diff --git a/c/src/lib/libbsp/i386/shared/irq/irq_asm.S b/c/src/lib/libbsp/i386/shared/irq/irq_asm.S
index 6504079fda..b99de3740b 100644
--- a/c/src/lib/libbsp/i386/shared/irq/irq_asm.S
+++ b/c/src/lib/libbsp/i386/shared/irq/irq_asm.S
@@ -107,9 +107,13 @@ nested:
*/
pushl ecx /* push vector number */
- mov SYM (current_irq) (,ecx,4),eax
- /* eax = Users handler */
- call *eax /* invoke user ISR */
+ lea (ecx,ecx,2), eax
+ mov SYM (rtems_hdl_tbl), edx
+ shl $0x3,eax
+ pushl 0x8(edx,eax,1) /* push hdl argument */
+ call *0x4(edx,eax,1) /* call hdl */
+ addl $4, esp
+
/*
* disable interrupts_again
*/
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 61969cf182..cd420d6b8b 100644
--- a/c/src/lib/libbsp/i386/shared/irq/irq_init.c
+++ b/c/src/lib/libbsp/i386/shared/irq/irq_init.c
@@ -81,8 +81,8 @@ static rtems_raw_irq_connect_data defaultRawIrq = {
};
static rtems_irq_connect_data defaultIrq = {
- /* vectorIdex, hdl , on , off , isOn */
- 0, nop_func , nop_func , nop_func , not_connected
+ /* vectorIdex, hdl , handle , on , off , isOn */
+ 0, nop_func , 0 , nop_func , nop_func , not_connected
};
static rtems_irq_prio irqPrioTable[BSP_IRQ_LINES_NUMBER]={