summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2006-10-23 19:28:29 +0000
committerNathan Sidwell <nathan@codesourcery.com>2006-10-23 19:28:29 +0000
commite9375a96b3722d29e580a7f1a7187625eb94a399 (patch)
tree3338de6d50a32b7f67a950c6290bbb9c70b70102
parent9e82dd14c5f26edba19c1ce6b3140b924ee202df (diff)
downloadcygnal-e9375a96b3722d29e580a7f1a7187625eb94a399.tar.gz
cygnal-e9375a96b3722d29e580a7f1a7187625eb94a399.tar.bz2
cygnal-e9375a96b3722d29e580a7f1a7187625eb94a399.zip
libgloss/
* m68k/Makefile.in (CF_CRT0): Rename to CF_CRT0S, separate hosted & unhosted versions. (CF_OBJS): Add cf-isv.o. (CF_SOURCES): Add cf-isv.S. (cf-hosted-crt0.o, cf-unhosted-crt0.o): New targets. * m68k/cf-isv.S: New, broken out of ... * m68k/cf-crt0.S: ... here. Add HOSTED & UNHOSTED differences. * m68k/cf-crt1.c (__start1): Add heap_limit argument. (__heap_limit): Define. * m68k/cf-sbrk.c (__heap_limit): Declare. (sbrk): Adjust for __heap_limit. * m68k/cf.sc: Use different crt0's for hosted & unhosted. Install a separate isv.o file. * m68k/io.h (HOSTED_PUTCHAR): Replace with ... (HOSTED_INIT_SIM): ... this.
-rw-r--r--ChangeLog.csl19
-rw-r--r--libgloss/m68k/Makefile.in18
-rw-r--r--libgloss/m68k/cf-crt0.S86
-rw-r--r--libgloss/m68k/cf-crt1.c11
-rw-r--r--libgloss/m68k/cf-isv.S75
-rw-r--r--libgloss/m68k/cf-sbrk.c7
-rw-r--r--libgloss/m68k/cf.sc5
-rw-r--r--libgloss/m68k/io.h2
8 files changed, 144 insertions, 79 deletions
diff --git a/ChangeLog.csl b/ChangeLog.csl
index 09d6f08de..11750a7b2 100644
--- a/ChangeLog.csl
+++ b/ChangeLog.csl
@@ -1,3 +1,22 @@
+2006-10-23 Nathan Sidwell <nathan@codesourcery.com>
+
+ libgloss/
+ * m68k/Makefile.in (CF_CRT0): Rename to CF_CRT0S, separate hosted
+ & unhosted versions.
+ (CF_OBJS): Add cf-isv.o.
+ (CF_SOURCES): Add cf-isv.S.
+ (cf-hosted-crt0.o, cf-unhosted-crt0.o): New targets.
+ * m68k/cf-isv.S: New, broken out of ...
+ * m68k/cf-crt0.S: ... here. Add HOSTED & UNHOSTED differences.
+ * m68k/cf-crt1.c (__start1): Add heap_limit argument.
+ (__heap_limit): Define.
+ * m68k/cf-sbrk.c (__heap_limit): Declare.
+ (sbrk): Adjust for __heap_limit.
+ * m68k/cf.sc: Use different crt0's for hosted & unhosted.
+ Install a separate isv.o file.
+ * m68k/io.h (HOSTED_PUTCHAR): Replace with ...
+ (HOSTED_INIT_SIM): ... this.
+
2006-10-20 Nathan Sidwell <nathan@codesourcery.com>
libgloss/
diff --git a/libgloss/m68k/Makefile.in b/libgloss/m68k/Makefile.in
index 0132f2b26..2bb8e52de 100644
--- a/libgloss/m68k/Makefile.in
+++ b/libgloss/m68k/Makefile.in
@@ -136,10 +136,10 @@ HOSTED_OBJS= hosted-gdb.o hosted-exit.o $(patsubst un%,%,$(UNHOSTED_OBJS))
#
# here's all the ColdFire boards
#
-CF_CRT0= cf-crt0.o
+CF_CRT0S= cf-hosted-crt0.o cf-unhosted-crt0.o
CF_BSP= libcf.a
-CF_OBJS= cf-crt1.o cf-hosted.o getpid.o kill.o cf-sbrk.o cf-exit.o \
- $(patsubst %,cf-%.o,${CF_ISRS})
+CF_OBJS= cf-isv.o cf-crt1.o cf-hosted.o getpid.o kill.o cf-sbrk.o \
+ cf-exit.o $(patsubst %,cf-%.o,${CF_ISRS})
CF_ISRS= other_interrupt reset access_error address_error \
illegal_instruction divide_by_zero privilege_violation \
trace unimplemented_line_a_opcode unimplemented_line_f_opcode \
@@ -156,7 +156,7 @@ CF_RAM_SCRIPTS := $(patsubst %,%-ram.ld,$(CF_BOARDS))
CF_ROM_SCRIPTS := $(patsubst %,%-rom.ld,$(CF_BOARDS))
CF_HOSTED_SCRIPTS := $(patsubst %.ld,%-hosted.ld,$(CF_RAM_SCRIPTS) $(CF_ROM_SCRIPTS))
CF_SCRIPTS = $(CF_RAM_SCRIPTS) $(CF_ROM_SCRIPTS) $(CF_HOSTED_SCRIPTS)
-CF_SOURCES = cf-crt0.S cf-crt1.c asm.h
+CF_SOURCES = cf-isv.S cf-crt0.S cf-crt1.c asm.h
# Host specific makefile fragment comes in here.
@host_makefile_frag@
@@ -167,7 +167,7 @@ CF_SOURCES = cf-crt0.S cf-crt1.c asm.h
#
all: ${SIM_CRT0} ${SIM_BSP} ${CRT0} ${BCC_BSP} ${IDP_BSP} ${IDPGDB_BSP} \
${MVME135_BSP} ${MVME162_BSP} ${HOSTED_BSP} ${UNHOSTED_BSP} \
- ${CF_CRT0} ${CF_BSP} ${CF_SCRIPTS}
+ ${CF_CRT0S} ${CF_BSP} ${CF_SCRIPTS}
#
# here's where we build the board support packages for each target
@@ -202,6 +202,8 @@ $(HOSTED_OBJS): hosted%.o: io%.c io.h
$(HOSTED_BSP): $(HOSTED_OBJS)
${AR} ${ARFLAGS} $@ $^
${RANLIB} $@
+cf-hosted-crt0.o: cf-crt0.S
+ $(CC) $(CFLAGS_FOR_TARGET) -DHOSTED=1 $(INCLUDES) -c $< -o $@
# build unhosted library
$(UNHOSTED_OBJS): unhosted%.o: io%.c io.h
@@ -209,6 +211,8 @@ $(UNHOSTED_OBJS): unhosted%.o: io%.c io.h
$(UNHOSTED_BSP): $(UNHOSTED_OBJS)
${AR} ${ARFLAGS} $@ $^
${RANLIB} $@
+cf-unhosted-crt0.o: cf-crt0.S
+ $(CC) $(CFLAGS_FOR_TARGET) -DHOSTED=0 $(INCLUDES) -c $< -o $@
# build coldfire library
$(patsubst %,cf-%.o,${CF_ISRS}) : cf-isrs.c
@@ -364,7 +368,9 @@ install:
$(INSTALL_DATA) $(HOSTED_BSP) $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$(HOSTED_BSP)
$(INSTALL_DATA) $(UNHOSTED_BSP) $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$(UNHOSTED_BSP)
# install CF stuff
- $(INSTALL_DATA) $(CF_CRT0) $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$(CF_CRT0)
+ for crt in $(CF_CRT0S) ; \
+ do $(INSTALL_DATA) $$crt $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$$crt ; \
+ done
$(INSTALL_DATA) $(CF_BSP) $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$(CF_BSP)
for script in $(CF_SCRIPTS) ; \
do $(INSTALL_DATA) $$script $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$$script ; \
diff --git a/libgloss/m68k/cf-crt0.S b/libgloss/m68k/cf-crt0.S
index a61919a4f..9a73ce19c 100644
--- a/libgloss/m68k/cf-crt0.S
+++ b/libgloss/m68k/cf-crt0.S
@@ -1,4 +1,4 @@
-/* The interrupt table.
+/* Initial boot
*
* Copyright (c) 2006 CodeSourcery Inc
*
@@ -16,70 +16,32 @@
#include "asm.h"
.text
- .globl __interrupt_vector
-__interrupt_vector:
- .long __stack /* 0 */
- .long __reset /* 1 */
- .long __access_error /* 2 */
- .long __address_error /* 3 */
- .long __illegal_instruction /* 4 */
- .long __divide_by_zero /* 5 */
- .long __other_interrupt /* 6 */
- .long __other_interrupt /* 7 */
- .long __privilege_violation /* 8 */
- .long __trace /* 9 */
- .long __unimplemented_line_a_opcode /* 10 */
- .long __unimplemented_line_f_opcode /* 11 */
- .long __non_pc_breakpoint_debug_interrupt /* 12 */
- .long __pc_breakpoint_debug_interrupt /* 13 */
- .long __format_error /* 14 */
- .rept 24 - 15
- .long __other_interrupt /* [15,24) */
- .endr
- .long __spurious_interrupt /* 24 */
- .rept 32 - 25
- .long __other_interrupt /* [25,32) */
- .endr
- .long __trap0 /* 32 */
- .long __trap1 /* 33 */
- .long __trap2 /* 34 */
- .long __trap3 /* 35 */
- .long __trap4 /* 36 */
- .long __trap5 /* 37 */
- .long __trap6 /* 38 */
- .long __trap7 /* 39 */
- .long __trap8 /* 40 */
- .long __trap9 /* 41 */
- .long __trap10 /* 42 */
- .long __trap11 /* 43 */
- .long __trap12 /* 44 */
- .long __trap13 /* 45 */
- .long __trap14 /* 46 */
- .long __trap15 /* 47 */
- .long __fp_branch_unordered /* 48 */
- .long __fp_inexact_result /* 49 */
- .long __fp_divide_by_zero /* 50 */
- .long __fp_underflow /* 51 */
- .long __fp_operand_error /* 52 */
- .long __fp_overflow /* 53 */
- .long __fp_input_not_a_number /* 54 */
- .long __fp_input_denormalized_number /* 55 */
- .rept 61 - 56
- .long __other_interrupt /* [56,61) */
- .endr
- .long __unsupported_instruction /* 61 */
- .rept 64 - 62
- .long __other_interrupt /* [62,64) */
- .endr
- .rept 256-64
- .long __other_interrupt /* [64,256) */
- .endr
-
.extern __stack
+ .extern __heap_end
+ .weak __heap_end
.extern __start1
.globl __start
__start:
/* Initialize stack */
- movel IMM(__stack), sp
- movel IMM(0), fp
+ move.l IMM(__stack), sp
+ move.l IMM(0), fp
+ move.l IMM(__heap_end), d1
+#if HOSTED
+ /* INIT_SIM syscall. Allows changing sp & d1. */
+ move.l IMM(1),d0
+ .align 4
+
+ /* The halt sequence must be 'nop; halt' and aligned to a 4 byte
+ boundary. */
+ nop
+ halt
+
+ /* This sentinel instruction value must be immediately after
+ the halt instruction. The debugger will adjust the pc, so
+ that it is never executed. This instruction is
+ 'movec %sp,0'. */
+ .long 0x4e7bf000
+#endif
+ move.l d1,sp@-
+ move.l fp,sp@- /* Dummy return address */
jmp __start1
diff --git a/libgloss/m68k/cf-crt1.c b/libgloss/m68k/cf-crt1.c
index 25605fe91..a26acfd91 100644
--- a/libgloss/m68k/cf-crt1.c
+++ b/libgloss/m68k/cf-crt1.c
@@ -22,7 +22,7 @@ extern const char __data_load[] __attribute__ ((aligned (4)));
extern char __data_start[] __attribute__ ((aligned (4)));
extern char __bss_start[] __attribute__ ((aligned (4)));
extern char __end[] __attribute__ ((aligned (4)));
-
+void *__heap_limit;
extern void software_init_hook (void) __attribute__ ((weak));
extern void hardware_init_hook (void) __attribute__ ((weak));
extern void __INIT_SECTION__ (void);
@@ -30,9 +30,8 @@ extern void __FINI_SECTION__ (void);
extern int main (int, char **, char **);
-/* This is called from a tiny assembly stub that just initializes the
- stack pointer. */
-void __start1 (void)
+/* This is called from a tiny assembly stub. */
+void __start1 (void *heap_limit)
{
unsigned ix;
@@ -43,7 +42,9 @@ void __start1 (void)
if (__data_load != __data_start)
memcpy (__data_start, __data_load, __bss_start - __data_start);
memset (__bss_start, 0, __end - __bss_start);
-
+
+ __heap_limit = heap_limit;
+
if (software_init_hook)
software_init_hook ();
diff --git a/libgloss/m68k/cf-isv.S b/libgloss/m68k/cf-isv.S
new file mode 100644
index 000000000..392f8da3e
--- /dev/null
+++ b/libgloss/m68k/cf-isv.S
@@ -0,0 +1,75 @@
+/* The interrupt table.
+ *
+ * Copyright (c) 2006 CodeSourcery Inc
+ *
+ * The authors hereby grant permission to use, copy, modify, distribute,
+ * and license this software and its documentation for any purpose, provided
+ * that existing copyright notices are retained in all copies and that this
+ * notice is included verbatim in any distributions. No written agreement,
+ * license, or royalty fee is required for any of the authorized uses.
+ * Modifications to this software may be copyrighted by their authors
+ * and need not follow the licensing terms described here, provided that
+ * the new terms are clearly indicated on the first page of each file where
+ * they apply.
+ */
+
+ .text
+
+ .globl __interrupt_vector
+__interrupt_vector:
+ .long __stack /* 0 */
+ .long __reset /* 1 */
+ .long __access_error /* 2 */
+ .long __address_error /* 3 */
+ .long __illegal_instruction /* 4 */
+ .long __divide_by_zero /* 5 */
+ .long __other_interrupt /* 6 */
+ .long __other_interrupt /* 7 */
+ .long __privilege_violation /* 8 */
+ .long __trace /* 9 */
+ .long __unimplemented_line_a_opcode /* 10 */
+ .long __unimplemented_line_f_opcode /* 11 */
+ .long __non_pc_breakpoint_debug_interrupt /* 12 */
+ .long __pc_breakpoint_debug_interrupt /* 13 */
+ .long __format_error /* 14 */
+ .rept 24 - 15
+ .long __other_interrupt /* [15,24) */
+ .endr
+ .long __spurious_interrupt /* 24 */
+ .rept 32 - 25
+ .long __other_interrupt /* [25,32) */
+ .endr
+ .long __trap0 /* 32 */
+ .long __trap1 /* 33 */
+ .long __trap2 /* 34 */
+ .long __trap3 /* 35 */
+ .long __trap4 /* 36 */
+ .long __trap5 /* 37 */
+ .long __trap6 /* 38 */
+ .long __trap7 /* 39 */
+ .long __trap8 /* 40 */
+ .long __trap9 /* 41 */
+ .long __trap10 /* 42 */
+ .long __trap11 /* 43 */
+ .long __trap12 /* 44 */
+ .long __trap13 /* 45 */
+ .long __trap14 /* 46 */
+ .long __trap15 /* 47 */
+ .long __fp_branch_unordered /* 48 */
+ .long __fp_inexact_result /* 49 */
+ .long __fp_divide_by_zero /* 50 */
+ .long __fp_underflow /* 51 */
+ .long __fp_operand_error /* 52 */
+ .long __fp_overflow /* 53 */
+ .long __fp_input_not_a_number /* 54 */
+ .long __fp_input_denormalized_number /* 55 */
+ .rept 61 - 56
+ .long __other_interrupt /* [56,61) */
+ .endr
+ .long __unsupported_instruction /* 61 */
+ .rept 64 - 62
+ .long __other_interrupt /* [62,64) */
+ .endr
+ .rept 256-64
+ .long __other_interrupt /* [64,256) */
+ .endr
diff --git a/libgloss/m68k/cf-sbrk.c b/libgloss/m68k/cf-sbrk.c
index e2899f256..1bcf3f047 100644
--- a/libgloss/m68k/cf-sbrk.c
+++ b/libgloss/m68k/cf-sbrk.c
@@ -22,14 +22,15 @@
*/
extern char __end[] __attribute__ ((aligned (4)));
-/* Optional explicit end of heap. */
-extern char __heap_end[] __attribute__ ((aligned (4), weak));
+
+/* End of heap, if non NULL. */
+extern void *__heap_limit;
void *
sbrk (int nbytes)
{
static char *heap = __end;
- char *end = __heap_end;
+ char *end = __heap_limit;
char *base = heap;
char *new_heap = heap + nbytes;
diff --git a/libgloss/m68k/cf.sc b/libgloss/m68k/cf.sc
index 98eb96fe6..097dc1fe0 100644
--- a/libgloss/m68k/cf.sc
+++ b/libgloss/m68k/cf.sc
@@ -8,7 +8,7 @@
test -z "${ROM:+1}" && NOROM=1
cat <<EOF
-STARTUP(cf-crt0.o)
+STARTUP(cf-${IO}-crt0.o)
OUTPUT_ARCH(m68k)
ENTRY(__start)
SEARCH_DIR(.)
@@ -29,7 +29,8 @@ SECTIONS
.text :
{
CREATE_OBJECT_SYMBOLS
- cf-crt0.o(.text)
+ KEEP (*cf-isv.o(.text))
+ cf-${IO}-crt0.o(.text)
*(.text .text.*)
*(.gnu.linkonce.t.*)
diff --git a/libgloss/m68k/io.h b/libgloss/m68k/io.h
index 1ea38d7de..b6b228739 100644
--- a/libgloss/m68k/io.h
+++ b/libgloss/m68k/io.h
@@ -21,7 +21,7 @@
#include <sys/stat.h>
#define HOSTED_EXIT 0
-#define HOSTED_PUTCHAR 1 /* Obsolete */
+#define HOSTED_INIT_SIM 1
#define HOSTED_OPEN 2
#define HOSTED_CLOSE 3
#define HOSTED_READ 4