diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2003-08-20 19:32:52 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2003-08-20 19:32:52 +0000 |
commit | 49703eb3f53c12fb0ac3d12ca0beaddfe581cfd4 (patch) | |
tree | 067bcfc2b0cb8868e00ef0977c53f0ddf978df94 /libgloss/mips/cfe_mem.c | |
parent | 2bf794af9a7fff8aeeae6e53642b64e40918b76f (diff) | |
download | cygnal-49703eb3f53c12fb0ac3d12ca0beaddfe581cfd4.tar.gz cygnal-49703eb3f53c12fb0ac3d12ca0beaddfe581cfd4.tar.bz2 cygnal-49703eb3f53c12fb0ac3d12ca0beaddfe581cfd4.zip |
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.
Diffstat (limited to 'libgloss/mips/cfe_mem.c')
-rw-r--r-- | libgloss/mips/cfe_mem.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/libgloss/mips/cfe_mem.c b/libgloss/mips/cfe_mem.c new file mode 100644 index 000000000..87caabf8c --- /dev/null +++ b/libgloss/mips/cfe_mem.c @@ -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; +} |