diff --git a/libgloss/ChangeLog b/libgloss/ChangeLog index c05f12d06..7605f3692 100644 --- a/libgloss/ChangeLog +++ b/libgloss/ChangeLog @@ -1,3 +1,7 @@ +2015-05-26 Stefan Wallentowitz + + * or1k/boards/optimsoc.S: Heap for gzll kernel + 2015-05-26 Stefan Wallentowitz * or1k/sbrk.c: Allow for different heap start diff --git a/libgloss/or1k/boards/optimsoc.S b/libgloss/or1k/boards/optimsoc.S index a8493729d..eb782644d 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: