[syslinux:lwip] core: dynamically size the heap

syslinux-bot for H. Peter Anvin hpa at zytor.com
Mon Apr 25 16:48:31 PDT 2011


Commit-ID:  05fc41096ac07358660e96e138890999bcab89df
Gitweb:     http://syslinux.zytor.com/commit/05fc41096ac07358660e96e138890999bcab89df
Author:     H. Peter Anvin <hpa at zytor.com>
AuthorDate: Mon, 25 Apr 2011 16:37:24 -0700
Committer:  H. Peter Anvin <hpa at zytor.com>
CommitDate: Mon, 25 Apr 2011 16:37:24 -0700

core: dynamically size the heap

Dynamically size the heap to 1/16 of available high memory.

Signed-off-by: H. Peter Anvin <hpa at zytor.com>


---
 core/com32.inc      |    2 +-
 core/configinit.inc |    4 +---
 core/extern.inc     |    3 +++
 core/fs/fs.c        |    3 ---
 core/init.inc       |    6 ++++++
 core/mem/init.c     |   14 ++++++++++----
 core/ui.inc         |    4 ++--
 7 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/core/com32.inc b/core/com32.inc
index 111590c..ff18fde 100644
--- a/core/com32.inc
+++ b/core/com32.inc
@@ -123,7 +123,7 @@ not_com32r_msg	db ': not a COM32R image', CR, LF, 0
 		;
 		; Danger, Will Robinson: it's not clear the use of
 		; core_xfer_buf is safe here.
-		global __entry_esp, __com32
+		global __entry_esp, __com32, HighMemSize
 		alignz 4
 __entry_esp:
 		dd 0				; Dummy to avoid _exit issues
diff --git a/core/configinit.inc b/core/configinit.inc
index 915e77f..6320a0d 100644
--- a/core/configinit.inc
+++ b/core/configinit.inc
@@ -20,8 +20,6 @@
 		section .text16
 
 reset_config:
-		call highmemsize
-
 		; Initialize the .config section
 		xor eax,eax
 		mov si,__config_lma
@@ -45,7 +43,7 @@ mkkeymap:	stosb
 		inc al
 		loop mkkeymap
 
-		mov eax,[HighMemSize]
+		mov eax,[MallocStart]
 		mov [VKernelEnd],eax
 
 		ret
diff --git a/core/extern.inc b/core/extern.inc
index 816659b..b40d849 100644
--- a/core/extern.inc
+++ b/core/extern.inc
@@ -24,6 +24,9 @@
 	; newconfig.c
 	extern pm_is_config_file
 
+	; mem/init.c
+	extern MallocStart, mem_init
+
 %if IS_PXELINUX
 	; pxe.c
 	extern unload_pxe, reset_pxe
diff --git a/core/fs/fs.c b/core/fs/fs.c
index ad2fb37..5409986 100644
--- a/core/fs/fs.c
+++ b/core/fs/fs.c
@@ -429,9 +429,6 @@ void fs_init(com32sys_t *regs)
     /* ops is a ptr list for several fs_ops */
     const struct fs_ops **ops = (const struct fs_ops **)regs->eax.l;
 
-    /* Initialize malloc() */
-    mem_init();
-
     /* Default name for the root directory */
     fs.cwd_name[0] = '/';
 
diff --git a/core/init.inc b/core/init.inc
index e06ca96..97889ca 100644
--- a/core/init.inc
+++ b/core/init.inc
@@ -29,6 +29,12 @@ common_init:
 		jne kaboom
 
 ;
+; Initialize the malloc arena
+;
+		call highmemsize
+		pm_call mem_init
+
+;
 ; Initialize timer
 ;
 		call timer_init
diff --git a/core/mem/init.c b/core/mem/init.c
index 487bbb3..87e4cdd 100644
--- a/core/mem/init.c
+++ b/core/mem/init.c
@@ -5,14 +5,16 @@
 
 struct free_arena_header __malloc_head[NHEAP];
 
-static __hugebss char main_heap[128 << 10];
 extern char __lowmem_heap[];
+size_t __bss16 MallocStart;
+extern size_t HighMemSize;
 
 void mem_init(void)
 {
     struct free_arena_header *fp;
     int i;
     uint16_t *bios_free_mem = (uint16_t *)0x413;
+    size_t main_heap_size;
 
     /* Initialize the head nodes */
 
@@ -24,10 +26,14 @@ void mem_init(void)
 	fp++;
     }
 
-    /* Initialize the main heap */
-    fp = (struct free_arena_header *)main_heap;
+    /* Initialize the main heap; give it 1/16 of high memory */
+    main_heap_size = (HighMemSize - 0x100000) >> 4;
+    MallocStart    = (HighMemSize - main_heap_size) & ~4095;
+    main_heap_size = (HighMemSize - MallocStart) & ARENA_SIZE_MASK;
+
+    fp = (struct free_arena_header *)MallocStart;
     fp->a.attrs = ARENA_TYPE_USED | (HEAP_MAIN << ARENA_HEAP_POS);
-    ARENA_SIZE_SET(fp->a.attrs, sizeof main_heap);
+    ARENA_SIZE_SET(fp->a.attrs, main_heap_size);
     __inject_free_block(fp);
 
     /* Initialize the lowmem heap */
diff --git a/core/ui.inc b/core/ui.inc
index 0a4bb56..36b6c6e 100644
--- a/core/ui.inc
+++ b/core/ui.inc
@@ -154,7 +154,7 @@ display_labels:
 		mov cx,di
 		sub cx,command_line
 		call crlf
-		mov esi,[HighMemSize]		; Start from top of memory
+		mov esi,[MallocStart]		; Start from top of memory
 .scan:
 		cmp esi,[VKernelEnd]
 		jbe .not_vk
@@ -360,7 +360,7 @@ clin_opt_ok:
 ; Now check if it is a "virtual kernel"
 ;
 vk_check:
-		mov esi,[HighMemSize]		; Start from top of memory
+		mov esi,[MallocStart]		; Start from top of memory
 .scan:
 		cmp esi,[VKernelEnd]
 		jbe .not_vk



More information about the Syslinux-commits mailing list