From 9963a8216e12c2978b33ae1dd7233f4f78bfd0d2 Mon Sep 17 00:00:00 2001 From: Graeme Russ Date: Sat, 12 Feb 2011 15:11:26 +1100 Subject: x86: Fix mangled umlauts git mergetool has a nasty habit of mangling umlats - fix ones that have been missed in previous submissions --- arch/i386/lib/board.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'arch/i386/lib/board.c') diff --git a/arch/i386/lib/board.c b/arch/i386/lib/board.c index 30cb9a2..2cadce8 100644 --- a/arch/i386/lib/board.c +++ b/arch/i386/lib/board.c @@ -1,6 +1,6 @@ /* * (C) Copyright 2002 - * Daniel Engstr�m, Omicron Ceti AB, daniel@omicron.se + * Daniel Engström, Omicron Ceti AB, daniel@omicron.se * * (C) Copyright 2002 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. -- cgit v1.1 From 2e2613d2c4755426cb6bfddf1ca7714b0deec177 Mon Sep 17 00:00:00 2001 From: Graeme Russ Date: Sat, 12 Feb 2011 15:11:50 +1100 Subject: x86: Move initial gd to fixed location --- arch/i386/lib/board.c | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) (limited to 'arch/i386/lib/board.c') diff --git a/arch/i386/lib/board.c b/arch/i386/lib/board.c index 2cadce8..4227312 100644 --- a/arch/i386/lib/board.c +++ b/arch/i386/lib/board.c @@ -45,7 +45,15 @@ #include #endif -DECLARE_GLOBAL_DATA_PTR; +/* + * Pointer to initial global data area + * + * Here we initialize it. + */ +#undef XTRN_DECLARE_GLOBAL_DATA_PTR +#define XTRN_DECLARE_GLOBAL_DATA_PTR /* empty = allocate here */ +DECLARE_GLOBAL_DATA_PTR = (gd_t *) (CONFIG_SYS_INIT_GD_ADDR); + /* Exports from the Linker Script */ extern ulong __text_start; @@ -168,7 +176,7 @@ gd_t *gd; /* * Load U-Boot into RAM, initialize BSS, perform relocation adjustments */ -void board_init_f (ulong gdp) +void board_init_f(ulong mem_top) { void *text_start = &__text_start; void *data_end = &__data_end; @@ -187,11 +195,11 @@ void board_init_f (ulong gdp) Elf32_Rel *re_end; /* Calculate destination RAM Address and relocation offset */ - dest_addr = (void *)gdp - (bss_end - text_start); + dest_addr = (void *)mem_top - (bss_end - text_start); rel_offset = text_start - dest_addr; /* Perform low-level initialization only when cold booted */ - if (((gd_t *)gdp)->flags & GD_FLG_COLD_BOOT) { + if (gd->flags & GD_FLG_COLD_BOOT) { /* First stage CPU initialization */ if (cpu_init_f() != 0) hang(); @@ -203,8 +211,8 @@ void board_init_f (ulong gdp) /* Copy U-Boot into RAM */ dst_addr = (ulong *)dest_addr; - src_addr = (ulong *)(text_start + ((gd_t *)gdp)->load_off); - end_addr = (ulong *)(data_end + ((gd_t *)gdp)->load_off); + src_addr = (ulong *)(text_start + gd->load_off); + end_addr = (ulong *)(data_end + gd->load_off); while (src_addr < end_addr) *dst_addr++ = *src_addr++; @@ -217,8 +225,8 @@ void board_init_f (ulong gdp) *dst_addr++ = 0x00000000; /* Perform relocation adjustments */ - re_src = (Elf32_Rel *)(rel_dyn_start + ((gd_t *)gdp)->load_off); - re_end = (Elf32_Rel *)(rel_dyn_end + ((gd_t *)gdp)->load_off); + re_src = (Elf32_Rel *)(rel_dyn_start + gd->load_off); + re_end = (Elf32_Rel *)(rel_dyn_end + gd->load_off); do { if (re_src->r_offset >= CONFIG_SYS_TEXT_BASE) @@ -226,11 +234,11 @@ void board_init_f (ulong gdp) *(Elf32_Addr *)(re_src->r_offset - rel_offset) -= rel_offset; } while (re_src++ < re_end); - ((gd_t *)gdp)->reloc_off = rel_offset; - ((gd_t *)gdp)->flags |= GD_FLG_RELOC; + gd->reloc_off = rel_offset; + gd->flags |= GD_FLG_RELOC; /* Enter the relocated U-Boot! */ - (board_init_r - rel_offset)((gd_t *)gdp, (ulong)dest_addr); + (board_init_r - rel_offset)(gd, (ulong)dest_addr); /* NOTREACHED - board_init_f() does not return */ while(1); @@ -242,11 +250,15 @@ void board_init_r(gd_t *id, ulong dest_addr) int i; ulong size; static bd_t bd_data; + static gd_t gd_data; init_fnc_t **init_fnc_ptr; show_boot_progress(0x21); - gd = id; + /* Global data pointer is now writable */ + gd = &gd_data; + memcpy(gd, id, sizeof(gd_t)); + /* compiler optimization barrier needed for GCC >= 3.4 */ __asm__ __volatile__("": : :"memory"); -- cgit v1.1 From 96cd66426a6a615373f7f33fb2a8b7ee3925b1cf Mon Sep 17 00:00:00 2001 From: Graeme Russ Date: Sat, 12 Feb 2011 15:11:54 +1100 Subject: sc520: Move RAM sizing code from asm to C --- arch/i386/lib/board.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'arch/i386/lib/board.c') diff --git a/arch/i386/lib/board.c b/arch/i386/lib/board.c index 4227312..d716232 100644 --- a/arch/i386/lib/board.c +++ b/arch/i386/lib/board.c @@ -176,7 +176,7 @@ gd_t *gd; /* * Load U-Boot into RAM, initialize BSS, perform relocation adjustments */ -void board_init_f(ulong mem_top) +void board_init_f(ulong boot_flags) { void *text_start = &__text_start; void *data_end = &__data_end; @@ -194,8 +194,12 @@ void board_init_f(ulong mem_top) Elf32_Rel *re_src; Elf32_Rel *re_end; + gd->flags = boot_flags; + /* Calculate destination RAM Address and relocation offset */ - dest_addr = (void *)mem_top - (bss_end - text_start); + dest_addr = (void *)gd->ram_size; + dest_addr -= CONFIG_SYS_STACK_SIZE; + dest_addr -= (bss_end - text_start); rel_offset = text_start - dest_addr; /* Perform low-level initialization only when cold booted */ -- cgit v1.1 From fb0029088e5b9d3f31870715ad23dda4a2c6e7f3 Mon Sep 17 00:00:00 2001 From: Graeme Russ Date: Sat, 12 Feb 2011 15:11:58 +1100 Subject: x86: Defer setup of final stack --- arch/i386/lib/board.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'arch/i386/lib/board.c') diff --git a/arch/i386/lib/board.c b/arch/i386/lib/board.c index d716232..60fa982 100644 --- a/arch/i386/lib/board.c +++ b/arch/i386/lib/board.c @@ -189,6 +189,7 @@ void board_init_f(ulong boot_flags) ulong *src_addr; ulong *end_addr; + void *addr_sp; void *dest_addr; ulong rel_offset; Elf32_Rel *re_src; @@ -198,6 +199,7 @@ void board_init_f(ulong boot_flags) /* Calculate destination RAM Address and relocation offset */ dest_addr = (void *)gd->ram_size; + addr_sp = dest_addr; dest_addr -= CONFIG_SYS_STACK_SIZE; dest_addr -= (bss_end - text_start); rel_offset = text_start - dest_addr; @@ -242,9 +244,9 @@ void board_init_f(ulong boot_flags) gd->flags |= GD_FLG_RELOC; /* Enter the relocated U-Boot! */ - (board_init_r - rel_offset)(gd, (ulong)dest_addr); + relocate_code((ulong)addr_sp, gd, (ulong)dest_addr); - /* NOTREACHED - board_init_f() does not return */ + /* NOTREACHED - relocate_code() does not return */ while(1); } -- cgit v1.1 From c869e2ac46a7a8ca00d1fd24c6399ca8e256e244 Mon Sep 17 00:00:00 2001 From: Graeme Russ Date: Sat, 12 Feb 2011 15:11:59 +1100 Subject: x86: Move call to dram_init_f into board_init_f --- arch/i386/lib/board.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'arch/i386/lib/board.c') diff --git a/arch/i386/lib/board.c b/arch/i386/lib/board.c index 60fa982..0b26c83 100644 --- a/arch/i386/lib/board.c +++ b/arch/i386/lib/board.c @@ -197,6 +197,9 @@ void board_init_f(ulong boot_flags) gd->flags = boot_flags; + if (dram_init_f() != 0) + hang(); + /* Calculate destination RAM Address and relocation offset */ dest_addr = (void *)gd->ram_size; addr_sp = dest_addr; -- cgit v1.1 From bf6af154a48a19d29c17cd35dd78a61bc045026f Mon Sep 17 00:00:00 2001 From: Graeme Russ Date: Sat, 12 Feb 2011 15:12:01 +1100 Subject: x86: Move test for cold boot into init functions --- arch/i386/lib/board.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'arch/i386/lib/board.c') diff --git a/arch/i386/lib/board.c b/arch/i386/lib/board.c index 0b26c83..1fd422f 100644 --- a/arch/i386/lib/board.c +++ b/arch/i386/lib/board.c @@ -207,16 +207,13 @@ void board_init_f(ulong boot_flags) dest_addr -= (bss_end - text_start); rel_offset = text_start - dest_addr; - /* Perform low-level initialization only when cold booted */ - if (gd->flags & GD_FLG_COLD_BOOT) { - /* First stage CPU initialization */ - if (cpu_init_f() != 0) - hang(); - - /* First stage Board initialization */ - if (board_early_init_f() != 0) - hang(); - } + /* First stage CPU initialization */ + if (cpu_init_f() != 0) + hang(); + + /* First stage Board initialization */ + if (board_early_init_f() != 0) + hang(); /* Copy U-Boot into RAM */ dst_addr = (ulong *)dest_addr; -- cgit v1.1 From 0b2378557c66f97449fe899d51171819599cfc1b Mon Sep 17 00:00:00 2001 From: Graeme Russ Date: Sat, 12 Feb 2011 15:12:03 +1100 Subject: x86: Move console initialisation into board_init_f --- arch/i386/lib/board.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'arch/i386/lib/board.c') diff --git a/arch/i386/lib/board.c b/arch/i386/lib/board.c index 1fd422f..32f013a 100644 --- a/arch/i386/lib/board.c +++ b/arch/i386/lib/board.c @@ -162,9 +162,6 @@ init_fnc_t *init_sequence[] = { dram_init, /* configure available RAM banks */ interrupt_init, /* set up exceptions */ timer_init, - env_init, /* initialize environment */ - init_baudrate, /* initialze baudrate settings */ - serial_init, /* serial communications setup */ display_banner, display_dram_config, @@ -197,6 +194,18 @@ void board_init_f(ulong boot_flags) gd->flags = boot_flags; + if (env_init() != 0) + hang(); + + if (init_baudrate() != 0) + hang(); + + if (serial_init() != 0) + hang(); + + if (console_init_f() != 0) + hang(); + if (dram_init_f() != 0) hang(); -- cgit v1.1 From 5fed82110dff2d378e0a50787dcd1a96d83c3c5b Mon Sep 17 00:00:00 2001 From: Graeme Russ Date: Sat, 12 Feb 2011 15:12:05 +1100 Subject: x86: Fix incorrect usage of relocation offset x86 has always used relocation offset in the opposite sense to the ELF standard - Fix this --- arch/i386/lib/board.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'arch/i386/lib/board.c') diff --git a/arch/i386/lib/board.c b/arch/i386/lib/board.c index 32f013a..8ec0446 100644 --- a/arch/i386/lib/board.c +++ b/arch/i386/lib/board.c @@ -214,7 +214,7 @@ void board_init_f(ulong boot_flags) addr_sp = dest_addr; dest_addr -= CONFIG_SYS_STACK_SIZE; dest_addr -= (bss_end - text_start); - rel_offset = text_start - dest_addr; + rel_offset = dest_addr - text_start; /* First stage CPU initialization */ if (cpu_init_f() != 0) @@ -233,8 +233,8 @@ void board_init_f(ulong boot_flags) *dst_addr++ = *src_addr++; /* Clear BSS */ - dst_addr = (ulong *)(bss_start - rel_offset); - end_addr = (ulong *)(bss_end - rel_offset); + dst_addr = (ulong *)(bss_start + rel_offset); + end_addr = (ulong *)(bss_end + rel_offset); while (dst_addr < end_addr) *dst_addr++ = 0x00000000; @@ -245,8 +245,8 @@ void board_init_f(ulong boot_flags) do { if (re_src->r_offset >= CONFIG_SYS_TEXT_BASE) - if (*(Elf32_Addr *)(re_src->r_offset - rel_offset) >= CONFIG_SYS_TEXT_BASE) - *(Elf32_Addr *)(re_src->r_offset - rel_offset) -= rel_offset; + if (*(Elf32_Addr *)(re_src->r_offset + rel_offset) >= CONFIG_SYS_TEXT_BASE) + *(Elf32_Addr *)(re_src->r_offset + rel_offset) += rel_offset; } while (re_src++ < re_end); gd->reloc_off = rel_offset; -- cgit v1.1 From 71a5404974602109e49796c98be5ca073c818e46 Mon Sep 17 00:00:00 2001 From: Graeme Russ Date: Sat, 12 Feb 2011 15:12:06 +1100 Subject: x86: Split board_init_f() into init_fnc_t compatible functions --- arch/i386/lib/board.c | 111 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 45 deletions(-) (limited to 'arch/i386/lib/board.c') diff --git a/arch/i386/lib/board.c b/arch/i386/lib/board.c index 8ec0446..c13efc8 100644 --- a/arch/i386/lib/board.c +++ b/arch/i386/lib/board.c @@ -170,30 +170,71 @@ init_fnc_t *init_sequence[] = { gd_t *gd; -/* - * Load U-Boot into RAM, initialize BSS, perform relocation adjustments - */ -void board_init_f(ulong boot_flags) +static int calculate_relocation_address(void) { void *text_start = &__text_start; - void *data_end = &__data_end; - void *rel_dyn_start = &__rel_dyn_start; - void *rel_dyn_end = &__rel_dyn_end; + void *bss_end = &__bss_end; + void *dest_addr; + ulong rel_offset; + + /* Calculate destination RAM Address and relocation offset */ + dest_addr = (void *)gd->ram_size; + dest_addr -= CONFIG_SYS_STACK_SIZE; + dest_addr -= (bss_end - text_start); + rel_offset = dest_addr - text_start; + + gd->start_addr_sp = gd->ram_size; + gd->relocaddr = (ulong)dest_addr; + gd->reloc_off = rel_offset; + + return 0; +} + +static int copy_uboot_to_ram(void) +{ + ulong *dst_addr = (ulong *)gd->relocaddr; + ulong *src_addr = (ulong *)&__text_start; + ulong *end_addr = (ulong *)&__data_end; + + while (src_addr < end_addr) + *dst_addr++ = *src_addr++; + + return 0; +} + +static int clear_bss(void) +{ void *bss_start = &__bss_start; void *bss_end = &__bss_end; - ulong *dst_addr; - ulong *src_addr; - ulong *end_addr; + ulong *dst_addr = (ulong *)(bss_start + gd->reloc_off); + ulong *end_addr = (ulong *)(bss_end + gd->reloc_off);; - void *addr_sp; - void *dest_addr; - ulong rel_offset; - Elf32_Rel *re_src; - Elf32_Rel *re_end; + while (dst_addr < end_addr) + *dst_addr++ = 0x00000000; + + return 0; +} - gd->flags = boot_flags; +static int do_elf_reloc_fixups(void) +{ + Elf32_Rel *re_src = (Elf32_Rel *)(&__rel_dyn_start); + Elf32_Rel *re_end = (Elf32_Rel *)(&__rel_dyn_end); + + do { + if (re_src->r_offset >= CONFIG_SYS_TEXT_BASE) + if (*(Elf32_Addr *)(re_src->r_offset + gd->reloc_off) >= CONFIG_SYS_TEXT_BASE) + *(Elf32_Addr *)(re_src->r_offset + gd->reloc_off) += gd->reloc_off; + } while (re_src++ < re_end); + + return 0; +} +/* + * Load U-Boot into RAM, initialize BSS, perform relocation adjustments + */ +void board_init_f(ulong boot_flags) +{ if (env_init() != 0) hang(); @@ -209,12 +250,8 @@ void board_init_f(ulong boot_flags) if (dram_init_f() != 0) hang(); - /* Calculate destination RAM Address and relocation offset */ - dest_addr = (void *)gd->ram_size; - addr_sp = dest_addr; - dest_addr -= CONFIG_SYS_STACK_SIZE; - dest_addr -= (bss_end - text_start); - rel_offset = dest_addr - text_start; + if (calculate_relocation_address() != 0) + hang(); /* First stage CPU initialization */ if (cpu_init_f() != 0) @@ -225,35 +262,19 @@ void board_init_f(ulong boot_flags) hang(); /* Copy U-Boot into RAM */ - dst_addr = (ulong *)dest_addr; - src_addr = (ulong *)(text_start + gd->load_off); - end_addr = (ulong *)(data_end + gd->load_off); - - while (src_addr < end_addr) - *dst_addr++ = *src_addr++; - - /* Clear BSS */ - dst_addr = (ulong *)(bss_start + rel_offset); - end_addr = (ulong *)(bss_end + rel_offset); - - while (dst_addr < end_addr) - *dst_addr++ = 0x00000000; + if (copy_uboot_to_ram() != 0) + hang(); - /* Perform relocation adjustments */ - re_src = (Elf32_Rel *)(rel_dyn_start + gd->load_off); - re_end = (Elf32_Rel *)(rel_dyn_end + gd->load_off); + if (clear_bss() != 0) + hang(); - do { - if (re_src->r_offset >= CONFIG_SYS_TEXT_BASE) - if (*(Elf32_Addr *)(re_src->r_offset + rel_offset) >= CONFIG_SYS_TEXT_BASE) - *(Elf32_Addr *)(re_src->r_offset + rel_offset) += rel_offset; - } while (re_src++ < re_end); + if (do_elf_reloc_fixups() != 0) + hang(); - gd->reloc_off = rel_offset; gd->flags |= GD_FLG_RELOC; /* Enter the relocated U-Boot! */ - relocate_code((ulong)addr_sp, gd, (ulong)dest_addr); + relocate_code(gd->start_addr_sp, gd, gd->relocaddr); /* NOTREACHED - relocate_code() does not return */ while(1); -- cgit v1.1 From a3824142e764c2d85a6bda54c726f8bb07b28935 Mon Sep 17 00:00:00 2001 From: Graeme Russ Date: Sat, 12 Feb 2011 15:12:08 +1100 Subject: x86: Rearrange function calls in board_init_f --- arch/i386/lib/board.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'arch/i386/lib/board.c') diff --git a/arch/i386/lib/board.c b/arch/i386/lib/board.c index c13efc8..b33dd42 100644 --- a/arch/i386/lib/board.c +++ b/arch/i386/lib/board.c @@ -235,6 +235,14 @@ static int do_elf_reloc_fixups(void) */ void board_init_f(ulong boot_flags) { + /* First stage CPU initialization */ + if (cpu_init_f() != 0) + hang(); + + /* First stage Board initialization */ + if (board_early_init_f() != 0) + hang(); + if (env_init() != 0) hang(); @@ -253,14 +261,6 @@ void board_init_f(ulong boot_flags) if (calculate_relocation_address() != 0) hang(); - /* First stage CPU initialization */ - if (cpu_init_f() != 0) - hang(); - - /* First stage Board initialization */ - if (board_early_init_f() != 0) - hang(); - /* Copy U-Boot into RAM */ if (copy_uboot_to_ram() != 0) hang(); -- cgit v1.1 From e4f78d78d7b710243c9953cc86fd75055d59ebf9 Mon Sep 17 00:00:00 2001 From: Graeme Russ Date: Sat, 12 Feb 2011 15:12:10 +1100 Subject: x86: Convert board_init_f to use an init_sequence --- arch/i386/lib/board.c | 70 +++++++++++++++++++++------------------------------ 1 file changed, 29 insertions(+), 41 deletions(-) (limited to 'arch/i386/lib/board.c') diff --git a/arch/i386/lib/board.c b/arch/i386/lib/board.c index b33dd42..e0f9803 100644 --- a/arch/i386/lib/board.c +++ b/arch/i386/lib/board.c @@ -156,7 +156,28 @@ static void display_flash_config (ulong size) */ typedef int (init_fnc_t) (void); -init_fnc_t *init_sequence[] = { +static int calculate_relocation_address(void); +static int copy_uboot_to_ram(void); +static int clear_bss(void); +static int do_elf_reloc_fixups(void); + +init_fnc_t *init_sequence_f[] = { + cpu_init_f, + board_early_init_f, + env_init, + init_baudrate, + serial_init, + console_init_f, + dram_init_f, + calculate_relocation_address, + copy_uboot_to_ram, + clear_bss, + do_elf_reloc_fixups, + + NULL, +}; + +init_fnc_t *init_sequence_r[] = { cpu_init_r, /* basic cpu dependent setup */ board_early_init_r, /* basic board dependent setup */ dram_init, /* configure available RAM banks */ @@ -235,41 +256,12 @@ static int do_elf_reloc_fixups(void) */ void board_init_f(ulong boot_flags) { - /* First stage CPU initialization */ - if (cpu_init_f() != 0) - hang(); - - /* First stage Board initialization */ - if (board_early_init_f() != 0) - hang(); - - if (env_init() != 0) - hang(); - - if (init_baudrate() != 0) - hang(); - - if (serial_init() != 0) - hang(); - - if (console_init_f() != 0) - hang(); - - if (dram_init_f() != 0) - hang(); - - if (calculate_relocation_address() != 0) - hang(); - - /* Copy U-Boot into RAM */ - if (copy_uboot_to_ram() != 0) - hang(); - - if (clear_bss() != 0) - hang(); + init_fnc_t **init_fnc_ptr; - if (do_elf_reloc_fixups() != 0) - hang(); + for (init_fnc_ptr = init_sequence_f; *init_fnc_ptr; ++init_fnc_ptr) { + if ((*init_fnc_ptr)() != 0) + hang(); + } gd->flags |= GD_FLG_RELOC; @@ -283,7 +275,6 @@ void board_init_f(ulong boot_flags) void board_init_r(gd_t *id, ulong dest_addr) { char *s; - int i; ulong size; static bd_t bd_data; static gd_t gd_data; @@ -307,12 +298,9 @@ void board_init_r(gd_t *id, ulong dest_addr) mem_malloc_init((((ulong)dest_addr - CONFIG_SYS_MALLOC_LEN)+3)&~3, CONFIG_SYS_MALLOC_LEN); - for (init_fnc_ptr = init_sequence, i=0; *init_fnc_ptr; ++init_fnc_ptr, i++) { - show_boot_progress(0xa130|i); - - if ((*init_fnc_ptr)() != 0) { + for (init_fnc_ptr = init_sequence_r; *init_fnc_ptr; ++init_fnc_ptr) { + if ((*init_fnc_ptr)() != 0) hang (); - } } show_boot_progress(0x23); -- cgit v1.1