diff options
author | Jennifer Averett <Jennifer.Averett@OARcorp.com> | 2005-04-18 17:25:59 +0000 |
---|---|---|
committer | Jennifer Averett <Jennifer.Averett@OARcorp.com> | 2005-04-18 17:25:59 +0000 |
commit | f0a25283d9eaa0ed70b66caebfc0541965d72cce (patch) | |
tree | c76e2a9f0fe382e8d737e97393220165dadd114e | |
parent | 2005-04-18 Eric Valette <eric.valette@free.fr> (diff) | |
download | rtems-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
-rw-r--r-- | c/src/lib/libbsp/i386/shared/ChangeLog | 5 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/shared/irq/irq.c | 35 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/shared/irq/irq.h | 7 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/shared/irq/irq_asm.S | 10 | ||||
-rw-r--r-- | c/src/lib/libbsp/i386/shared/irq/irq_init.c | 4 |
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]={ |