135 lines
4.5 KiB
ArmAsm
135 lines
4.5 KiB
ArmAsm
/* driver_static_irq_stubs.S - interrupt stubs */
|
|
|
|
/*
|
|
* Copyright (c) 2012-2015, Wind River Systems, Inc.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* 1) Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
*
|
|
* 2) Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
*
|
|
* 3) Neither the name of Wind River Systems nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software without
|
|
* specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
/*
|
|
DESCRIPTION
|
|
This module contains the static interrupt stubs for the various drivers employed
|
|
by x86 BSPs.
|
|
*/
|
|
|
|
#define _ASMLANGUAGE
|
|
|
|
#include <arch/x86/asm.h>
|
|
#include <drivers/ioapic.h>
|
|
#include <drivers/loapic.h>
|
|
#include <drivers/pic.h>
|
|
#include <drivers/system_timer.h>
|
|
|
|
#if defined (CONFIG_PIC)
|
|
GTEXT(_pic_master__i8259_boi_master_stub)
|
|
GTEXT(_pic_slave__i8259_boi_slave_stub)
|
|
#endif
|
|
|
|
#if defined (CONFIG_PIT)
|
|
pic_master_mkstub i8253 _timer_int_handler
|
|
#endif
|
|
|
|
#if defined(CONFIG_LOAPIC_TIMER)
|
|
loapic_mkstub loapic _timer_int_handler
|
|
#endif
|
|
|
|
#if defined(CONFIG_HPET_TIMER)
|
|
ioapic_mkstub hpet _timer_int_handler
|
|
#endif
|
|
|
|
#if defined(CONFIG_BLUETOOTH_UART)
|
|
#if defined(CONFIG_PIC)
|
|
pic_master_mkstub bluetooth bt_uart_isr
|
|
#elif defined(CONFIG_IOAPIC)
|
|
ioapic_mkstub bluetooth bt_uart_isr
|
|
#endif /* CONFIG_PIC */
|
|
#endif /* CONFIG_BLUETOOTH_UART */
|
|
|
|
#if defined(CONFIG_CONSOLE_HANDLER)
|
|
#if defined(CONFIG_PIC)
|
|
pic_master_mkstub console uart_console_isr
|
|
#elif defined(CONFIG_IOAPIC)
|
|
ioapic_mkstub console uart_console_isr
|
|
#endif /* CONFIG_PIC */
|
|
#endif /* CONFIG_CONSOLE_HANDLER */
|
|
|
|
#if defined(CONFIG_UART_SIMPLE)
|
|
#if defined(CONFIG_PIC)
|
|
pic_master_mkstub uart_simple uart_simple_isr
|
|
#elif defined(CONFIG_IOAPIC)
|
|
ioapic_mkstub uart_simple uart_simple_isr
|
|
#endif /* CONFIG_PIC */
|
|
#endif /* CONFIG_UART_SIMPLE */
|
|
|
|
/* externs (internal APIs) */
|
|
|
|
GTEXT(_IntEnt)
|
|
GTEXT(_IntExit)
|
|
|
|
#if defined(CONFIG_PIC)
|
|
SECTION_FUNC(TEXT, _pic_master__i8259_boi_master_stub)
|
|
/*
|
|
* Handle possible spurious (stray) interrupts on IRQ 7. Since on this
|
|
* particular BSP, no device is hooked up to IRQ 7, a C level ISR is
|
|
* not called as the call to the BOI routine will not return.
|
|
*/
|
|
call _IntEnt /* Inform kernel interrupt has begun */
|
|
call _i8259_boi_master /* Call the BOI routine (won't return) */
|
|
|
|
/*
|
|
* If an actual device was installed on IRQ 7, then the BOI may return,
|
|
* indicating a real interrupt was asserted on IRQ 7.
|
|
* The following code should be invoked in this case to invoke the ISR:
|
|
*
|
|
* pushl $param /+ Push argument to ISR +/
|
|
* call ISR /+ Call 'C' level ISR +/
|
|
* addl $4, %esp /+ pop arg to ISR +/
|
|
* jmp _IntExit /+ Inform kernel interrupt is done +/
|
|
*/
|
|
|
|
SECTION_FUNC(TEXT, _pic_slave__i8259_boi_slave_stub)
|
|
/*
|
|
* Handle possible spurious (stray) interrupts on IRQ 15 (slave PIC
|
|
* IRQ 7). Since on this particular BSP, no device is hooked up to
|
|
* IRQ 15, a C level ISR is not called as the call the BOI routine
|
|
* will not return.
|
|
*/
|
|
call _IntEnt /* Inform kernel interrupt has begun */
|
|
call _i8259_boi_slave /* Call the BOI routine (won't return) */
|
|
|
|
/*
|
|
* If an actual device was installed on IRQ 15, then the BOI may return,
|
|
* indicating a real interrupt was asserted on IRQ 15.
|
|
* The following code should be invoked in this case to invoke the ISR:
|
|
*
|
|
* pushl $param /+ Push argument to ISR +/
|
|
* call ISR /+ Call 'C' level ISR +/
|
|
* addl $4, %esp /+ pop arg to ISR +/
|
|
* jmp _IntExit /+ Inform kernel interrupt is done +/
|
|
*/
|
|
#endif /* CONFIG_PIC */
|