[U-Boot] [PATCH 17/17] Change entire eNET code + data to run from RAM
Graeme Russ
graeme.russ at gmail.com
Sun Aug 23 05:00:01 CEST 2009
Flash probing can cause the Boot Flash to lock up - Entire contents of
Flash (minus the low level asm init which is not needed post-bootstrap)
is copied to RAM
This is not an ideal relocation mechanism. This change sets TEXT_BASE
to an area just below the guaranteed 64MB RAM which exists on all eNET
boards. At some stage in the future, I hope to implement a proper
relocation mechanism
Signed-off-by: Graeme Russ <graeme.russ at gmail.com>
---
board/eNET/config.mk | 2 +-
board/eNET/u-boot.lds | 65 ++++++++++++++++++++++++++++-------------------
cpu/i386/start.S | 8 ++++++
include/configs/eNET.h | 6 ++--
4 files changed, 51 insertions(+), 30 deletions(-)
diff --git a/board/eNET/config.mk b/board/eNET/config.mk
index a763841..833c66e 100644
--- a/board/eNET/config.mk
+++ b/board/eNET/config.mk
@@ -21,4 +21,4 @@
# MA 02111-1307 USA
#
-TEXT_BASE = 0x38040000
+TEXT_BASE = 0x03FC0000
diff --git a/board/eNET/u-boot.lds b/board/eNET/u-boot.lds
index 284d2bd..7311e8b 100644
--- a/board/eNET/u-boot.lds
+++ b/board/eNET/u-boot.lds
@@ -27,47 +27,42 @@ ENTRY(_start)
SECTIONS
{
- . = 0x38040000; /* Location of bootcode in flash */
+ /*
+ * All eNET boards have at least 64MB memory on board. The Boot Flash
+ * is 512kB, but only 256kB of this is used for U-Boot. start.S will
+ * copy the 256kB U-Boot executable from Flash into RAM starting at
+ * the address 256kB below 64MB (i.e. 0x03FC0000)
+ */
+ . = 0x03FC0000;
+
+ _i386boot_rom_copy_start = .;
+ /* --- Begin data copied from Flash --- */
.text : { *(.text); }
-
. = ALIGN(4);
- .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
- _i386boot_text_size = SIZEOF(.text) + SIZEOF(.rodata);
+ .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
+ . = ALIGN(4);
- . = 0x03FF0000; /* Ram data segment to use */
- _i386boot_romdata_dest = ABSOLUTE(.);
- .data : AT ( LOADADDR(.rodata) + SIZEOF(.rodata) ) { *(.data) }
- _i386boot_romdata_start = LOADADDR(.data);
+ .u_boot_cmd : { *(.u_boot_cmd) }
+ . = ALIGN(4);
+ .data : { *(.data) }
. = ALIGN(4);
- .got : AT ( LOADADDR(.data) + SIZEOF(.data) ) { *(.got) }
+ .got : { *(.got) }
. = ALIGN(4);
- __u_boot_cmd_start = .;
- .u_boot_cmd : { *(.u_boot_cmd) }
- __u_boot_cmd_end = .;
- _i386boot_cmd_start = LOADADDR(.u_boot_cmd);
- _i386boot_romdata_size = SIZEOF(.data) + SIZEOF(.got) + SIZEOF(.u_boot_cmd);
+ /* --- End data copied from Flash --- */
+ _i386boot_rom_copy_end = .;
- . = ALIGN(4);
- _i386boot_bss_start = ABSOLUTE(.);
.bss (NOLOAD) : { *(.bss) }
- _i386boot_bss_size = SIZEOF(.bss);
/* 16bit realmode trampoline code */
.realmode 0x7c0 : AT ( LOADADDR(.got) + SIZEOF(.got) + SIZEOF(.u_boot_cmd)) { *(.realmode) }
- _i386boot_realmode = LOADADDR(.realmode);
- _i386boot_realmode_size = SIZEOF(.realmode);
-
/* 16bit BIOS emulation code (just enough to boot Linux) */
.bios 0 : AT ( LOADADDR(.realmode) + SIZEOF(.realmode) ) { *(.bios) }
- _i386boot_bios = LOADADDR(.bios);
- _i386boot_bios_size = SIZEOF(.bios);
-
/* The load addresses below assumes that the flash
* will be mapped so that 0x387f0000 == 0xffff0000
* at reset time
@@ -79,12 +74,30 @@ SECTIONS
*/
. = 0xffffee00;
- .start32 : AT (0x3807ee00) { *(.start32); }
+ .start32 : AT (0x03ffee00) { *(.start32); }
. = 0xf800;
- .start16 : AT (0x3807f800) { *(.start16); }
+ .start16 : AT (0x03fff800) { *(.start16); }
. = 0xfff0;
- .resetvec : AT (0x3807fff0) { *(.resetvec); }
+ .resetvec : AT (0x03fffff0) { *(.resetvec); }
_i386boot_end = (LOADADDR(.resetvec) + SIZEOF(.resetvec) );
+
+ /* Export section information */
+ _i386boot_bss_start = ADDR(.bss);
+ _i386boot_bss_size = SIZEOF(.bss);
+ _i386boot_realmode = LOADADDR(.realmode);
+ _i386boot_realmode_size = SIZEOF(.realmode);
+ _i386boot_bios = LOADADDR(.bios);
+ _i386boot_bios_size = SIZEOF(.bios);
+
+ _i386boot_romdata_start = LOADADDR(.rodata);
+
+ _i386boot_romdata_dest = LOADADDR(.data);
+ _i386boot_cmd_start = LOADADDR(.u_boot_cmd);
+ _i386boot_romdata_size = SIZEOF(.data) + SIZEOF(.got) + SIZEOF(.u_boot_cmd);
+
+ __u_boot_cmd_start = ADDR(.u_boot_cmd);
+ __u_boot_cmd_end = ADDR(.u_boot_cmd) + SIZEOF(.u_boot_cmd);
+
}
diff --git a/cpu/i386/start.S b/cpu/i386/start.S
index bb4a5cf..cb2633f 100644
--- a/cpu/i386/start.S
+++ b/cpu/i386/start.S
@@ -116,10 +116,18 @@ stack_ok:
jmp show_boot_progress_asm
.progress2:
+#ifdef CONFIG_SYS_FULL_CODE_COPY
+ /* copy text, rodata, u_boot_cmd, data, and got sections from Flash */
+ movl $TEXT_BASE, %edi /* destination address */
+ movl $CONFIG_SYS_MONITOR_BASE, %esi /* source address */
+ movl $_i386boot_rom_copy_end, %ecx
+ subl $_i386boot_rom_copy_start, %ecx
+#else
/* copy data section to ram, size must be 4-byte aligned */
movl $_i386boot_romdata_dest, %edi /* destination address */
movl $_i386boot_romdata_start, %esi /* source address */
movl $_i386boot_romdata_size, %ecx /* number of bytes to copy */
+#endif
movl %ecx, %eax
andl $3, %eax
jnz data_fail
diff --git a/include/configs/eNET.h b/include/configs/eNET.h
index 243a554..cfcd909 100644
--- a/include/configs/eNET.h
+++ b/include/configs/eNET.h
@@ -28,6 +28,8 @@
#ifndef __CONFIG_H
#define __CONFIG_H
+#define CONFIG_SKIP_RELOCATE_UBOOT
+#define CONFIG_SYS_FULL_CODE_COPY
/*
* Stuff still to be dealt with -
*/
@@ -154,9 +156,7 @@
* Memory organization
*/
#define CONFIG_SYS_STACK_SIZE 0x8000 /* Size of bootloader stack */
-#define CONFIG_SYS_BL_START_FLASH 0x38040000 /* Address of relocated code */
-#define CONFIG_SYS_BL_START_RAM 0x03fd0000 /* Address of relocated code */
-#define CONFIG_SYS_MONITOR_BASE TEXT_BASE
+#define CONFIG_SYS_MONITOR_BASE 0x38040000 /* Address of code in Boot Flash */
#define CONFIG_SYS_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Mon */
#define CONFIG_SYS_FLASH_BASE 0x38000000 /* Boot Flash */
#define CONFIG_SYS_FLASH_BASE_1 0x10000000 /* StrataFlash 1 */
--
1.6.0.2.GIT
More information about the U-Boot
mailing list