From: Heiko Schocher <hs@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 16/26 v2][NEXT] ARM: implement relocation for ARM920
Date: Fri, 17 Sep 2010 13:10:43 +0200 [thread overview]
Message-ID: <1284721853-8298-17-git-send-email-hs@denx.de> (raw)
In-Reply-To: <1284721853-8298-16-git-send-email-hs@denx.de>
Change the implementation for arm920 to relocate the code to
an arbitrary address in RAM.
Portions of this work were supported by funding from
the CE Linux Forum.
Signed-off-by: Heiko Schocher <hs@denx.de>
---
arch/arm/cpu/arm920t/start.S | 225 ++++++++++++++++++++++++++++++++++++++-
arch/arm/cpu/arm920t/u-boot.lds | 14 +++-
2 files changed, 237 insertions(+), 2 deletions(-)
diff --git a/arch/arm/cpu/arm920t/start.S b/arch/arm/cpu/arm920t/start.S
index e532f55..a079bb2 100644
--- a/arch/arm/cpu/arm920t/start.S
+++ b/arch/arm/cpu/arm920t/start.S
@@ -70,12 +70,15 @@ _fiq: .word fiq
*************************************************************************
*/
+.globl _TEXT_BASE
_TEXT_BASE:
.word TEXT_BASE
+#if defined(CONFIG_SYS_ARM_WITHOUT_RELOC)
.globl _armboot_start
_armboot_start:
.word _start
+#endif
/*
* These are defined in the board-specific linker script.
@@ -100,6 +103,35 @@ FIQ_STACK_START:
.word 0x0badc0de
#endif
+#if !defined(CONFIG_SYS_ARM_WITHOUT_RELOC)
+/* IRQ stack memory (calculated at run-time) + 8 bytes */
+.globl IRQ_STACK_START_IN
+IRQ_STACK_START_IN:
+ .word 0x0badc0de
+
+.globl _datarel_start
+_datarel_start:
+ .word __datarel_start
+
+.globl _datarelrolocal_start
+_datarelrolocal_start:
+ .word __datarelrolocal_start
+
+.globl _datarellocal_start
+_datarellocal_start:
+ .word __datarellocal_start
+
+.globl _datarelro_start
+_datarelro_start:
+ .word __datarelro_start
+
+.globl _got_start
+_got_start:
+ .word __got_start
+
+.globl _got_end
+_got_end:
+ .word __got_end
/*
* the actual start code
@@ -176,6 +208,189 @@ copyex:
bl cpu_init_crit
#endif
+/* Set stackpointer in internal RAM to call board_init_f */
+call_board_init_f:
+ ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
+ ldr r0,=0x00000000
+ bl board_init_f
+
+/*------------------------------------------------------------------------------*/
+
+/*
+ * void relocate_code (addr_sp, gd, addr_moni)
+ *
+ * This "function" does not return, instead it continues in RAM
+ * after relocating the monitor code.
+ *
+ */
+ .globl relocate_code
+relocate_code:
+ mov r4, r0 /* save addr_sp */
+ mov r5, r1 /* save addr of gd */
+ mov r6, r2 /* save addr of destination */
+ mov r7, r2 /* save addr of destination */
+
+ /* Set up the stack */
+stack_setup:
+ mov sp, r4
+
+ adr r0, _start
+ ldr r2, _TEXT_BASE
+ ldr r3, _bss_start
+ sub r2, r3, r2 /* r2 <- size of armboot */
+ add r2, r0, r2 /* r2 <- source end address */
+ cmp r0, r6
+ beq clear_bss
+
+#ifndef CONFIG_SKIP_RELOCATE_UBOOT
+copy_loop:
+ ldmia r0!, {r9-r10} /* copy from source address [r0] */
+ stmia r6!, {r9-r10} /* copy to target address [r1] */
+ cmp r0, r2 /* until source end addreee [r2] */
+ ble copy_loop
+
+#ifndef CONFIG_PRELOADER
+ /* fix got entries */
+ ldr r1, _TEXT_BASE /* Text base */
+ mov r0, r7 /* reloc addr */
+ ldr r2, _got_start /* addr in Flash */
+ ldr r3, _got_end /* addr in Flash */
+ sub r3, r3, r1
+ add r3, r3, r0
+ sub r2, r2, r1
+ add r2, r2, r0
+
+fixloop:
+ ldr r4, [r2]
+ sub r4, r4, r1
+ add r4, r4, r0
+ str r4, [r2]
+ add r2, r2, #4
+ cmp r2, r3
+ bne fixloop
+#endif
+#endif /* #ifndef CONFIG_SKIP_RELOCATE_UBOOT */
+
+clear_bss:
+#ifndef CONFIG_PRELOADER
+ ldr r0, _bss_start
+ ldr r1, _bss_end
+ ldr r3, _TEXT_BASE /* Text base */
+ mov r4, r7 /* reloc addr */
+ sub r0, r0, r3
+ add r0, r0, r4
+ sub r1, r1, r3
+ add r1, r1, r4
+ mov r2, #0x00000000 /* clear */
+
+clbss_l:str r2, [r0] /* clear loop... */
+ add r0, r0, #4
+ cmp r0, r1
+ bne clbss_l
+
+ bl coloured_LED_init
+ bl red_LED_on
+#endif
+
+/*
+ * We are done. Do not return, instead branch to second part of board
+ * initialization, now running from RAM.
+ */
+#ifdef CONFIG_NAND_SPL
+ ldr pc, _nand_boot
+
+_nand_boot: .word nand_boot
+#else
+ ldr r0, _TEXT_BASE
+ ldr r2, _board_init_r
+ sub r2, r2, r0
+ add r2, r2, r7 /* position from board_init_r in RAM */
+ /* setup parameters for board_init_r */
+ mov r0, r5 /* gd_t */
+ mov r1, r7 /* dest_addr */
+ /* jump to it ... */
+ mov lr, r2
+ mov pc, lr
+
+_board_init_r: .word board_init_r
+#endif
+
+#else /* #if !defined(CONFIG_SYS_ARM_WITHOUT_RELOC) */
+/*
+ * the actual start code
+ */
+
+start_code:
+ /*
+ * set the cpu to SVC32 mode
+ */
+ mrs r0, cpsr
+ bic r0, r0, #0x1f
+ orr r0, r0, #0xd3
+ msr cpsr, r0
+
+ bl coloured_LED_init
+ bl red_LED_on
+
+#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK)
+ /*
+ * relocate exception table
+ */
+ ldr r0, =_start
+ ldr r1, =0x0
+ mov r2, #16
+copyex:
+ subs r2, r2, #1
+ ldr r3, [r0], #4
+ str r3, [r1], #4
+ bne copyex
+#endif
+
+#ifdef CONFIG_S3C24X0
+ /* turn off the watchdog */
+
+# if defined(CONFIG_S3C2400)
+# define pWTCON 0x15300000
+# define INTMSK 0x14400008 /* Interupt-Controller base addresses */
+# define CLKDIVN 0x14800014 /* clock divisor register */
+#else
+# define pWTCON 0x53000000
+# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
+# define INTSUBMSK 0x4A00001C
+# define CLKDIVN 0x4C000014 /* clock divisor register */
+# endif
+
+ ldr r0, =pWTCON
+ mov r1, #0x0
+ str r1, [r0]
+
+ /*
+ * mask all IRQs by setting all bits in the INTMR - default
+ */
+ mov r1, #0xffffffff
+ ldr r0, =INTMSK
+ str r1, [r0]
+# if defined(CONFIG_S3C2410)
+ ldr r1, =0x3ff
+ ldr r0, =INTSUBMSK
+ str r1, [r0]
+# endif
+
+ /* FCLK:HCLK:PCLK = 1:2:4 */
+ /* default FCLK is 120 MHz ! */
+ ldr r0, =CLKDIVN
+ mov r1, #3
+ str r1, [r0]
+#endif /* CONFIG_S3C24X0 */
+
+ /*
+ * we do sys-critical inits only@reboot,
+ * not when booting from ram!
+ */
+#ifndef CONFIG_SKIP_LOWLEVEL_INIT
+ bl cpu_init_crit
+#endif
+
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
@@ -219,7 +434,7 @@ clbss_l:str r2, [r0] /* clear loop... */
ldr pc, _start_armboot
_start_armboot: .word start_armboot
-
+#endif /* #if !defined(CONFIG_SYS_ARM_WITHOUT_RELOC) */
/*
*************************************************************************
@@ -309,11 +524,15 @@ cpu_init_crit:
.macro bad_save_user_regs
sub sp, sp, #S_FRAME_SIZE
stmia sp, {r0 - r12} @ Calling r0-r12
+#if defined(CONFIG_SYS_ARM_WITHOUT_RELOC)
ldr r2, _armboot_start
sub r2, r2, #(CONFIG_STACKSIZE)
sub r2, r2, #(CONFIG_SYS_MALLOC_LEN)
/* set base 2 words into abort stack */
sub r2, r2, #(CONFIG_SYS_GBL_DATA_SIZE+8)
+#else
+ ldr r2, IRQ_STACK_START_IN
+#endif
ldmia r2, {r2 - r3} @ get pc, cpsr
add r0, sp, #S_FRAME_SIZE @ restore sp_SVC
@@ -345,11 +564,15 @@ cpu_init_crit:
.endm
.macro get_bad_stack
+#if defined(CONFIG_SYS_ARM_WITHOUT_RELOC)
ldr r13, _armboot_start @ setup our mode stack
sub r13, r13, #(CONFIG_STACKSIZE)
sub r13, r13, #(CONFIG_SYS_MALLOC_LEN)
/* reserve a couple spots in abort stack */
sub r13, r13, #(CONFIG_SYS_GBL_DATA_SIZE+8)
+#else
+ ldr r13, IRQ_STACK_START_IN @ setup our mode stack
+#endif
str lr, [r13] @ save caller lr / spsr
mrs lr, spsr
diff --git a/arch/arm/cpu/arm920t/u-boot.lds b/arch/arm/cpu/arm920t/u-boot.lds
index a7decfc..6985434 100644
--- a/arch/arm/cpu/arm920t/u-boot.lds
+++ b/arch/arm/cpu/arm920t/u-boot.lds
@@ -47,11 +47,23 @@ SECTIONS
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(4);
- .data : { *(.data) }
+ .data : {
+ *(.data)
+ __datarel_start = .;
+ *(.data.rel)
+ __datarelrolocal_start = .;
+ *(.data.rel.ro.local)
+ __datarellocal_start = .;
+ *(.data.rel.local)
+ __datarelro_start = .;
+ *(.data.rel.ro)
+ }
+ __got_start = .;
. = ALIGN(4);
.got : { *(.got) }
+ __got_end = .;
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
--
1.6.2.5
next prev parent reply other threads:[~2010-09-17 11:10 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-11 18:15 [U-Boot] [PATCH 00/26] arm: add full relocation / cache support Heiko Schocher
2010-08-11 20:00 ` Ben Gardiner
2010-08-11 20:36 ` Ben Gardiner
2010-08-11 20:01 ` Wolfgang Denk
2010-08-12 5:34 ` Heiko Schocher
2010-08-12 20:49 ` Magnus Lilja
2010-08-13 10:01 ` Wolfgang Denk
2010-08-12 12:50 ` Shinya Kuribayashi
2010-08-12 12:55 ` Shinya Kuribayashi
2010-08-12 20:19 ` Wolfgang Denk
2010-08-12 20:17 ` Wolfgang Denk
2010-08-13 14:36 ` Shinya Kuribayashi
2010-09-17 11:10 ` [U-Boot] [PATCH 00/26 v2][NEXT] " Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 01/26 v2][NEXT] arm: get rid of bi_env Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 02/26 v2][NEXT] ARM: cp15: setup mmu and enable dcache Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 03/26 v2][NEXT] ARM (ARM926ejs): add data cache support, tested on magnesium and tx25 board Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 04/26 v2][NEXT] ARM V7 (OMAP): add data cache support, test on Beagle board Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 05/26 v2][NEXT] ARM (ARM11): add data cache support, test on Qong board Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 06/26 v2][NEXT] relocation: fixup cmdtable Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 07/26 v2][NEXT] common: move TOTAL_MALLOC_LEN to include/common.h Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 08/26 v2][NEXT] i2c: fix command usage help Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 09/26 v2][NEXT] disk/part.c: fix relocation fixup Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 10/26 v2][NEXT] i2c, omap24xx: set bus_initialized only after relocation Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 11/26 v2][NEXT] nand_boot_fsl_nfc.c: make "nfc" a "static const" pointer Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 12/26 v2][NEXT] ARM: add relocation support Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 13/26 v2][NEXT] ARM: implement relocation for ARM11 Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 14/26 v2][NEXT] ARM: implement relocation for ARM V7 (OMAP) Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 15/26 v2][NEXT] ARM: implement relocation for ARM926 Heiko Schocher
2010-09-17 11:10 ` Heiko Schocher [this message]
2010-09-17 11:10 ` [U-Boot] [PATCH 17/26 v2][NEXT] ARM: implement relocation for ARM925 Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 18/26 v2][NEXT] ARM: implement relocation for ARM946 Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 19/26 v2][NEXT] ARM: implement relocation for pxa Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 20/26 v2][NEXT] ARM: implement relocation for ixp Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 21/26 v2][NEXT] ARM: implement relocation for sa1100 Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 22/26 v2][NEXT] ARM: implement relocation for s3c44b0 Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 23/26 v2][NEXT] ARM: implement relocation for lh7a40x Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 24/26 v2][NEXT] ARM: implement relocation for arm_intcm Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 25/26 v2][NEXT] ARM: implement relocation for arm720t Heiko Schocher
2010-09-17 11:10 ` [U-Boot] [PATCH 26/26 v2][NEXT] ARM: implement relocation for arm1176 Heiko Schocher
2010-09-22 9:32 ` [U-Boot] [PATCH 15/26 v2][NEXT] ARM: implement relocation for ARM926 Albert ARIBAUD
2010-09-17 21:40 ` [U-Boot] [PATCH 14/26 v2][NEXT] ARM: implement relocation for ARM V7 (OMAP) John Rigby
2010-09-17 22:02 ` Wolfgang Denk
2010-09-19 1:21 ` John Rigby
2010-09-19 6:07 ` Heiko Schocher
2010-09-19 6:59 ` Wolfgang Denk
2010-09-19 6:58 ` Wolfgang Denk
2010-09-17 13:07 ` [U-Boot] [PATCH 12/26 v2][NEXT] ARM: add relocation support Albert ARIBAUD
2010-09-17 14:54 ` Wolfgang Denk
2010-09-17 16:44 ` Albert ARIBAUD
2010-09-17 19:22 ` Wolfgang Denk
2010-09-17 22:58 ` Albert ARIBAUD
2010-09-18 22:35 ` Albert ARIBAUD
2010-09-18 22:58 ` Wolfgang Denk
2010-09-19 6:04 ` Heiko Schocher
2010-09-19 7:17 ` Albert ARIBAUD
2010-09-19 8:28 ` Albert ARIBAUD
2010-09-19 11:17 ` Wolfgang Denk
2010-09-19 11:56 ` Heiko Schocher
2010-09-18 23:19 ` [U-Boot] [PATCH 00/26 v2][NEXT] arm: add full relocation / cache support Wolfgang Denk
2010-09-22 17:51 ` Ben Gardiner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1284721853-8298-17-git-send-email-hs@denx.de \
--to=hs@denx.de \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.