1*f3782652STreehugger Robot /* 2*f3782652STreehugger Robot ** Copyright (C) ARM Limited, 2005. All rights reserved. 3*f3782652STreehugger Robot */ 4*f3782652STreehugger Robot 5*f3782652STreehugger Robot #if defined(__cplusplus) 6*f3782652STreehugger Robot #include <cstdio> 7*f3782652STreehugger Robot #else 8*f3782652STreehugger Robot #include <stdio.h> 9*f3782652STreehugger Robot #endif 10*f3782652STreehugger Robot #include <rt_misc.h> 11*f3782652STreehugger Robot 12*f3782652STreehugger Robot // Heap base from scatter file 13*f3782652STreehugger Robot extern int Image$$HEAP$$ZI$$Base; 14*f3782652STreehugger Robot //#pragma import(__use_two_region_memory) 15*f3782652STreehugger Robot 16*f3782652STreehugger Robot extern void core_init(void); 17*f3782652STreehugger Robot 18*f3782652STreehugger Robot /* 19*f3782652STreehugger Robot The functions below are patched onto main. 20*f3782652STreehugger Robot */ 21*f3782652STreehugger Robot 22*f3782652STreehugger Robot extern void $Super$$main(void); 23*f3782652STreehugger Robot $Sub$$main(void)24*f3782652STreehugger Robotvoid $Sub$$main(void) 25*f3782652STreehugger Robot { 26*f3782652STreehugger Robot core_init(); // does some extra setup work 27*f3782652STreehugger Robot 28*f3782652STreehugger Robot $Super$$main(); // calls the original function 29*f3782652STreehugger Robot } 30*f3782652STreehugger Robot 31*f3782652STreehugger Robot 32*f3782652STreehugger Robot /* 33*f3782652STreehugger Robot This function re-implements the C Library semihosted function. The stack pointer 34*f3782652STreehugger Robot has aready been set and is passed back to the function, The base of the heap is 35*f3782652STreehugger Robot set from the scatter file 36*f3782652STreehugger Robot */ __user_initial_stackheap(unsigned R0,unsigned SP,unsigned R2,unsigned SL)37*f3782652STreehugger Robot__value_in_regs struct __initial_stackheap __user_initial_stackheap( 38*f3782652STreehugger Robot unsigned R0, unsigned SP, unsigned R2, unsigned SL) 39*f3782652STreehugger Robot { 40*f3782652STreehugger Robot struct __initial_stackheap config; 41*f3782652STreehugger Robot 42*f3782652STreehugger Robot config.heap_base = (unsigned int)&Image$$HEAP$$ZI$$Base; // placed by scatterfile 43*f3782652STreehugger Robot config.stack_base = SP; // inherit SP from the execution environment 44*f3782652STreehugger Robot 45*f3782652STreehugger Robot return config; 46*f3782652STreehugger Robot } 47