changeset 2103:9169038683a3

Replace use of brk() system call with linker script magic to obtain the memory for the system heap.
author bartv
date Sun, 20 Nov 2005 16:21:18 +0000
parents ede282e6434e
children 84bb9baeb0e1
files packages/hal/synth/arch/current/ChangeLog packages/hal/synth/arch/current/src/synth.ld packages/hal/synth/arch/current/src/synth_entry.c packages/hal/synth/i386linux/current/ChangeLog packages/hal/synth/i386linux/current/include/pkgconf/mlt_synth_i386_rom.ldi
diffstat 5 files changed, 32 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/packages/hal/synth/arch/current/ChangeLog
+++ b/packages/hal/synth/arch/current/ChangeLog
@@ -1,3 +1,12 @@
+2005-11-19  Bart Veer  <bartv@ecoscentric.com>
+
+	* src/synth_entry.c (_linux_entry): brk() is no longer needed to
+	get heap memory.
+
+	* src/synth.ld: add new section to contain the heap memory rather
+	than rely on brk().
+	
+
 2005-11-05  Andrew Lunn <andrew.lunn@ascom.ch>
 
 	* include/hal_io.h (struct cyg_hal_sys_old_stat): Make the
--- a/packages/hal/synth/arch/current/src/synth.ld
+++ b/packages/hal/synth/arch/current/src/synth.ld
@@ -8,6 +8,7 @@
 //####ECOSGPLCOPYRIGHTBEGIN####
 // -------------------------------------------
 // This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 2005 Bart Veer
 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
 //
 // eCos is free software; you can redistribute it and/or modify it under
@@ -212,6 +213,11 @@ GROUP(libtarget.a libgcc.a)
     > _region_                                                                  \
     __bss_end = .;
 
+#define SECTIONS_HEAP(_region_, _start_, _end_)					\
+    .synth_heap _start_ :							\
+    { FORCE_OUTPUT; . = _end_ - _start_ ; }					\
+    > _region_
+
 #define SECTIONS_END . = ALIGN(4); _end = .; PROVIDE (end = .);
 
 #include <pkgconf/system.h>
--- a/packages/hal/synth/arch/current/src/synth_entry.c
+++ b/packages/hal/synth/arch/current/src/synth_entry.c
@@ -8,7 +8,7 @@
 //####ECOSGPLCOPYRIGHTBEGIN####
 // -------------------------------------------
 // This file is part of eCos, the Embedded Configurable Operating System.
-// Copyright (C) 2002 Bart Veer
+// Copyright (C) 2002, 2005 Bart Veer
 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
 //
 // eCos is free software; you can redistribute it and/or modify it under
@@ -105,29 +105,16 @@ externC void    synth_hardware_init2(voi
 
 void _linux_entry( void )
 {
-    void* new_top = (void*) 0;
-    
     // "Initialize various cpu status registers, including disabling interrupts."
     // That is a no-op for the synthetic target, in particular interrupts are
     // already disabled.
 
-    // "Set up any CPU memory controller to access ROM, RAM, and I/O devices
-    // correctly".
-    //
-    // This involves using the brk() system call to allocate the RAM used
-    // for the heaps. There are no variables mapped there so the system
-    // will not have done this for us. Note that the implementation of
-    // brk() (mm/mmap.c) differs from the documentation - the return
-    // value is the new brk value, not an error code.
-    new_top = (void*) (CYGMEM_REGION_ram + CYGMEM_REGION_ram_SIZE);
-    if (new_top != cyg_hal_sys_brk(new_top)) {
-        CYG_FAIL("Failed to initialize memory");
-        cyg_hal_sys_exit(1);
-    }
-    
-    // Again a no-op for the synthetic target. All memory is readily
-    // accessible. Arguably the auxiliary should be started up here, but
-    // instead that is left to platform initialization.
+    // "Set up any CPU memory controller to access ROM, RAM, and I/O
+    // devices correctly". The ROM and RAM are set up via the linker
+    // script and taken care of automatically during loading. There
+    // are no memory-mapped devices. Arguably the auxiliary should be
+    // started up here, but instead that is left to platform
+    // initialization.
 
     // "Enable the cache". Effectively the synthetic target has no cache,
     // anything provided by the hardware is not readily accessible.
--- a/packages/hal/synth/i386linux/current/ChangeLog
+++ b/packages/hal/synth/i386linux/current/ChangeLog
@@ -1,3 +1,8 @@
+2005-11-19  Bart Veer  <bartv@ecoscentric.com>
+
+	* include/pkgconf/mlt_synth_i386_rom.ldi: add new heap section to
+	avoid the use of brk()
+
 2005-11-05  Andrew Lunn  <andrew.lunn@ascom.ch>
 
 	* src/syscall-i386-linux-1.0.S: renamed prev_?stat to old?stat to
--- a/packages/hal/synth/i386linux/current/include/pkgconf/mlt_synth_i386_rom.ldi
+++ b/packages/hal/synth/i386linux/current/include/pkgconf/mlt_synth_i386_rom.ldi
@@ -6,14 +6,14 @@
 
 MEMORY
 {
-    rom : ORIGIN = 0x1000000, LENGTH = 0x800000
-    ram : ORIGIN = 0x2000000, LENGTH = 0x800000
+    rom : ORIGIN = 0x01000000, LENGTH = 0x800000
+    ram : ORIGIN = 0x02000000, LENGTH = 0x800000
 }
 
 SECTIONS
 {
     SECTIONS_BEGIN
-    SECTION_vectors (rom, 0x1000000, LMA_EQ_VMA)
+    SECTION_vectors (rom, 0x01000000, LMA_EQ_VMA)
     SECTION_text (rom, ALIGN (0x4), LMA_EQ_VMA)
     SECTION_fini (rom, ALIGN (0x4), LMA_EQ_VMA)
     SECTION_rodata1 (rom, ALIGN (0x8), LMA_EQ_VMA)
@@ -23,9 +23,10 @@ SECTIONS
     SECTION_eh_frame (rom, ALIGN (0x4), LMA_EQ_VMA)
     SECTION_rel__got (rom, ALIGN (0x1), LMA_EQ_VMA)
     SECTION_gcc_except_table (rom, ALIGN (0x1), LMA_EQ_VMA)
-    SECTION_data (ram, 0x2000000, LMA_EQ_VMA)
+    SECTION_data (ram, 0x02000000, LMA_EQ_VMA)
     SECTION_sbss (ram, ALIGN (0x4), LMA_EQ_VMA)
     SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA)
     CYG_LABEL_DEFN(__heap1) = ALIGN (0x10);
+    SECTIONS_HEAP(ram, __heap1, 0x02800000)
     SECTIONS_END
 }