2003-08-20 Chris Demetriou <cgd@broadcom.com>
* mips/crt0_cfe.S: New file. * mips/cfe_mem.c: New file. * mips/cfe_prestart.S: Remove. * mips/cfe.ld: Adjust to use crt0_cfe.o as the startup file, and and use _start as the entry point. Align BSS to 32-byte boundary. * mips/cfe.c: Reimplement to fit on top of a crt0_cfe.o file. * mips/cfe_api.h (__libcfe_stack_size, __libcfe_mem_limit) (__libcfe_meminit, __libcfe_stack_top): New prototypes. * mips/Makefile.in (CFEOBJS): Replace cfe_prestart.o with cfe_mem.o. (cfe.o, cfe_api.o, cfe_mem.o, crt0_cfe.o): New targets. * mips/configure.in: Build and install crt0_cfe.o when CFE support is built. * mips/configure: Regenerate.
This commit is contained in:
parent
2bf794af9a
commit
49703eb3f5
@ -1,3 +1,19 @@
|
|||||||
|
2003-08-20 Chris Demetriou <cgd@broadcom.com>
|
||||||
|
|
||||||
|
* mips/crt0_cfe.S: New file.
|
||||||
|
* mips/cfe_mem.c: New file.
|
||||||
|
* mips/cfe_prestart.S: Remove.
|
||||||
|
* mips/cfe.ld: Adjust to use crt0_cfe.o as the startup file, and
|
||||||
|
and use _start as the entry point. Align BSS to 32-byte boundary.
|
||||||
|
* mips/cfe.c: Reimplement to fit on top of a crt0_cfe.o file.
|
||||||
|
* mips/cfe_api.h (__libcfe_stack_size, __libcfe_mem_limit)
|
||||||
|
(__libcfe_meminit, __libcfe_stack_top): New prototypes.
|
||||||
|
* mips/Makefile.in (CFEOBJS): Replace cfe_prestart.o with cfe_mem.o.
|
||||||
|
(cfe.o, cfe_api.o, cfe_mem.o, crt0_cfe.o): New targets.
|
||||||
|
* mips/configure.in: Build and install crt0_cfe.o when CFE support
|
||||||
|
is built.
|
||||||
|
* mips/configure: Regenerate.
|
||||||
|
|
||||||
2003-08-12 Jeff Johnston <jjohnstn@redhat.com>
|
2003-08-12 Jeff Johnston <jjohnstn@redhat.com>
|
||||||
|
|
||||||
* i386/cygmon-salib.c (unlink): New stub.
|
* i386/cygmon-salib.c (unlink): New stub.
|
||||||
|
@ -73,8 +73,7 @@ PMONOBJS = pmon.o @part_specific_obj@ ${GENOBJS}
|
|||||||
LSIOBJS = lsipmon.o @part_specific_obj@ ${GENOBJS}
|
LSIOBJS = lsipmon.o @part_specific_obj@ ${GENOBJS}
|
||||||
DVEOBJS = dvemon.o @part_specific_obj@ ${GENOBJS} ${GENOBJS2}
|
DVEOBJS = dvemon.o @part_specific_obj@ ${GENOBJS} ${GENOBJS2}
|
||||||
JMR3904OBJS = jmr3904-io.o @part_specific_obj@ ${GENOBJS} ${GENOBJS2}
|
JMR3904OBJS = jmr3904-io.o @part_specific_obj@ ${GENOBJS} ${GENOBJS2}
|
||||||
CFEOBJS = cfe.o cfe_api.o cfe_prestart.o \
|
CFEOBJS = cfe.o cfe_api.o cfe_mem.o @part_specific_obj@ ${GENOBJS} ${GENOBJS2}
|
||||||
@part_specific_obj@ ${GENOBJS} ${GENOBJS2}
|
|
||||||
CYGMONOBJS = open.o close.o cygmon.o @part_specific_obj@ ${GENOBJS}
|
CYGMONOBJS = open.o close.o cygmon.o @part_specific_obj@ ${GENOBJS}
|
||||||
|
|
||||||
# Nullmon cannot support read and write, but the test cases pull them in via libs
|
# Nullmon cannot support read and write, but the test cases pull them in via libs
|
||||||
@ -136,7 +135,6 @@ libcygmon.a: $(CYGMONOBJS)
|
|||||||
${AR} ${ARFLAGS} $@ $(CYGMONOBJS)
|
${AR} ${ARFLAGS} $@ $(CYGMONOBJS)
|
||||||
${RANLIB} $@
|
${RANLIB} $@
|
||||||
|
|
||||||
|
|
||||||
libcfe.a: $(CFEOBJS)
|
libcfe.a: $(CFEOBJS)
|
||||||
${AR} ${ARFLAGS} $@ $(CFEOBJS)
|
${AR} ${ARFLAGS} $@ $(CFEOBJS)
|
||||||
${RANLIB} $@
|
${RANLIB} $@
|
||||||
@ -219,6 +217,7 @@ test.o: ${srcdir}/test.c
|
|||||||
crt0.o: ${srcdir}/crt0.S
|
crt0.o: ${srcdir}/crt0.S
|
||||||
pcrt0.o: ${srcdir}/crt0.S
|
pcrt0.o: ${srcdir}/crt0.S
|
||||||
$(CC) -c $(CFLAGS_FOR_TARGET) $(CFLAGS) -DGCRT0 ${srcdir}/crt0.S -o ${PCRT0}
|
$(CC) -c $(CFLAGS_FOR_TARGET) $(CFLAGS) -DGCRT0 ${srcdir}/crt0.S -o ${PCRT0}
|
||||||
|
crt0_cfe.o: ${srcdir}/crt0_cfe.S
|
||||||
crt0_cygmon.o: ${srcdir}/crt0_cygmon.S
|
crt0_cygmon.o: ${srcdir}/crt0_cygmon.S
|
||||||
idtmon.o: ${srcdir}/idtmon.S
|
idtmon.o: ${srcdir}/idtmon.S
|
||||||
pmon.o: ${srcdir}/pmon.S
|
pmon.o: ${srcdir}/pmon.S
|
||||||
@ -230,6 +229,12 @@ vr5xxx.o: ${srcdir}/vr5xxx.S
|
|||||||
lsipmon.o: $(srcdir)/lsipmon.S $(srcdir)/pmon.S
|
lsipmon.o: $(srcdir)/lsipmon.S $(srcdir)/pmon.S
|
||||||
jmr3904-io.o: ${srcdir}/jmr3904-io.c
|
jmr3904-io.o: ${srcdir}/jmr3904-io.c
|
||||||
$(CC) -c $(CFLAGS_FOR_TARGET) $(CFLAGS) ${srcdir}/jmr3904-io.c -o $@
|
$(CC) -c $(CFLAGS_FOR_TARGET) $(CFLAGS) ${srcdir}/jmr3904-io.c -o $@
|
||||||
|
cfe.o: ${srcdir}/cfe.c ${srcdir}/cfe_api.h
|
||||||
|
$(CC) -c $(CFLAGS_FOR_TARGET) $(CFLAGS) ${srcdir}/cfe.c -o $@
|
||||||
|
cfe_api.o: ${srcdir}/cfe_api.c ${srcdir}/cfe_api.h ${srcdir}/cfe_api_int.h
|
||||||
|
$(CC) -c $(CFLAGS_FOR_TARGET) $(CFLAGS) ${srcdir}/cfe_api.c -o $@
|
||||||
|
cfe_mem.o: ${srcdir}/cfe_mem.c ${srcdir}/cfe_api.h
|
||||||
|
$(CC) -c $(CFLAGS_FOR_TARGET) $(CFLAGS) ${srcdir}/cfe_mem.c -o $@
|
||||||
|
|
||||||
# cma101 can not be compiled mips16, if a mips16 version is needed then
|
# cma101 can not be compiled mips16, if a mips16 version is needed then
|
||||||
# it will have to be built, then this rule can be scrapped, allowing
|
# it will have to be built, then this rule can be scrapped, allowing
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* cfe.c -- I/O code for the MIPS boards running CFE. */
|
/* cfe.c -- I/O code for the MIPS boards running CFE. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2001, 2002
|
* Copyright 2001, 2002, 2003
|
||||||
* Broadcom Corporation. All rights reserved.
|
* Broadcom Corporation. All rights reserved.
|
||||||
*
|
*
|
||||||
* This software is furnished under license and may be used and copied only
|
* This software is furnished under license and may be used and copied only
|
||||||
@ -32,37 +32,40 @@
|
|||||||
|
|
||||||
#include "cfe_api.h"
|
#include "cfe_api.h"
|
||||||
|
|
||||||
|
void *__libcfe_init (long handle, long a1, long cfe_entrypoint, long a3);
|
||||||
|
void __libcfe_exit (long status);
|
||||||
|
|
||||||
char inbyte (void);
|
char inbyte (void);
|
||||||
int outbyte (char c);
|
int outbyte (char c);
|
||||||
|
|
||||||
/* Make sure cfe_prestart is used. It doesn't look like setting the
|
|
||||||
entry symbol in the linker script to a symbol from that fiel will do
|
|
||||||
this! */
|
|
||||||
extern int _prestart;
|
|
||||||
static void *force_prestart = &_prestart;
|
|
||||||
|
|
||||||
/* The following variables are initialized to non-zero so that they'll be
|
|
||||||
in data, rather than BSS. Used to be that you could init variables to
|
|
||||||
any value to put them into initialized data sections rather than BSS,
|
|
||||||
but that decades-old idiom went out the window with gcc 3.2. Now,
|
|
||||||
either you compile specially (with -fno-zero-initialized-in-bss), or
|
|
||||||
you init to non-zero. In this case, initting to non-zero is OK (and
|
|
||||||
even beneficial; alignment fault via jump to odd if not properly
|
|
||||||
set up by _prestart()), so we do the latter.
|
|
||||||
|
|
||||||
These variables are 'int's so they can be reliably stored w/ "sw".
|
|
||||||
(longs fall victim to -mlong64.) They are signed so that they remain
|
|
||||||
valid pointers when extended to cfe_xuint_t in the call to cfe_init().
|
|
||||||
This assumes that they are compatibility-space pointers. */
|
|
||||||
int __cfe_handle = 0xdeadbeef;
|
|
||||||
int __cfe_entrypt = 0xdeadbeef;
|
|
||||||
|
|
||||||
/* Echo input characters? */
|
/* Echo input characters? */
|
||||||
int __cfe_echo_input = 0;
|
int __libcfe_echo_input = 0;
|
||||||
|
|
||||||
/* CFE handle used to access console device. */
|
/* CFE handle used to access console device. */
|
||||||
static int cfe_conshandle;
|
static int cfe_conshandle;
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialize firmware callbacks. Called from crt0_cfe. Returns desired
|
||||||
|
stack pointer. */
|
||||||
|
void *
|
||||||
|
__libcfe_init (long handle, long a1, long entrypoint, long a3)
|
||||||
|
{
|
||||||
|
cfe_init (handle, entrypoint);
|
||||||
|
cfe_conshandle = cfe_getstdhandle (CFE_STDHANDLE_CONSOLE);
|
||||||
|
|
||||||
|
__libcfe_meminit ();
|
||||||
|
return __libcfe_stack_top ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Exit back to monitor, with the given status code. */
|
||||||
|
void
|
||||||
|
__libcfe_exit (long status)
|
||||||
|
{
|
||||||
|
outbyte ('\r');
|
||||||
|
outbyte ('\n');
|
||||||
|
cfe_exit (CFE_FLG_WARMSTART, status);
|
||||||
|
}
|
||||||
|
|
||||||
char
|
char
|
||||||
inbyte (void)
|
inbyte (void)
|
||||||
{
|
{
|
||||||
@ -73,7 +76,7 @@ inbyte (void)
|
|||||||
;
|
;
|
||||||
if (c == '\r')
|
if (c == '\r')
|
||||||
c = '\n';
|
c = '\n';
|
||||||
if (__cfe_echo_input)
|
if (__libcfe_echo_input)
|
||||||
outbyte (c);
|
outbyte (c);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
@ -93,41 +96,6 @@ outbyte (char c)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize hardware. Called from crt0. */
|
|
||||||
void
|
|
||||||
hardware_init_hook(void)
|
|
||||||
{
|
|
||||||
cfe_init (__cfe_handle, __cfe_entrypt);
|
|
||||||
cfe_conshandle = cfe_getstdhandle(CFE_STDHANDLE_CONSOLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Exit back to monitor, with the given status code. */
|
|
||||||
void
|
|
||||||
hardware_exit_hook (int status)
|
|
||||||
{
|
|
||||||
outbyte ('\r');
|
|
||||||
outbyte ('\n');
|
|
||||||
cfe_exit (CFE_FLG_WARMSTART, status);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Structure filled in by get_mem_info. Only the size field is
|
|
||||||
actually used (by sbrk), so the others aren't even filled in. */
|
|
||||||
struct s_mem
|
|
||||||
{
|
|
||||||
unsigned int size;
|
|
||||||
unsigned int icsize;
|
|
||||||
unsigned int dcsize;
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
get_mem_info (mem)
|
|
||||||
struct s_mem *mem;
|
|
||||||
{
|
|
||||||
/* XXX FIXME: Fake this for now. Should invoke cfe_enummem, but we
|
|
||||||
don't have enough stack to do that (yet). */
|
|
||||||
mem->size = 0x4000000; /* Assume 64 MB of RAM */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This is the MIPS cache flush function call. No defines are provided
|
/* This is the MIPS cache flush function call. No defines are provided
|
||||||
by libgloss for 'cache', and CFE doesn't let you flush ranges, so
|
by libgloss for 'cache', and CFE doesn't let you flush ranges, so
|
||||||
we just flush all I & D for every call. */
|
we just flush all I & D for every call. */
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/* The following TEXT start address leaves space for the monitor
|
/* The following TEXT start address leaves space for the monitor
|
||||||
workspace. */
|
workspace. */
|
||||||
|
|
||||||
ENTRY(_prestart)
|
ENTRY(_start)
|
||||||
STARTUP(crt0.o)
|
STARTUP(crt0_cfe.o)
|
||||||
OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-littlemips")
|
OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-littlemips")
|
||||||
GROUP(-lc -lcfe -lgcc)
|
GROUP(-lc -lcfe -lgcc)
|
||||||
SEARCH_DIR(.)
|
SEARCH_DIR(.)
|
||||||
@ -127,6 +127,7 @@ SECTIONS
|
|||||||
*(COMMON)
|
*(COMMON)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
. = ALIGN(32);
|
||||||
PROVIDE (end = .);
|
PROVIDE (end = .);
|
||||||
_end = .;
|
_end = .;
|
||||||
|
|
||||||
|
@ -71,6 +71,40 @@ typedef unsigned _POINTER_INT uintptr_t;
|
|||||||
|
|
||||||
#define CFE_API_ALL
|
#define CFE_API_ALL
|
||||||
#define CFE_API_IMPL_NAMESPACE
|
#define CFE_API_IMPL_NAMESPACE
|
||||||
|
|
||||||
|
/* Return the stack size to be used for the program. Normally 32KB. The
|
||||||
|
normal memory allocator uses the bottom of the stack as its heap limit,
|
||||||
|
so if your application uses a lot of stack space define this function
|
||||||
|
appropriately to keep the heap from growing into the stack. */
|
||||||
|
unsigned long __libcfe_stack_size(void) __attribute__((__weak__));
|
||||||
|
|
||||||
|
/* Return the (max address + 1) to be used by this program. (This address
|
||||||
|
minus '_end' is used as the heap size, so the address should be in the
|
||||||
|
same address space segments as _end. The normal memory allocator
|
||||||
|
queries CFE to determine the available memory. */
|
||||||
|
void *__libcfe_mem_limit(void) __attribute__((__weak__));
|
||||||
|
|
||||||
|
/* If the configuration ability provided by __libcfe_mem_limit() and
|
||||||
|
__libcfe_stack_size() do not provide enough flexibility for your
|
||||||
|
application's memory allocation needs, you can replace the normal
|
||||||
|
low-level allocator by providing the functions listed below and
|
||||||
|
also the function:
|
||||||
|
|
||||||
|
void *sbrk(ptrdiff_t incr);
|
||||||
|
|
||||||
|
If you provide any of these functions, you should provide all three,
|
||||||
|
and be sure to link them into your application as a .o file (rather
|
||||||
|
than a .a).
|
||||||
|
|
||||||
|
__libcfe_meminit() is responsible for initializing the low-level
|
||||||
|
memory allocator.
|
||||||
|
|
||||||
|
__libcfe_stack_top() returns a pointer to the top (highest address;
|
||||||
|
the stack grows down from that address) of the stack to be used by
|
||||||
|
the program. */
|
||||||
|
void __libcfe_meminit (void);
|
||||||
|
void *__libcfe_stack_top (void);
|
||||||
|
|
||||||
/* End customization. */
|
/* End customization. */
|
||||||
|
|
||||||
|
|
||||||
|
130
libgloss/mips/cfe_mem.c
Normal file
130
libgloss/mips/cfe_mem.c
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
/* cfe_mem.c -- Replaceable memory management hooks for MIPS boards
|
||||||
|
running CFE. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2003
|
||||||
|
* Broadcom Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is furnished under license and may be used and copied only
|
||||||
|
* in accordance with the following terms and conditions. Subject to these
|
||||||
|
* conditions, you may download, copy, install, use, modify and distribute
|
||||||
|
* modified or unmodified copies of this software in source and/or binary
|
||||||
|
* form. No title or ownership is transferred hereby.
|
||||||
|
*
|
||||||
|
* 1) Any source code used, modified or distributed must reproduce and
|
||||||
|
* retain this copyright notice and list of conditions as they appear in
|
||||||
|
* the source file.
|
||||||
|
*
|
||||||
|
* 2) No right is granted to use any trade name, trademark, or logo of
|
||||||
|
* Broadcom Corporation. The "Broadcom Corporation" name may not be
|
||||||
|
* used to endorse or promote products derived from this software
|
||||||
|
* without the prior written permission of Broadcom Corporation.
|
||||||
|
*
|
||||||
|
* 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||||
|
* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM BE LIABLE
|
||||||
|
* FOR ANY DAMAGES WHATSOEVER, AND IN PARTICULAR, BROADCOM SHALL NOT BE
|
||||||
|
* LIABLE FOR 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,
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cfe_api.h"
|
||||||
|
|
||||||
|
/* Structure filled in by get_mem_info. Only the size field is
|
||||||
|
actually used (by sbrk), so the others aren't even filled in.
|
||||||
|
Note that 'size' is the __size__ of the heap starting at _end! */
|
||||||
|
struct s_mem {
|
||||||
|
unsigned int size;
|
||||||
|
unsigned int icsize;
|
||||||
|
unsigned int dcsize;
|
||||||
|
};
|
||||||
|
|
||||||
|
void *get_mem_info (struct s_mem *);
|
||||||
|
|
||||||
|
extern char _end[];
|
||||||
|
|
||||||
|
/* Address immediately after available memory. */
|
||||||
|
static unsigned long memtop;
|
||||||
|
|
||||||
|
/* Program stack size. */
|
||||||
|
static unsigned long stack_size;
|
||||||
|
|
||||||
|
void
|
||||||
|
__libcfe_meminit (void)
|
||||||
|
{
|
||||||
|
/* If the user has provided a memory-limit function, use it to
|
||||||
|
determine the end of usable memory. */
|
||||||
|
if (&__libcfe_mem_limit != NULL)
|
||||||
|
memtop = __libcfe_mem_limit ();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint64_t start, length, type;
|
||||||
|
int i, rv;
|
||||||
|
long end_segbits, end_pa;
|
||||||
|
|
||||||
|
/* Note that this only works if _end and the program live in kseg0
|
||||||
|
or kseg1. Not a problem with the default linker script, but
|
||||||
|
if you're writing your own, keep it in mind. For more complex
|
||||||
|
memory allocation needs, you're encouraged to copy this file
|
||||||
|
and syscalls.c (for sbrk()), and reimplement as appropriate. */
|
||||||
|
end_segbits = (long)_end & ~ 0x1fffffffL;
|
||||||
|
end_pa = (long)_end & 0x1fffffffL;
|
||||||
|
|
||||||
|
for (i = 0; ; i++)
|
||||||
|
{
|
||||||
|
rv = cfe_enummem(i, 0, &start, &length, &type);
|
||||||
|
if (rv < 0)
|
||||||
|
{
|
||||||
|
/* Did not find an available entry containing _end.
|
||||||
|
Assume a minimal amount of memory (1MB). */
|
||||||
|
memtop = _end + (1 * 1024 * 1024);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If not available, try the next. */
|
||||||
|
if (type != CFE_MI_AVAILABLE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* If end_pa is between start and (start + length) then we have
|
||||||
|
a winner. */
|
||||||
|
if (end_pa >= start && end_pa < (start + length))
|
||||||
|
{
|
||||||
|
memtop = (start + length) | end_segbits;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the user has provided a memory-limit function, use it to
|
||||||
|
determine the end of usable memory. */
|
||||||
|
if (&__libcfe_stack_size != NULL)
|
||||||
|
stack_size = __libcfe_stack_size ();
|
||||||
|
else
|
||||||
|
stack_size = (32 * 1024); /* Default = 32KB. */
|
||||||
|
|
||||||
|
/* Chop the top of memory to a 32-byte aligned location, and
|
||||||
|
round the stack size up to a 32-byte multiple. */
|
||||||
|
memtop = memtop & ~(unsigned long)31;
|
||||||
|
stack_size = (stack_size + 31) & ~(unsigned long)31;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
__libcfe_stack_top (void)
|
||||||
|
{
|
||||||
|
/* Grow down from the top of available memory. Obviously, if
|
||||||
|
code writes above this limit, problems could result! */
|
||||||
|
return (void *) memtop;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For compatibility, get_mem_info returns the top of memory
|
||||||
|
(i.e., the stack address). Nothing actually uses that,
|
||||||
|
though. */
|
||||||
|
void *
|
||||||
|
get_mem_info (struct s_mem *meminfo)
|
||||||
|
{
|
||||||
|
meminfo->size = (char *)(memtop - stack_size) - _end;
|
||||||
|
return (void *) memtop;
|
||||||
|
}
|
@ -1,86 +0,0 @@
|
|||||||
/*
|
|
||||||
* cfe_prestart.S -- startup file for MIPS running CFE.
|
|
||||||
* Derived from crt0.S.
|
|
||||||
*
|
|
||||||
* Copyright (c) 1995, 1996, 1997 Cygnus Support
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __mips16
|
|
||||||
/* This file contains 32 bit assembly code. */
|
|
||||||
.set nomips16
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "regs.S"
|
|
||||||
|
|
||||||
/* This is for referencing addresses that are not in the .sdata or
|
|
||||||
.sbss section under embedded-pic, or before we've set up gp. */
|
|
||||||
#ifdef __mips_embedded_pic
|
|
||||||
# ifdef __mips64
|
|
||||||
# define LA(t,x) la t,x-PICBASE ; daddu t,s0,t
|
|
||||||
# else
|
|
||||||
# define LA(t,x) la t,x-PICBASE ; addu t,s0,t
|
|
||||||
# endif
|
|
||||||
#else /* __mips_embedded_pic */
|
|
||||||
# define LA(t,x) la t,x
|
|
||||||
#endif /* __mips_embedded_pic */
|
|
||||||
|
|
||||||
.globl __cfe_handle
|
|
||||||
.globl __cfe_entrypt
|
|
||||||
|
|
||||||
.text
|
|
||||||
.align 2
|
|
||||||
|
|
||||||
.globl _prestart
|
|
||||||
.ent _prestart
|
|
||||||
_prestart:
|
|
||||||
.set noreorder
|
|
||||||
#ifdef __mips_embedded_pic
|
|
||||||
PICBASE = .+8
|
|
||||||
bal PICBASE
|
|
||||||
nop
|
|
||||||
move s0,$31
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* These are actually pointers, but they're guaranteed to be
|
|
||||||
in compatibility space and it's just easier to store them
|
|
||||||
as words ("unsigned int") than worry about the actual
|
|
||||||
pointer size of the runtime we're building. */
|
|
||||||
LA (v0, __cfe_handle)
|
|
||||||
sw a0, 0(v0)
|
|
||||||
LA (v0, __cfe_entrypt)
|
|
||||||
sw a2, 0(v0)
|
|
||||||
|
|
||||||
LA (v0, _start)
|
|
||||||
jr v0
|
|
||||||
nop
|
|
||||||
.end _prestart
|
|
||||||
|
|
||||||
|
|
||||||
/* Avoid worst-case execution hazards. This is targetted at the SB-1
|
|
||||||
pipe, and is much worse than it needs to be (not even counting
|
|
||||||
the subroutine call and return). */
|
|
||||||
.globl hardware_hazard_hook
|
|
||||||
.ent hardware_hazard_hook
|
|
||||||
hardware_hazard_hook:
|
|
||||||
.set push
|
|
||||||
.set mips32
|
|
||||||
.set noreorder
|
|
||||||
ssnop
|
|
||||||
ssnop
|
|
||||||
ssnop
|
|
||||||
bnel $0, $0, .+4
|
|
||||||
ssnop
|
|
||||||
j ra
|
|
||||||
nop
|
|
||||||
.set pop
|
|
||||||
.end hardware_hazard_hook
|
|
36
libgloss/mips/configure
vendored
36
libgloss/mips/configure
vendored
@ -28,7 +28,6 @@ program_suffix=NONE
|
|||||||
program_transform_name=s,x,x,
|
program_transform_name=s,x,x,
|
||||||
silent=
|
silent=
|
||||||
site=
|
site=
|
||||||
sitefile=
|
|
||||||
srcdir=
|
srcdir=
|
||||||
target=NONE
|
target=NONE
|
||||||
verbose=
|
verbose=
|
||||||
@ -143,7 +142,6 @@ Configuration:
|
|||||||
--help print this message
|
--help print this message
|
||||||
--no-create do not create output files
|
--no-create do not create output files
|
||||||
--quiet, --silent do not print \`checking...' messages
|
--quiet, --silent do not print \`checking...' messages
|
||||||
--site-file=FILE use FILE as the site file
|
|
||||||
--version print the version of autoconf that created configure
|
--version print the version of autoconf that created configure
|
||||||
Directory and file names:
|
Directory and file names:
|
||||||
--prefix=PREFIX install architecture-independent files in PREFIX
|
--prefix=PREFIX install architecture-independent files in PREFIX
|
||||||
@ -314,11 +312,6 @@ EOF
|
|||||||
-site=* | --site=* | --sit=*)
|
-site=* | --site=* | --sit=*)
|
||||||
site="$ac_optarg" ;;
|
site="$ac_optarg" ;;
|
||||||
|
|
||||||
-site-file | --site-file | --site-fil | --site-fi | --site-f)
|
|
||||||
ac_prev=sitefile ;;
|
|
||||||
-site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*)
|
|
||||||
sitefile="$ac_optarg" ;;
|
|
||||||
|
|
||||||
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
|
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
|
||||||
ac_prev=srcdir ;;
|
ac_prev=srcdir ;;
|
||||||
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
|
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
|
||||||
@ -484,7 +477,6 @@ fi
|
|||||||
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
|
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
|
||||||
|
|
||||||
# Prefer explicitly selected file to automatically selected ones.
|
# Prefer explicitly selected file to automatically selected ones.
|
||||||
if test -z "$sitefile"; then
|
|
||||||
if test -z "$CONFIG_SITE"; then
|
if test -z "$CONFIG_SITE"; then
|
||||||
if test "x$prefix" != xNONE; then
|
if test "x$prefix" != xNONE; then
|
||||||
CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
|
CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
|
||||||
@ -492,9 +484,6 @@ if test -z "$sitefile"; then
|
|||||||
CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
|
CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
|
||||||
CONFIG_SITE="$sitefile"
|
|
||||||
fi
|
|
||||||
for ac_site_file in $CONFIG_SITE; do
|
for ac_site_file in $CONFIG_SITE; do
|
||||||
if test -r "$ac_site_file"; then
|
if test -r "$ac_site_file"; then
|
||||||
echo "loading site script $ac_site_file"
|
echo "loading site script $ac_site_file"
|
||||||
@ -594,7 +583,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
echo $ac_n "checking host system type""... $ac_c" 1>&6
|
echo $ac_n "checking host system type""... $ac_c" 1>&6
|
||||||
echo "configure:598: checking host system type" >&5
|
echo "configure:587: checking host system type" >&5
|
||||||
|
|
||||||
host_alias=$host
|
host_alias=$host
|
||||||
case "$host_alias" in
|
case "$host_alias" in
|
||||||
@ -615,7 +604,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
|
|||||||
echo "$ac_t""$host" 1>&6
|
echo "$ac_t""$host" 1>&6
|
||||||
|
|
||||||
echo $ac_n "checking target system type""... $ac_c" 1>&6
|
echo $ac_n "checking target system type""... $ac_c" 1>&6
|
||||||
echo "configure:619: checking target system type" >&5
|
echo "configure:608: checking target system type" >&5
|
||||||
|
|
||||||
target_alias=$target
|
target_alias=$target
|
||||||
case "$target_alias" in
|
case "$target_alias" in
|
||||||
@ -633,7 +622,7 @@ target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
|
|||||||
echo "$ac_t""$target" 1>&6
|
echo "$ac_t""$target" 1>&6
|
||||||
|
|
||||||
echo $ac_n "checking build system type""... $ac_c" 1>&6
|
echo $ac_n "checking build system type""... $ac_c" 1>&6
|
||||||
echo "configure:637: checking build system type" >&5
|
echo "configure:626: checking build system type" >&5
|
||||||
|
|
||||||
build_alias=$build
|
build_alias=$build
|
||||||
case "$build_alias" in
|
case "$build_alias" in
|
||||||
@ -687,7 +676,7 @@ test "$program_transform_name" = "" && program_transform_name="s,x,x,"
|
|||||||
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
|
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
|
||||||
# ./install, which can be erroneously created by make from ./install.sh.
|
# ./install, which can be erroneously created by make from ./install.sh.
|
||||||
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
|
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
|
||||||
echo "configure:691: checking for a BSD compatible install" >&5
|
echo "configure:680: checking for a BSD compatible install" >&5
|
||||||
if test -z "$INSTALL"; then
|
if test -z "$INSTALL"; then
|
||||||
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
@ -751,7 +740,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
|
|||||||
# Extract the first word of "gcc", so it can be a program name with args.
|
# Extract the first word of "gcc", so it can be a program name with args.
|
||||||
set dummy gcc; ac_word=$2
|
set dummy gcc; ac_word=$2
|
||||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||||
echo "configure:755: checking for $ac_word" >&5
|
echo "configure:744: checking for $ac_word" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
@ -781,7 +770,7 @@ if test -z "$CC"; then
|
|||||||
# Extract the first word of "cc", so it can be a program name with args.
|
# Extract the first word of "cc", so it can be a program name with args.
|
||||||
set dummy cc; ac_word=$2
|
set dummy cc; ac_word=$2
|
||||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||||
echo "configure:785: checking for $ac_word" >&5
|
echo "configure:774: checking for $ac_word" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
@ -830,7 +819,7 @@ fi
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
|
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
|
||||||
echo "configure:834: checking whether we are using GNU C" >&5
|
echo "configure:823: checking whether we are using GNU C" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
@ -839,7 +828,7 @@ else
|
|||||||
yes;
|
yes;
|
||||||
#endif
|
#endif
|
||||||
EOF
|
EOF
|
||||||
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:843: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
|
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:832: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
|
||||||
ac_cv_prog_gcc=yes
|
ac_cv_prog_gcc=yes
|
||||||
else
|
else
|
||||||
ac_cv_prog_gcc=no
|
ac_cv_prog_gcc=no
|
||||||
@ -854,7 +843,7 @@ if test $ac_cv_prog_gcc = yes; then
|
|||||||
ac_save_CFLAGS="$CFLAGS"
|
ac_save_CFLAGS="$CFLAGS"
|
||||||
CFLAGS=
|
CFLAGS=
|
||||||
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
|
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
|
||||||
echo "configure:858: checking whether ${CC-cc} accepts -g" >&5
|
echo "configure:847: checking whether ${CC-cc} accepts -g" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
@ -890,7 +879,7 @@ LD=${LD-ld}
|
|||||||
# Extract the first word of "ranlib", so it can be a program name with args.
|
# Extract the first word of "ranlib", so it can be a program name with args.
|
||||||
set dummy ranlib; ac_word=$2
|
set dummy ranlib; ac_word=$2
|
||||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||||
echo "configure:894: checking for $ac_word" >&5
|
echo "configure:883: checking for $ac_word" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
@ -930,7 +919,7 @@ case "${target}" in
|
|||||||
;;
|
;;
|
||||||
mipsisa32-*-* | mipsisa32el-*-* | \
|
mipsisa32-*-* | mipsisa32el-*-* | \
|
||||||
mipsisa32r2-*-* | mipsisa32r2el-*-*)
|
mipsisa32r2-*-* | mipsisa32r2el-*-*)
|
||||||
crt0="crt0_cygmon.o crt0.o"
|
crt0="crt0_cfe.o crt0_cygmon.o crt0.o"
|
||||||
pcrt0="pcrt0.o"
|
pcrt0="pcrt0.o"
|
||||||
part_specific_obj=
|
part_specific_obj=
|
||||||
part_specific_defines=
|
part_specific_defines=
|
||||||
@ -955,6 +944,7 @@ case "${target}" in
|
|||||||
bsp_list="libpmon.a libnullmon.a"
|
bsp_list="libpmon.a libnullmon.a"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
crt0="crt0_cfe.o crt0.o"
|
||||||
part_specific_obj="vr4300.o cma101.o"
|
part_specific_obj="vr4300.o cma101.o"
|
||||||
part_specific_defines=
|
part_specific_defines=
|
||||||
script_list="idt pmon ddb ddb-kseg0 lsi cfe idtecoff nullmon"
|
script_list="idt pmon ddb ddb-kseg0 lsi cfe idtecoff nullmon"
|
||||||
@ -1166,7 +1156,7 @@ cat >> $CONFIG_STATUS <<\EOF
|
|||||||
|
|
||||||
# Split the substitutions into bite-sized pieces for seds with
|
# Split the substitutions into bite-sized pieces for seds with
|
||||||
# small command number limits, like on Digital OSF/1 and HP-UX.
|
# small command number limits, like on Digital OSF/1 and HP-UX.
|
||||||
ac_max_sed_cmds=60 # Maximum number of lines to put in a sed script.
|
ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
|
||||||
ac_file=1 # Number of current file.
|
ac_file=1 # Number of current file.
|
||||||
ac_beg=1 # First line for current file.
|
ac_beg=1 # First line for current file.
|
||||||
ac_end=$ac_max_sed_cmds # Line after last line for current file.
|
ac_end=$ac_max_sed_cmds # Line after last line for current file.
|
||||||
|
@ -94,7 +94,7 @@ case "${target}" in
|
|||||||
;;
|
;;
|
||||||
mipsisa32-*-* | mipsisa32el-*-* | \
|
mipsisa32-*-* | mipsisa32el-*-* | \
|
||||||
mipsisa32r2-*-* | mipsisa32r2el-*-*)
|
mipsisa32r2-*-* | mipsisa32r2el-*-*)
|
||||||
crt0="crt0_cygmon.o crt0.o"
|
crt0="crt0_cfe.o crt0_cygmon.o crt0.o"
|
||||||
pcrt0="pcrt0.o"
|
pcrt0="pcrt0.o"
|
||||||
part_specific_obj=
|
part_specific_obj=
|
||||||
part_specific_defines=
|
part_specific_defines=
|
||||||
@ -119,6 +119,7 @@ case "${target}" in
|
|||||||
bsp_list="libpmon.a libnullmon.a"
|
bsp_list="libpmon.a libnullmon.a"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
crt0="crt0_cfe.o crt0.o"
|
||||||
part_specific_obj="vr4300.o cma101.o"
|
part_specific_obj="vr4300.o cma101.o"
|
||||||
part_specific_defines=
|
part_specific_defines=
|
||||||
script_list="idt pmon ddb ddb-kseg0 lsi cfe idtecoff nullmon"
|
script_list="idt pmon ddb ddb-kseg0 lsi cfe idtecoff nullmon"
|
||||||
|
263
libgloss/mips/crt0_cfe.S
Normal file
263
libgloss/mips/crt0_cfe.S
Normal file
@ -0,0 +1,263 @@
|
|||||||
|
/*
|
||||||
|
* crt0_cfe.S -- Runtime startup for MIPS targets running CFE.
|
||||||
|
*
|
||||||
|
* Copyright 2003
|
||||||
|
* Broadcom Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is furnished under license and may be used and copied only
|
||||||
|
* in accordance with the following terms and conditions. Subject to these
|
||||||
|
* conditions, you may download, copy, install, use, modify and distribute
|
||||||
|
* modified or unmodified copies of this software in source and/or binary
|
||||||
|
* form. No title or ownership is transferred hereby.
|
||||||
|
*
|
||||||
|
* 1) Any source code used, modified or distributed must reproduce and
|
||||||
|
* retain this copyright notice and list of conditions as they appear in
|
||||||
|
* the source file.
|
||||||
|
*
|
||||||
|
* 2) No right is granted to use any trade name, trademark, or logo of
|
||||||
|
* Broadcom Corporation. The "Broadcom Corporation" name may not be
|
||||||
|
* used to endorse or promote products derived from this software
|
||||||
|
* without the prior written permission of Broadcom Corporation.
|
||||||
|
*
|
||||||
|
* 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR IMPLIED
|
||||||
|
* WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||||
|
* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM BE LIABLE
|
||||||
|
* FOR ANY DAMAGES WHATSOEVER, AND IN PARTICULAR, BROADCOM SHALL NOT BE
|
||||||
|
* LIABLE FOR 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), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Derived from crt0_cygmon.S:
|
||||||
|
*
|
||||||
|
* Copyright (c) 1995, 1996, 1997, 2000 Red Hat, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file does minimal runtime startup for code running under
|
||||||
|
* CFE firmware.
|
||||||
|
*
|
||||||
|
* It does minimal hardware initialization. In particular
|
||||||
|
* it sets Status:FR to match the requested floating point
|
||||||
|
* mode.
|
||||||
|
*
|
||||||
|
* It is meant to be linked with the other files provided by libcfe.a,
|
||||||
|
* and calls routines in those files.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __mips16
|
||||||
|
/* This file contains 32 bit assembly code. */
|
||||||
|
.set nomips16
|
||||||
|
#endif
|
||||||
|
#ifdef __mips_embedded_pic
|
||||||
|
# error -membedded-pic is not supported.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "regs.S"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up some room for a stack. We just grab a chunk of memory.
|
||||||
|
*/
|
||||||
|
#define STARTUP_STACK_SIZE (1 * 1024)
|
||||||
|
|
||||||
|
.comm _lstack, STARTUP_STACK_SIZE
|
||||||
|
|
||||||
|
.text
|
||||||
|
.align 4
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Without the following nop, GDB thinks _start is a data variable.
|
||||||
|
* This is probably a bug in GDB in handling a symbol that is at the
|
||||||
|
* start of the .text section.
|
||||||
|
*/
|
||||||
|
nop
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* On entry, the following values have been passed in registers
|
||||||
|
* by the firmware:
|
||||||
|
*
|
||||||
|
* a0: firmware handle
|
||||||
|
* a1: zero (unused)
|
||||||
|
* a2: firmware callback entrypoint
|
||||||
|
* a3: CFE entrypoint seal (unused)
|
||||||
|
*
|
||||||
|
* They must be preserved until the CFE entrypoint and handle
|
||||||
|
* are passed to __libcfe_init().
|
||||||
|
*/
|
||||||
|
|
||||||
|
.globl _start
|
||||||
|
.ent _start
|
||||||
|
_start:
|
||||||
|
.set noreorder
|
||||||
|
/* Set the global data pointer, defined in the linker script. */
|
||||||
|
la gp, _gp
|
||||||
|
|
||||||
|
#ifndef __mips_soft_float
|
||||||
|
/* If compiled for hard float, set the FPU mode based on the
|
||||||
|
compilation flags. Note that this assumes that enough code
|
||||||
|
will run after the mtc0 to clear any hazards. */
|
||||||
|
mfc0 t0, C0_SR
|
||||||
|
or t0, t0, (SR_CU1 | SR_FR)
|
||||||
|
#if (__mips_fpr == 32)
|
||||||
|
xor t0, t0, SR_FR /* If 32-bit FP mode, clear FR. */
|
||||||
|
#endif
|
||||||
|
mtc0 t0, C0_SR
|
||||||
|
#endif
|
||||||
|
.end _start
|
||||||
|
|
||||||
|
/*
|
||||||
|
* zero out the bss section.
|
||||||
|
*/
|
||||||
|
.globl _zerobss
|
||||||
|
.ent _zerobss
|
||||||
|
_zerobss:
|
||||||
|
/* These variables are defined in the linker script. */
|
||||||
|
la v0, _fbss
|
||||||
|
la v1, _end
|
||||||
|
|
||||||
|
3:
|
||||||
|
sw zero, 0(v0)
|
||||||
|
bltu v0, v1, 3b
|
||||||
|
addiu v0, v0, 4 /* Delay slot. */
|
||||||
|
.end _zerobss
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup a small stack so we can run some C code, and do
|
||||||
|
* the library initialization. (32 bytes are saved for
|
||||||
|
* the argument registers' stack slots.)
|
||||||
|
*/
|
||||||
|
.globl _stackinit
|
||||||
|
.ent _stackinit
|
||||||
|
_stackinit:
|
||||||
|
la t0, _lstack
|
||||||
|
addiu sp, t0, (STARTUP_STACK_SIZE - 32)
|
||||||
|
jal __libcfe_init
|
||||||
|
nop
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup the stack pointer --
|
||||||
|
* __libcfe_init() returns the value to be used as the top of
|
||||||
|
* the program's stack.
|
||||||
|
*
|
||||||
|
* We subtract 32 bytes for the 4 argument registers, in case
|
||||||
|
* main() wants to write them back to the stack. The caller
|
||||||
|
* allocates stack space for parameters in the old MIPS ABIs.
|
||||||
|
* We must do this even though we aren't passing arguments,
|
||||||
|
* because main might be declared to have them.)
|
||||||
|
*
|
||||||
|
* We subtract 32 more bytes for the argv/envp setup for the
|
||||||
|
* call to main().
|
||||||
|
*/
|
||||||
|
subu v0, v0, 64
|
||||||
|
move sp, v0
|
||||||
|
|
||||||
|
.end _stackinit
|
||||||
|
|
||||||
|
/*
|
||||||
|
* initialize target specific stuff. Only execute these
|
||||||
|
* functions it they exist.
|
||||||
|
*/
|
||||||
|
.globl hardware_init_hook .text
|
||||||
|
.globl software_init_hook .text
|
||||||
|
.type _fini,@function
|
||||||
|
.type _init,@function
|
||||||
|
.globl atexit .text
|
||||||
|
.globl exit .text
|
||||||
|
.globl _crt0init
|
||||||
|
.ent _crt0init
|
||||||
|
_crt0init:
|
||||||
|
la t9, hardware_init_hook # init the hardware if needed
|
||||||
|
beq t9, zero, 6f
|
||||||
|
nop
|
||||||
|
jal t9
|
||||||
|
nop
|
||||||
|
6:
|
||||||
|
la t9, software_init_hook # init the software if needed
|
||||||
|
beq t9, zero, 7f
|
||||||
|
nop
|
||||||
|
jal t9
|
||||||
|
nop
|
||||||
|
7:
|
||||||
|
la a0, _fini
|
||||||
|
jal atexit
|
||||||
|
nop
|
||||||
|
|
||||||
|
#ifdef GCRT0
|
||||||
|
.globl _ftext
|
||||||
|
.globl _extext
|
||||||
|
la a0, _ftext
|
||||||
|
la a1, _etext
|
||||||
|
jal monstartup
|
||||||
|
nop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
jal _init # run global constructors
|
||||||
|
nop
|
||||||
|
|
||||||
|
addiu a1,sp,32 # argv = sp + 32
|
||||||
|
addiu a2,sp,40 # envp = sp + 40
|
||||||
|
#if __mips64
|
||||||
|
sd zero,(a1) # argv[argc] = 0
|
||||||
|
sd zero,(a2) # envp[0] = 0
|
||||||
|
#else
|
||||||
|
sw zero,(a1)
|
||||||
|
sw zero,(a2)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
jal main # call the program start function
|
||||||
|
move a0,zero # set argc to 0; delay slot.
|
||||||
|
|
||||||
|
# fall through to the "exit" routine
|
||||||
|
jal exit # call libc exit to run the G++
|
||||||
|
# destructors
|
||||||
|
move a0, v0 # pass through the exit code
|
||||||
|
.end _crt0init
|
||||||
|
|
||||||
|
/*
|
||||||
|
* _exit -- Exit from the application. This is provided in this file because
|
||||||
|
* program exit should shut down profiling (if GCRT0 is defined),
|
||||||
|
* and only this file is compiled with GCRT0 defined.
|
||||||
|
*/
|
||||||
|
.globl _exit
|
||||||
|
.ent _exit
|
||||||
|
_exit:
|
||||||
|
7:
|
||||||
|
move s0, a0 /* Save in case we loop. */
|
||||||
|
|
||||||
|
#ifdef GCRT0
|
||||||
|
jal _mcleanup
|
||||||
|
nop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
la t0, hardware_exit_hook
|
||||||
|
beq t0,zero,1f
|
||||||
|
nop
|
||||||
|
jal t0
|
||||||
|
nop
|
||||||
|
|
||||||
|
1:
|
||||||
|
/* Call into the library to do the heavy lifting. */
|
||||||
|
jal __libcfe_exit
|
||||||
|
move a0, s0 /* Delay slot. */
|
||||||
|
|
||||||
|
b 7b /* Loop back just in case. */
|
||||||
|
nop
|
||||||
|
.end _exit
|
||||||
|
|
||||||
|
/* EOF crt0_cfe.S */
|
Loading…
x
Reference in New Issue
Block a user