This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
[PATCH 7/8] or1k: set heap start for optimsoc-gzll
- From: Stefan Wallentowitz <stefan dot wallentowitz at tum dot de>
- To: newlib at sourceware dot org
- Date: Sun, 17 May 2015 17:04:49 +0200
- Subject: [PATCH 7/8] or1k: set heap start for optimsoc-gzll
- Authentication-results: sourceware.org; auth=none
With the gzll kernel we have two different loading options:
- If the image is loaded to the global memory, the bootstrapping
loads the kernel to local memory. Applications are loaded on
demand. The heap then starts right after bss.
- If the image is pre-loaded to the local memory it includes the
application binaries right after bss. The heap then starts after
the application objects.
We can check if this is a gzll kernel as it has the string "gzll" at
0x2000. At 0x200c we then find the end of the application objects in
the image. If there is no global memory we set _or1k_heap_start to
this value.
libgloss/Changelog:
* or1k/boards/optimsoc.S: Heap for gzll kernel
>From 7ad66ca8b801c9ca93def51079119e5ae4e8a897 Mon Sep 17 00:00:00 2001
From: Stefan Wallentowitz <stefan.wallentowitz@tum.de>
Date: Sun, 19 Apr 2015 12:55:44 +0200
Subject: [PATCH 7/8] or1k: set heap start for optimsoc-gzll
With the gzll kernel we have two different loading options:
- If the image is loaded to the global memory, the bootstrapping
loads the kernel to local memory. Applications are loaded on
demand. The heap then starts right after bss.
- If the image is pre-loaded to the local memory it includes the
application binaries right after bss. The heap then starts after
the application objects.
We can check if this is a gzll kernel as it has the string "gzll" at
0x2000. At 0x200c we then find the end of the application objects in
the image. If there is no global memory we set _or1k_heap_start to
this value.
libgloss/Changelog:
* or1k/boards/optimsoc.S: Heap for gzll kernel
---
libgloss/or1k/boards/optimsoc.S | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
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:
--
2.1.4