diff options
Diffstat (limited to 'c/src/lib/libbsp/i386/pc386/startup/bspstart.c')
-rw-r--r-- | c/src/lib/libbsp/i386/pc386/startup/bspstart.c | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/startup/bspstart.c b/c/src/lib/libbsp/i386/pc386/startup/bspstart.c index 24303b36a7..13e8610c42 100644 --- a/c/src/lib/libbsp/i386/pc386/startup/bspstart.c +++ b/c/src/lib/libbsp/i386/pc386/startup/bspstart.c @@ -42,9 +42,16 @@ /*-------------------------------------------------------------------------+ | Global Variables +--------------------------------------------------------------------------*/ -extern rtems_unsigned32 _end; /* End of BSS. Defined in 'linkcmds'. */ -extern rtems_unsigned32 _heap_size; /* Size of stack. Defined in 'start.s'. */ -extern rtems_unsigned32 _stack_size; /* Size of heap. Defined in 'start.s'. */ +extern rtems_unsigned32 _end; /* End of BSS. Defined in 'linkcmds'. */ + +/* + * Size of heap if it is 0 it will be dynamically defined by memory size, + * otherwise the value should be changed by binary patch + */ +rtems_unsigned32 _heap_size = 0; + +/* Size of stack used during initialization. Defined in 'start.s'. */ +extern rtems_unsigned32 _stack_size; rtems_unsigned32 rtemsFreeMemStart; /* Address of start of free memory - should be updated @@ -81,9 +88,43 @@ extern void rtems_irq_mngt_init(); +--------------------------------------------------------------------------*/ void bsp_pretasking_hook(void) { + rtems_unsigned32 topAddr, val; + int i; + + if (rtemsFreeMemStart & (CPU_ALIGNMENT - 1)) /* not aligned => align it */ rtemsFreeMemStart = (rtemsFreeMemStart+CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1); + if(_heap_size == 0) + { + /* + * We have to dynamically size memory. Memory size can be anything + * between 2M and 2048M. + * let us first write + */ + for(i=2048; i>=2; i--) + { + topAddr = i*1024*1024 - 4; + *(volatile rtems_unsigned32 *)topAddr = topAddr; + } + + printk("\n"); + + for(i=2; i<=2048; i++) + { + topAddr = i*1024*1024 - 4; + val = *(rtems_unsigned32 *)topAddr; + if(val != topAddr) + { + break; + } + } + + topAddr = (i-1)*1024*1024 - 4; + + _heap_size = topAddr - rtemsFreeMemStart; + } + bsp_libc_init((void *)rtemsFreeMemStart, _heap_size, 0); rtemsFreeMemStart += _heap_size; /* HEAP_SIZE in KBytes */ @@ -105,7 +146,7 @@ void bsp_pretasking_hook(void) +--------------------------------------------------------------------------*/ void bsp_start( void ) { - rtemsFreeMemStart = (rtems_unsigned32)&_end + _heap_size + _stack_size; + rtemsFreeMemStart = (rtems_unsigned32)&_end + _stack_size; /* set the value of start of free memory. */ /* If we don't have command line arguments set default program name. */ |