Committed: better modularity in libgloss/cris

Hans-Peter Nilsson hans-peter.nilsson@axis.com
Wed Feb 21 17:28:00 GMT 2007


Previously, you'd have to replace crt0.S if you wanted an
interrupt function to go with your program.  Now you can replace
either the entire interrupt table (maybe you're placing it in a
non-default location or want to reset on all unrecognized
interrupts) or just override a single entry.

This code isn't used by the gcc testsuite, but regtested there
nonetheless.  Tested "manually" by checking that an interrupt
function was overridable and likewise the whole interrupt table.
Committed.

	* 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.

diff -upr src.orig/libgloss/cris/Makefile.in src/libgloss/cris/Makefile.in
--- src.orig/libgloss/cris/Makefile.in	Tue Feb  1 22:22:33 2005
+++ src/libgloss/cris/Makefile.in	Sat Feb 17 00:57:05 2007
@@ -86,7 +86,7 @@ BSP_PREFIX	=
 BSP_LDFLAGS	=
 BSP_BSP		= libbsp.a
 BSP_CRT0	= crt0.o
-BSP_OBJS	= ${OBJS} setup.o
+BSP_OBJS	= ${OBJS} setup.o irqtable.o
 BSP_SCRIPTS	=
 BSP_TEST	=
 BSP_INSTALL	= install-bsp
@@ -273,5 +273,6 @@ wait.o: wait.c linunistd.h $(objdir)/../
 write.o: write.c linunistd.h $(objdir)/../libnosys/config.h $(srcdir)/../libnosys/warning.h
 lcrt0.o: lcrt0.c linunistd.h $(objdir)/../libnosys/config.h $(srcdir)/../libnosys/warning.h
 setup.o: setup.S
+irqtable.o: irqtable.S
 crti.o: crti.c
 crtn.o: crtn.c
diff -upr src.orig/libgloss/cris/crt0.S src/libgloss/cris/crt0.S
--- src.orig/libgloss/cris/crt0.S	Thu Jan 27 23:57:32 2005
+++ src/libgloss/cris/crt0.S	Mon Feb 19 13:49:45 2007
@@ -1,5 +1,5 @@
 /* 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
@@ -42,25 +42,27 @@
  .global __start
  nop
 __start:
- ba 0f
- nop
+ move.d 0f,$r9
+ jump $r9
+ setf
+
+#ifndef __ELF__
+
+; 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"
 
- .rept 256 - 2
- .dword _.int
- .endr
-
-_.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
diff -upr src.orig/libgloss/cris/crtn.c src/libgloss/cris/crtn.c
--- src.orig/libgloss/cris/crtn.c	Thu Jan 27 23:57:32 2005
+++ src/libgloss/cris/crtn.c	Wed Feb 21 03:26:40 2007
@@ -1,5 +1,5 @@
 /* Executable and DSO init/fini end for cris*-axis-linux-gnu and simulators
-   Copyright (C) 2000, 2001, 2004, 2005 Axis Communications.
+   Copyright (C) 2000, 2001, 2004, 2005, 2007 Axis Communications.
    All rights reserved.
 
    Redistribution and use in source and binary forms, with or without
@@ -36,7 +36,7 @@ __asm__ (".section .init\n"
 #endif
          "\tmove.d [sp+],r9\n"
          "\tjump r9\n"
-         "\tnop\n"
+         "\tsetf\n"
 
          "\t.section .fini\n"
 #ifdef __PIC__
@@ -44,7 +44,7 @@ __asm__ (".section .init\n"
 #endif
          "\tmove.d [sp+],r9\n"
          "\tjump r9\n"
-         "\tnop\n");
+         "\tsetf\n");
 
 #else
 extern int Dummy;
diff -upr src.orig/libgloss/cris/irqtable.S src/libgloss/cris/irqtable.S
--- src.orig/libgloss/cris/irqtable.S	Sat Feb 17 01:08:15 2007
+++ src/libgloss/cris/irqtable.S	Mon Feb 19 17:40:59 2007
@@ -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 */
diff -upr src.orig/libgloss/cris/setup.S src/libgloss/cris/setup.S
--- src.orig/libgloss/cris/setup.S	Thu Jan 27 23:57:32 2005
+++ src/libgloss/cris/setup.S	Wed Feb 21 14:54:00 2007
@@ -1,5 +1,5 @@
 /* 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
@@ -32,8 +32,11 @@ __setup:
  /* 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.

brgds, H-P



More information about the Newlib mailing list