diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2003-09-26 20:43:22 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2003-09-26 20:43:22 +0000 |
commit | 92b67b18d78f9822dcd58c018c130e4bd986986b (patch) | |
tree | df313cd1b79049b08ed607e2861947c5fcc2a845 /c/src/lib/libbsp/powerpc/shared/startup/bspstart.c | |
parent | 2003-09-26 Till Straumann <strauman@slac.stanford.edu> (diff) | |
download | rtems-92b67b18d78f9822dcd58c018c130e4bd986986b.tar.bz2 |
2003-09-26 Till Strauman <strauman@slac.stanford.edu>
PR 496/bsps
* startup/sbrk.c: New file.
* startup/bspstart.c: This patch implements 'sbrk'
for the powerpc-shared BSP to work around what's known as the
'32Mb problem' in combination with run-time loaded code.
GCC normally generates (PowerPC) code doing 'short jumps' which
requires all text segments being in the same 32Mb area of memory.
However, some run-time loaders use (e.g. heap-) memory violating the
stated limitation on hardware with more than 32Mb of memory.
(NOTE: portable loaders are probably not even aware of this
GCC/CPU specific problem.)
This patch implements a simple workaround: At boot time, the system is
only provided with 32Mb of memory. The user is supposed to load all
necessary modules prior to that limit being exhausted. Once that
happens, newlib/malloc end up trying to 'sbrk()' for more memory and
the implementation provided by this patch will then make the rest of
the physical memory available.
Diffstat (limited to 'c/src/lib/libbsp/powerpc/shared/startup/bspstart.c')
-rw-r--r-- | c/src/lib/libbsp/powerpc/shared/startup/bspstart.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/c/src/lib/libbsp/powerpc/shared/startup/bspstart.c b/c/src/lib/libbsp/powerpc/shared/startup/bspstart.c index 3834c6f255..1927ea96db 100644 --- a/c/src/lib/libbsp/powerpc/shared/startup/bspstart.c +++ b/c/src/lib/libbsp/powerpc/shared/startup/bspstart.c @@ -132,6 +132,8 @@ void bsp_pretasking_hook(void) { rtems_unsigned32 heap_start; rtems_unsigned32 heap_size; + rtems_unsigned32 heap_sbrk_spared; + extern rtems_unsigned32 _bsp_sbrk_init(rtems_unsigned32, rtems_unsigned32*); heap_start = ((rtems_unsigned32) __rtems_end) +INIT_STACK_SIZE + INTR_STACK_SIZE; if (heap_start & (CPU_ALIGNMENT-1)) @@ -139,10 +141,14 @@ void bsp_pretasking_hook(void) heap_size = (BSP_mem_size - heap_start) - BSP_Configuration.work_space_size; + heap_sbrk_spared=_bsp_sbrk_init(heap_start, &heap_size); + #ifdef SHOW_MORE_INIT_SETTINGS - printk(" HEAP start %x size %x\n", heap_start, heap_size); + printk(" HEAP start %x size %x (%x bytes spared for sbrk)\n", heap_start, heap_size, heap_sbrk_spared); #endif - bsp_libc_init((void *) heap_start, heap_size, 0); + + bsp_libc_init((void *) 0, heap_size, heap_sbrk_spared); + #ifdef RTEMS_DEBUG rtems_debug_enable( RTEMS_DEBUG_ALL_MASK ); |