diff options
Diffstat (limited to 'libgloss')
-rw-r--r-- | libgloss/ChangeLog | 4 | ||||
-rw-r--r-- | libgloss/or1k/boards/optimsoc.S | 29 |
2 files changed, 33 insertions, 0 deletions
diff --git a/libgloss/ChangeLog b/libgloss/ChangeLog index c05f12d..7605f36 100644 --- a/libgloss/ChangeLog +++ b/libgloss/ChangeLog @@ -1,5 +1,9 @@ 2015-05-26 Stefan Wallentowitz <stefan.wallentowitz@tum.de> + * or1k/boards/optimsoc.S: Heap for gzll kernel + +2015-05-26 Stefan Wallentowitz <stefan.wallentowitz@tum.de> + * or1k/sbrk.c: Allow for different heap start 2015-05-26 Stefan Wallentowitz <stefan.wallentowitz@tum.de> diff --git a/libgloss/or1k/boards/optimsoc.S b/libgloss/or1k/boards/optimsoc.S index a849372..eb78264 100644 --- a/libgloss/or1k/boards/optimsoc.S +++ b/libgloss/or1k/boards/optimsoc.S @@ -22,7 +22,10 @@ #define OPTIMSOC_NA_REGS OPTIMSOC_NA_BASE + 0x00000 #define OPTIMSOC_NA_LMEM_SIZE OPTIMSOC_NA_REGS + 0x24 +#define OPTIMSOC_NA_GMEM_SIZE OPTIMSOC_NA_REGS + 0x1c +#define OPTIMSOC_GZLL_STRING 0x677a6c6c +#define OPTIMSOC_GZLL_IMAGE_LAYOUT 0x2000 /* * Define symbols to be used during startup - file is linked at compile time * @@ -49,6 +52,8 @@ _or1k_board_exit: .Lexitloop: OR1K_DELAYED_NOP(l.j .Lexitloop) +.extern _or1k_heap_start + .global _or1k_board_init_early _or1k_board_init_early: #ifndef __OR1K_MULTICORE__ @@ -62,6 +67,30 @@ _or1k_board_init_early: l.movhi r2,hi(_or1k_board_mem_size) l.ori r2,r2,lo(_or1k_board_mem_size) l.sw 0(r2),r1 + // Set stack beyond apps if single image in local memory + // Is this a kernel running? + l.movhi r3,hi(OPTIMSOC_GZLL_STRING) + l.ori r3,r3,lo(OPTIMSOC_GZLL_STRING) + l.movhi r4,hi(OPTIMSOC_GZLL_IMAGE_LAYOUT) + l.ori r4,r4,lo(OPTIMSOC_GZLL_IMAGE_LAYOUT) + l.lwz r5,0(r4) + l.sfeq r3,r5 + // If not, we are done + OR1K_DELAYED_NOP(l.bnf ._or1k_board_init_early_done) + // Else: are we running with global memory (loading)? + l.movhi r6,hi(OPTIMSOC_NA_GMEM_SIZE) + l.ori r6,r6,lo(OPTIMSOC_NA_GMEM_SIZE) + l.lwz r6,0(r6) + l.sfeqi r6,0 + // If yes, we are done + OR1K_DELAYED_NOP(l.bnf ._or1k_board_init_early_done) + // Else: Read end of apps + l.lwz r7,12(r4) + l.movhi r8,hi(_or1k_heap_start) + l.ori r8,r8,lo(_or1k_heap_start) + l.sw 0(r8),r7 +._or1k_board_init_early_done: + OR1K_DELAYED_NOP(l.jr r9) .weak _or1k_board_init _or1k_board_init: |