+2007-02-21 Hans-Peter Nilsson <hp@axis.com>
+
+ * cris/crt0.S: Use jump, not ba, to skip the interrupt table. Use
+ "setf", not "nop", for common_v10_v32 compatibility.
+ Move out interrupt table to irqtable.S. Include here for non-ELF.
+ * cris/irqtable.S: Extracted from cris/crt0.S. Provide per-entry
+ weak default stub definitions.
+ * cris/crtn.c: Use "setf", not "nop", for common_v10_v32
+ compatibility.
+ * cris/setup.S [__arch_common_v10_v32]: Return.
+ * cris/Makefile.in (BSP_OBJS): Add irqtable.o.
+
2007-02-15 Nick Clifton <nickc@redhat.com>
* sparc/cygmon.ld.src: Link .rodata.* input sections into .text
/* Generic simplistic start-up-stub for CRIS/CRISv32.
- Copyright (C) 1993-2005 Axis Communications.
+ Copyright (C) 1993-2005, 2007 Axis Communications.
All rights reserved.
Redistribution and use in source and binary forms, with or without
.global __start
nop
__start:
- ba 0f
- nop
+ move.d 0f,$r9
+ jump $r9
+ setf
+
+#ifndef __ELF__
- .rept 256 - 2
- .dword _.int
- .endr
+; For a.out, everything read-only and code-wise goes into a
+; single section, so we can't separate the interrupt table from
+; the startup code if we want to have files in-between.
+#define IN_CRT0
+#include "irqtable.S"
-_.int:
-#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
+
+; The interrupt table (at offset 12, irq #3) is expected here.
+; The simplest way to make sure we link it in, is to sacrifice
+; some memory and refer to it with a relocation.
+ .text
+ .dword __irqtable_at_irq3
+
+#endif /* __ELF__ */
0:
move.d __setup,$r9
--- /dev/null
+/* 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 */
/* Support for standalone CRIS/CRISv32 code.
- Copyright (C) 2005 Axis Communications.
+ Copyright (C) 2005, 2007 Axis Communications.
All rights reserved.
Redistribution and use in source and binary forms, with or without
/* Make sure to save SRP. */
#ifdef __arch_common_v10_v32
/* Can't do anything if we don't know for which arch. This file is
- then only a placeholder. Oh, and we can't use the "ret" insn in
- "common" code. */
+ then only a placeholder. Oh, and we can't use the "ret" and "nop"
+ insns in "common" code. */
+ move $srp,$r9
+ jump $r9
+ setf
#else
/* Code missing:
- Initialize RAM circuits.