summaryrefslogtreecommitdiffstats
path: root/libgloss/cris/irqtable.S
diff options
context:
space:
mode:
Diffstat (limited to 'libgloss/cris/irqtable.S')
-rw-r--r--libgloss/cris/irqtable.S82
1 files changed, 82 insertions, 0 deletions
diff --git a/libgloss/cris/irqtable.S b/libgloss/cris/irqtable.S
new file mode 100644
index 000000000..202e952eb
--- /dev/null
+++ b/libgloss/cris/irqtable.S
@@ -0,0 +1,82 @@
+/* Default interrupt table for CRIS/CRISv32.
+ Copyright (C) 2007 Axis Communications.
+ All rights reserved.
+
+ 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. Neither the name of Axis Communications 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 AXIS COMMUNICATIONS AND ITS 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 AXIS
+ COMMUNICATIONS OR ITS 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. */
+
+#ifdef __ELF__
+ .section .startup,"ax"
+#else
+ .text
+#endif
+
+#if defined (__ELF__) || defined (IN_CRT0)
+; This is included from crt0.S for a.out, as we can't have it as
+; a separate object file in a library due to the lack of named
+; section support and the required placement at address 3*4.
+
+; We define an interrupt table with references to the symbols
+; _.irq_XX where XX are hex numbers 3..ff (lower-case). They
+; are satisfied by weak aliases to the _.irq stub function in
+; this file. When overridden, the overriding function must be
+; in code explicitly linked in, i.e. *not* in a library.
+
+ .global __irqtable_at_irq3
+__irqtable_at_irq3:
+
+ .irpc irqno,3456789abcdef
+ .weak _.irq_0\irqno
+ .set _.irq_0\irqno,_.irq
+ .dword _.irq_0\irqno
+ .endr
+
+ .irpc irqhd,123456789abcdef
+ .irpc irqld,0123456789abcdef
+ .weak _.irq_\irqhd\irqld
+ .set _.irq_\irqhd\irqld,_.irq
+ .dword _.irq_\irqhd\irqld
+ .endr
+ .endr
+
+; No use having a separate file with default _.irq_[0-f][0-f]
+; definitions; just provide a single stub with a weak definition
+; and make it up to the user to provide a strong definition that
+; they force to be linked in (i.e. not in a library or at least
+; together with another symbol they know is linked in).
+ .text
+
+_.irq:
+#ifdef __arch_common_v10_v32
+ ; This is just to allow the multilib to compile without
+ ; hackery: the "common" subset doesn't recognize
+ ; interrupt-return insns.
+#elif __CRIS_arch_version >= 32
+ rete
+ rfe
+#else
+ reti
+ nop
+#endif
+#endif /* __ELF__ || IN_CRT0 */