From 0c94a46fa3938922481f06e8c64d8caba6d753b3 Mon Sep 17 00:00:00 2001 From: Daniel Cederman Date: Fri, 9 Jan 2015 09:03:59 +0100 Subject: bsp/sparc: Move BSP_ISR_handler to a separate file and rename it This allows it to be wrapped by another function at link-time and can be used to trace interrupts. If not placed in a separate file, the function pointer address used in BSP_shared_interrupt_init will be resolved at compile-time, and the function will not be wrappable. --- c/src/lib/libbsp/sparc/Makefile.am | 1 + c/src/lib/libbsp/sparc/erc32/Makefile.am | 1 + c/src/lib/libbsp/sparc/erc32/include/bsp.h | 3 ++ c/src/lib/libbsp/sparc/leon2/Makefile.am | 1 + c/src/lib/libbsp/sparc/leon2/include/bsp.h | 3 ++ c/src/lib/libbsp/sparc/leon3/Makefile.am | 1 + c/src/lib/libbsp/sparc/leon3/include/bsp.h | 3 ++ .../lib/libbsp/sparc/shared/irq/bsp_isr_handler.c | 35 ++++++++++++++++++++++ c/src/lib/libbsp/sparc/shared/irq/irq-shared.c | 34 +++++++-------------- 9 files changed, 59 insertions(+), 23 deletions(-) create mode 100644 c/src/lib/libbsp/sparc/shared/irq/bsp_isr_handler.c diff --git a/c/src/lib/libbsp/sparc/Makefile.am b/c/src/lib/libbsp/sparc/Makefile.am index 3d433fb981..615aea7ea0 100644 --- a/c/src/lib/libbsp/sparc/Makefile.am +++ b/c/src/lib/libbsp/sparc/Makefile.am @@ -11,6 +11,7 @@ EXTRA_DIST += shared/start/start.S # Interrupt EXTRA_DIST += shared/irq/irq-shared.c +EXTRA_DIST += shared/irq/bsp_isr_handler.c # AMBA Plug&Play bus EXTRA_DIST += shared/include/ambapp.h diff --git a/c/src/lib/libbsp/sparc/erc32/Makefile.am b/c/src/lib/libbsp/sparc/erc32/Makefile.am index c99d2fb429..8dcdd32940 100644 --- a/c/src/lib/libbsp/sparc/erc32/Makefile.am +++ b/c/src/lib/libbsp/sparc/erc32/Makefile.am @@ -71,6 +71,7 @@ include_bsp_HEADERS += \ include/bsp/irq.h libbsp_a_SOURCES += \ ../../sparc/shared/irq/irq-shared.c \ + ../../sparc/shared/irq/bsp_isr_handler.c \ ../../shared/src/irq-default-handler.c \ ../../shared/src/irq-generic.c \ ../../shared/src/irq-info.c \ diff --git a/c/src/lib/libbsp/sparc/erc32/include/bsp.h b/c/src/lib/libbsp/sparc/erc32/include/bsp.h index 33939106d8..6984c9e895 100644 --- a/c/src/lib/libbsp/sparc/erc32/include/bsp.h +++ b/c/src/lib/libbsp/sparc/erc32/include/bsp.h @@ -106,6 +106,9 @@ typedef void (*bsp_shared_isr)(void *arg); /* Initializes the Shared System Interrupt service */ extern void BSP_shared_interrupt_init(void); +/* Called directly from IRQ trap handler TRAP[0x10..0x1F] = IRQ[0..15] */ +void bsp_isr_handler(rtems_vector_number vector); + /* Registers a shared IRQ handler, and enable it at IRQ controller. Multiple * interrupt handlers may use the same IRQ number, all ISRs will be called * when an interrupt on that line is fired. diff --git a/c/src/lib/libbsp/sparc/leon2/Makefile.am b/c/src/lib/libbsp/sparc/leon2/Makefile.am index d1e3817207..efcb286601 100644 --- a/c/src/lib/libbsp/sparc/leon2/Makefile.am +++ b/c/src/lib/libbsp/sparc/leon2/Makefile.am @@ -80,6 +80,7 @@ include_bsp_HEADERS += \ include/bsp/irq.h libbsp_a_SOURCES += \ ../../sparc/shared/irq/irq-shared.c \ + ../../sparc/shared/irq/bsp_isr_handler.c \ ../../shared/src/irq-default-handler.c \ ../../shared/src/irq-generic.c \ ../../shared/src/irq-info.c \ diff --git a/c/src/lib/libbsp/sparc/leon2/include/bsp.h b/c/src/lib/libbsp/sparc/leon2/include/bsp.h index 41a1e43629..bd8587fe85 100644 --- a/c/src/lib/libbsp/sparc/leon2/include/bsp.h +++ b/c/src/lib/libbsp/sparc/leon2/include/bsp.h @@ -130,6 +130,9 @@ typedef void (*bsp_shared_isr)(void *arg); /* Initializes the Shared System Interrupt service */ extern void BSP_shared_interrupt_init(void); +/* Called directly from IRQ trap handler TRAP[0x10..0x1F] = IRQ[0..15] */ +void bsp_isr_handler(rtems_vector_number vector); + /* Registers a shared IRQ handler, and enable it at IRQ controller. Multiple * interrupt handlers may use the same IRQ number, all ISRs will be called * when an interrupt on that line is fired. diff --git a/c/src/lib/libbsp/sparc/leon3/Makefile.am b/c/src/lib/libbsp/sparc/leon3/Makefile.am index c8940953f8..cec0b34380 100644 --- a/c/src/lib/libbsp/sparc/leon3/Makefile.am +++ b/c/src/lib/libbsp/sparc/leon3/Makefile.am @@ -82,6 +82,7 @@ include_bsp_HEADERS += \ libbsp_a_SOURCES += \ startup/eirq.c \ ../../sparc/shared/irq/irq-shared.c \ + ../../sparc/shared/irq/bsp_isr_handler.c \ ../../shared/src/irq-default-handler.c \ ../../shared/src/irq-generic.c \ ../../shared/src/irq-info.c \ diff --git a/c/src/lib/libbsp/sparc/leon3/include/bsp.h b/c/src/lib/libbsp/sparc/leon3/include/bsp.h index 2514190750..47cf7017dd 100644 --- a/c/src/lib/libbsp/sparc/leon3/include/bsp.h +++ b/c/src/lib/libbsp/sparc/leon3/include/bsp.h @@ -153,6 +153,9 @@ typedef void (*bsp_shared_isr)(void *arg); /* Initializes the Shared System Interrupt service */ extern void BSP_shared_interrupt_init(void); +/* Called directly from IRQ trap handler TRAP[0x10..0x1F] = IRQ[0..15] */ +void bsp_isr_handler(rtems_vector_number vector); + /* Registers a shared IRQ handler, and enable it at IRQ controller. Multiple * interrupt handlers may use the same IRQ number, all ISRs will be called * when an interrupt on that line is fired. diff --git a/c/src/lib/libbsp/sparc/shared/irq/bsp_isr_handler.c b/c/src/lib/libbsp/sparc/shared/irq/bsp_isr_handler.c new file mode 100644 index 0000000000..a4d33b0932 --- /dev/null +++ b/c/src/lib/libbsp/sparc/shared/irq/bsp_isr_handler.c @@ -0,0 +1,35 @@ +/* +* COPYRIGHT (c) 2015 +* Cobham Gaisler +* +* The license and distribution terms for this file may be +* found in the file LICENSE in this distribution or at +* http://www.rtems.org/license/LICENSE. +* +*/ + +#include +#include +#include + +static inline void bsp_dispatch_irq(int irq) +{ + bsp_interrupt_handler_entry *e = + &bsp_interrupt_handler_table[bsp_interrupt_handler_index(irq)]; + + while (e != NULL) { + (*e->handler)(e->arg); + e = e->next; + } +} + +/* Called directly from IRQ trap handler TRAP[0x10..0x1F] = IRQ[0..15] */ +void bsp_isr_handler(rtems_vector_number vector) +{ + int irq = vector - 0x10; + + /* Let BSP fixup and/or handle incomming IRQ */ + irq = bsp_irq_fixup(irq); + + bsp_dispatch_irq(irq); +} diff --git a/c/src/lib/libbsp/sparc/shared/irq/irq-shared.c b/c/src/lib/libbsp/sparc/shared/irq/irq-shared.c index 79dbe55648..174324fb46 100644 --- a/c/src/lib/libbsp/sparc/shared/irq/irq-shared.c +++ b/c/src/lib/libbsp/sparc/shared/irq/irq-shared.c @@ -1,3 +1,13 @@ +/* +* COPYRIGHT (c) 2012-2015 +* Cobham Gaisler +* +* The license and distribution terms for this file may be +* found in the file LICENSE in this distribution or at +* http://www.rtems.org/license/LICENSE. +* +*/ + #include #include #include @@ -27,28 +37,6 @@ static inline int bsp_irq_cpu(int irq) } #endif -static inline void bsp_dispatch_irq(int irq) -{ - bsp_interrupt_handler_entry *e = - &bsp_interrupt_handler_table[bsp_interrupt_handler_index(irq)]; - - while (e != NULL) { - (*e->handler)(e->arg); - e = e->next; - } -} - -/* Called directly from IRQ trap handler TRAP[0x10..0x1F] = IRQ[0..15] */ -static void BSP_ISR_handler(rtems_vector_number vector) -{ - int irq = vector - 0x10; - - /* Let BSP fixup and/or handle incomming IRQ */ - irq = bsp_irq_fixup(irq); - - bsp_dispatch_irq(irq); -} - /* Initialize interrupts */ void BSP_shared_interrupt_init(void) { @@ -64,7 +52,7 @@ void BSP_shared_interrupt_init(void) continue; #endif vector = SPARC_ASYNCHRONOUS_TRAP(i) + 0x10; - rtems_interrupt_catch(BSP_ISR_handler, vector, &previous_isr); + rtems_interrupt_catch(bsp_isr_handler, vector, &previous_isr); } /* Initalize interrupt support */ -- cgit v1.2.3