All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches)
@ 2012-01-02  4:09 Graeme Russ
  2012-01-02  4:09 ` [U-Boot] [PATCH 01/17] x86: Import glibc memcpy implementation Graeme Russ
                   ` (16 more replies)
  0 siblings, 17 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot

Happy New Year!

I was thinking I would do another RFC, but instead I pulled an all-nighter
to get this series cleaned up ready for mainline

There a two major architectural changes introduced by this series:

 - The global data pointer is converted to a psuedo register implementation
   which allows global data to be access pre and post relocations like all
   other aches
 - The init sequences in board.c are reduced to be purely to loops which
   execute arrays of init functions

All patches are checkpatch clean

Series is rebased to commit bfcc40bb09b05c90cc3b1496abb270eb8aa72134
(Merge branch 'next' of ../next)

Regards,

Graeme

Graeme Russ (17):
  x86: Import glibc memcpy implementation
  x86: Speed up copy-to-RAM and clear BSS operations
  x86: Remove GDR related magic numbers
  x86: Rework Global Descriptor Table loading
  x86: Simplify Flash-to-RAM code execution transition
  x86: Rework relocation calcuations
  x86: Use fs for global data
  x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot
  x86: Create weak init_cache() function
  x86: Allow cache before copy to RAM
  CHECKPATCH: arch/x86/cpu/*
  CHECKPATCH: arch/x86/lib/*
  x86: Move do_go_exec() out of board.c
  x86: Move setup_pcat_compatibility() out of board.c
  x86: Move relocation code out of board.c
  x86: Simplify board.c
  x86: Tweak initialisation procedure

 arch/x86/cpu/cpu.c                   |  107 ++++++---
 arch/x86/cpu/interrupts.c            |    2 +-
 arch/x86/cpu/start.S                 |   31 +--
 arch/x86/cpu/start16.S               |   57 ++++-
 arch/x86/include/asm/global_data.h   |   21 +-
 arch/x86/include/asm/init_helpers.h  |   43 +++
 arch/x86/include/asm/init_wrappers.h |   42 +++
 arch/x86/include/asm/processor.h     |   12 +-
 arch/x86/include/asm/relocate.h      |   33 +++
 arch/x86/include/asm/string.h        |    2 +-
 arch/x86/include/asm/u-boot-x86.h    |    5 +
 arch/x86/lib/Makefile                |    4 +
 arch/x86/lib/bios.S                  |  134 ++++++----
 arch/x86/lib/board.c                 |  474 +++++++++-------------------------
 arch/x86/lib/cmd_boot.c              |   64 +++++
 arch/x86/lib/init_helpers.c          |  210 +++++++++++++++
 arch/x86/lib/init_wrappers.c         |  137 ++++++++++
 arch/x86/lib/realmode_switch.S       |   61 +++--
 arch/x86/lib/relocate.c              |   91 +++++++
 arch/x86/lib/string.c                |   61 +++++
 arch/x86/lib/zimage.c                |    7 +
 21 files changed, 1099 insertions(+), 499 deletions(-)
 create mode 100644 arch/x86/include/asm/init_helpers.h
 create mode 100644 arch/x86/include/asm/init_wrappers.h
 create mode 100644 arch/x86/include/asm/relocate.h
 create mode 100644 arch/x86/lib/cmd_boot.c
 create mode 100644 arch/x86/lib/init_helpers.c
 create mode 100644 arch/x86/lib/init_wrappers.c
 create mode 100644 arch/x86/lib/relocate.c

--
1.7.5.2.317.g391b14

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 01/17] x86: Import glibc memcpy implementation
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:18   ` Simon Glass
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
  2012-01-02  4:09 ` [U-Boot] [PATCH 02/17] x86: Speed up copy-to-RAM and clear BSS operations Graeme Russ
                   ` (15 subsequent siblings)
  16 siblings, 2 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot

Taken from glibc version 2.14.90

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/include/asm/string.h |    2 +-
 arch/x86/lib/string.c         |   61 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+), 1 deletions(-)

diff --git a/arch/x86/include/asm/string.h b/arch/x86/include/asm/string.h
index 3aa6c11..0ad612f 100644
--- a/arch/x86/include/asm/string.h
+++ b/arch/x86/include/asm/string.h
@@ -14,7 +14,7 @@ extern char * strrchr(const char * s, int c);
 #undef __HAVE_ARCH_STRCHR
 extern char * strchr(const char * s, int c);
 
-#undef __HAVE_ARCH_MEMCPY
+#define __HAVE_ARCH_MEMCPY
 extern void * memcpy(void *, const void *, __kernel_size_t);
 
 #undef __HAVE_ARCH_MEMMOVE
diff --git a/arch/x86/lib/string.c b/arch/x86/lib/string.c
index f2ea7e4..1fde81b 100644
--- a/arch/x86/lib/string.c
+++ b/arch/x86/lib/string.c
@@ -85,3 +85,64 @@ void *memset(void *dstpp, int c, size_t len)
 
 	return dstpp;
 }
+
+#define	OP_T_THRES	8
+#define OPSIZ	(sizeof(op_t))
+
+#define BYTE_COPY_FWD(dst_bp, src_bp, nbytes)				  \
+do {									  \
+	int __d0;							  \
+	asm volatile(							  \
+		/* Clear the direction flag, so copying goes forward.  */ \
+		"cld\n"							  \
+		/* Copy bytes.  */					  \
+		"rep\n"							  \
+		"movsb" :						  \
+		"=D" (dst_bp), "=S" (src_bp), "=c" (__d0) :		  \
+		"0" (dst_bp), "1" (src_bp), "2" (nbytes) :		  \
+		"memory");						  \
+} while (0)
+
+#define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes)		  \
+do {									  \
+	int __d0;							  \
+	asm volatile(							  \
+		/* Clear the direction flag, so copying goes forward.  */ \
+		"cld\n"							  \
+		/* Copy longwords.  */					  \
+		"rep\n"							  \
+		"movsl" :						  \
+		"=D" (dst_bp), "=S" (src_bp), "=c" (__d0) :		  \
+		"0" (dst_bp), "1" (src_bp), "2" ((nbytes) / 4) :	  \
+		"memory");						  \
+	(nbytes_left) = (nbytes) % 4;					  \
+} while (0)
+
+void *memcpy(void *dstpp, const void *srcpp, size_t len)
+{
+	unsigned long int dstp = (long int)dstpp;
+	unsigned long int srcp = (long int)srcpp;
+
+	/* Copy from the beginning to the end.  */
+
+	/* If there not too few bytes to copy, use word copy.  */
+	if (len >= OP_T_THRES) {
+		/* Copy just a few bytes to make DSTP aligned.  */
+		len -= (-dstp) % OPSIZ;
+		BYTE_COPY_FWD(dstp, srcp, (-dstp) % OPSIZ);
+
+		/* Copy from SRCP to DSTP taking advantage of the known
+		 * alignment of DSTP.  Number of bytes remaining is put
+		 * in the third argument, i.e. in LEN.  This number may
+		 * vary from machine to machine.
+		 */
+		WORD_COPY_FWD(dstp, srcp, len, len);
+
+		/* Fall out and copy the tail.  */
+	}
+
+	/* There are just a few bytes to copy. Use byte memory operations. */
+	BYTE_COPY_FWD(dstp, srcp, len);
+
+	return dstpp;
+}
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 02/17] x86: Speed up copy-to-RAM and clear BSS operations
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
  2012-01-02  4:09 ` [U-Boot] [PATCH 01/17] x86: Import glibc memcpy implementation Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:21   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 03/17] x86: Remove GDR related magic numbers Graeme Russ
                   ` (14 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot

The implementations of memcpy and memset are now the optimised versions
from glibc, so use them instead of simple copy loops

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/lib/board.c |   17 +++++------------
 1 files changed, 5 insertions(+), 12 deletions(-)

diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index d742fec..ba6b59f 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -188,26 +188,19 @@ static int calculate_relocation_address(void)
 
 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;
+	size_t len = (size_t)(&__data_end) - (size_t)(&__text_start);
 
-	while (src_addr < end_addr)
-		*dst_addr++ = *src_addr++;
+	memcpy((void *)gd->relocaddr, (void *)&__text_start, len);
 
 	return 0;
 }
 
 static int clear_bss(void)
 {
-	void *bss_start = &__bss_start;
-	void *bss_end = &__bss_end;
+	ulong dst_addr = (ulong)(&__bss_start) + gd->reloc_off;
+	size_t len = (size_t)(&__bss_end) - (size_t)(&__bss_start);
 
-	ulong *dst_addr = (ulong *)(bss_start + gd->reloc_off);
-	ulong *end_addr = (ulong *)(bss_end + gd->reloc_off);
-
-	while (dst_addr < end_addr)
-		*dst_addr++ = 0x00000000;
+	memset((void *)dst_addr, 0x00, len);
 
 	return 0;
 }
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 03/17] x86: Remove GDR related magic numbers
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
  2012-01-02  4:09 ` [U-Boot] [PATCH 01/17] x86: Import glibc memcpy implementation Graeme Russ
  2012-01-02  4:09 ` [U-Boot] [PATCH 02/17] x86: Speed up copy-to-RAM and clear BSS operations Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:23   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 04/17] x86: Rework Global Descriptor Table loading Graeme Russ
                   ` (13 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/cpu/start.S             |    3 ++-
 arch/x86/include/asm/processor.h |    6 +++++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
index f87633b..7f9b6a7 100644
--- a/arch/x86/cpu/start.S
+++ b/arch/x86/cpu/start.S
@@ -29,6 +29,7 @@
 #include <config.h>
 #include <version.h>
 #include <asm/global_data.h>
+#include <asm/processor.h>
 #include <asm/processor-flags.h>
 #include <generated/asm-offsets.h>
 
@@ -58,7 +59,7 @@ _start:
 	/* This is the 32-bit cold-reset entry point */
 
 	/* Load the segement registes to match the gdt loaded in start16.S */
-	movl	$0x18, %eax
+	movl	$(GDT_ENTRY_32BIT_DS * 8), %eax
 	movw	%ax, %fs
 	movw	%ax, %ds
 	movw	%ax, %gs
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 1e5dccd..203c63a 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -24,9 +24,13 @@
 #ifndef __ASM_PROCESSOR_H_
 #define __ASM_PROCESSOR_H_ 1
 
-#define GDT_ENTRY_32BIT_CS	2
+#define GDT_ENTRY_NULL		0
+#define GDT_ENTRY_UNUSED	(GDT_ENTRY_NULL + 1)
+#define GDT_ENTRY_32BIT_CS	(GDT_ENTRY_UNUSED + 1)
 #define GDT_ENTRY_32BIT_DS	(GDT_ENTRY_32BIT_CS + 1)
 #define GDT_ENTRY_16BIT_CS	(GDT_ENTRY_32BIT_DS + 1)
 #define GDT_ENTRY_16BIT_DS	(GDT_ENTRY_16BIT_CS + 1)
 
+#define GDT_NUM_ENTRIES		(GDT_ENTRY_16BIT_DS + 1)
+
 #endif
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 04/17] x86: Rework Global Descriptor Table loading
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (2 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 03/17] x86: Remove GDR related magic numbers Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:24   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 05/17] x86: Simplify Flash-to-RAM code execution transition Graeme Russ
                   ` (12 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/cpu/cpu.c |   82 +++++++++++++++++++++++++++++++++------------------
 1 files changed, 53 insertions(+), 29 deletions(-)

diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index 61d0b69..bf55c26 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -55,35 +55,39 @@ struct gdt_ptr {
 	u32 ptr;
 } __packed;
 
-static void reload_gdt(void)
+static void load_ds(u32 segment)
 {
-	/*
-	 * There are machines which are known to not boot with the GDT
-	 * being 8-byte unaligned.  Intel recommends 16 byte alignment
-	 */
-	static const u64 boot_gdt[] __attribute__((aligned(16))) = {
-		/* CS: code, read/execute, 4 GB, base 0 */
-		[GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
-		/* DS: data, read/write, 4 GB, base 0 */
-		[GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
-		/* 16-bit CS: code, read/execute, 64 kB, base 0 */
-		[GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
-		/* 16-bit DS: data, read/write, 64 kB, base 0 */
-		[GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
-	};
-	static struct gdt_ptr gdt;
-
-	gdt.len = sizeof(boot_gdt)-1;
-	gdt.ptr = (u32)&boot_gdt;
-
-	asm volatile("lgdtl %0\n" \
-		     "movl $((2+1)*8), %%ecx\n" \
-		     "movl %%ecx, %%ds\n" \
-		     "movl %%ecx, %%es\n" \
-		     "movl %%ecx, %%fs\n" \
-		     "movl %%ecx, %%gs\n" \
-		     "movl %%ecx, %%ss" \
-		     : : "m" (gdt) : "ecx");
+	asm volatile("movl %0, %%ds" : : "r" (segment * 8));
+}
+
+static void load_es(u32 segment)
+{
+	asm volatile("movl %0, %%es" : : "r" (segment * 8));
+}
+
+static void load_fs(u32 segment)
+{
+	asm volatile("movl %0, %%fs" : : "r" (segment * 8));
+}
+
+static void load_gs(u32 segment)
+{
+	asm volatile("movl %0, %%gs" : : "r" (segment * 8));
+}
+
+static void load_ss(u32 segment)
+{
+	asm volatile("movl %0, %%ss" : : "r" (segment * 8));
+}
+
+static void load_gdt(const u64 *boot_gdt, u16 num_entries)
+{
+	struct gdt_ptr gdt;
+
+	gdt.len = (num_entries * 8) - 1;
+	gdt.ptr = (u32)boot_gdt;
+
+	asm volatile("lgdtl %0\n" : : "m" (gdt));
 }
 
 int x86_cpu_init_f(void)
@@ -113,7 +117,27 @@ int x86_cpu_init_r(void)
 	    "movl	%%eax, %%cr0\n"
 	    "wbinvd\n" : : "i" (nw_cd_rst) : "eax");
 
-	reload_gdt();
+	/*
+	 * There are machines which are known to not boot with the GDT
+	 * being 8-byte unaligned. Intel recommends 16 byte alignment
+	 */
+	static const u64 boot_gdt[] __aligned(16) = {
+		/* CS: code, read/execute, 4 GB, base 0 */
+		[GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
+		/* DS: data, read/write, 4 GB, base 0 */
+		[GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
+		/* 16-bit CS: code, read/execute, 64 kB, base 0 */
+		[GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
+		/* 16-bit DS: data, read/write, 64 kB, base 0 */
+		[GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
+	};
+
+	load_gdt(boot_gdt, GDT_NUM_ENTRIES);
+	load_ds(GDT_ENTRY_32BIT_DS);
+	load_es(GDT_ENTRY_32BIT_DS);
+	load_fs(GDT_ENTRY_32BIT_DS);
+	load_gs(GDT_ENTRY_32BIT_DS);
+	load_ss(GDT_ENTRY_32BIT_DS);
 
 	/* Initialize core interrupt and exception functionality of CPU */
 	cpu_init_interrupts();
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 05/17] x86: Simplify Flash-to-RAM code execution transition
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (3 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 04/17] x86: Rework Global Descriptor Table loading Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:28   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 06/17] x86: Rework relocation calcuations Graeme Russ
                   ` (11 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/cpu/start.S              |   20 +++++---------------
 arch/x86/include/asm/u-boot-x86.h |    2 ++
 arch/x86/lib/board.c              |   25 ++++++++++++++++++++++---
 3 files changed, 29 insertions(+), 18 deletions(-)

diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
index 7f9b6a7..9592158 100644
--- a/arch/x86/cpu/start.S
+++ b/arch/x86/cpu/start.S
@@ -96,32 +96,22 @@ car_init_ret:
 	movw	$0x85, %ax
 	jmp	die
 
-.globl relocate_code
-.type relocate_code, @function
-relocate_code:
+.globl board_init_f_r_trampoline
+.type board_init_f_r_trampoline, @function
+board_init_f_r_trampoline:
 	/*
 	 * SDRAM has been initialised, U-Boot code has been copied into
 	 * RAM, BSS has been cleared and relocation adjustments have been
 	 * made. It is now time to jump into the in-RAM copy of U-Boot
 	 *
 	 * %eax = Address of top of stack
-	 * %edx = Address of Global Data
-	 * %ecx = Base address of in-RAM copy of U-Boot
 	 */
 
 	/* Setup stack in RAM */
 	movl	%eax, %esp
 
-	/* Setup call address of in-RAM copy of board_init_r() */
-	movl	$board_init_r, %ebp
-	addl	(GENERATED_GD_RELOC_OFF)(%edx), %ebp
-
-	/* Setup parameters to board_init_r() */
-	movl	%edx, %eax
-	movl	%ecx, %edx
-
-	/* Jump to in-RAM copy of board_init_r() */
-	call	*%ebp
+	/* Re-enter U-Boot by calling board_init_f_r */
+	call	board_init_f_r
 
 die:
 	hlt
diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
index 755f88a..c3d2277 100644
--- a/arch/x86/include/asm/u-boot-x86.h
+++ b/arch/x86/include/asm/u-boot-x86.h
@@ -61,5 +61,7 @@ u32 isa_map_rom(u32 bus_addr, int size);
 int video_bios_init(void);
 int video_init(void);
 
+void	board_init_f_r_trampoline(ulong) __attribute__ ((noreturn));
+void	board_init_f_r(void) __attribute__ ((noreturn));
 
 #endif	/* _U_BOOT_I386_H_ */
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index ba6b59f..978beaa 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -253,10 +253,29 @@ void board_init_f(ulong boot_flags)
 
 	gd->flags |= GD_FLG_RELOC;
 
-	/* Enter the relocated U-Boot! */
-	relocate_code(gd->start_addr_sp, gd, gd->relocaddr);
+	/*
+	 * SDRAM is now initialised, U-Boot has been copied into SDRAM,
+	 * the BSS has been cleared etc. The final stack can now be setup
+	 * in SDRAM. Code execution will continue (momentarily) in Flash,
+	 * but with the stack in SDRAM and Global Data in temporary memory
+	 * (CPU cache)
+	 */
+	board_init_f_r_trampoline(gd->start_addr_sp);
+
+	/* NOTREACHED - board_init_f_r_trampoline() does not return */
+	while (1)
+		;
+}
+
+void board_init_f_r(void)
+{
+	/*
+	 * Transfer execution from Flash to RAM by calculating the address
+	 * of the in-RAM copy of board_init_r() and calling it
+	 */
+	(board_init_r + gd->reloc_off)(gd, gd->relocaddr);
 
-	/* NOTREACHED - relocate_code() does not return */
+	/* NOTREACHED - board_init_r() does not return */
 	while (1)
 		;
 }
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 06/17] x86: Rework relocation calcuations
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (4 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 05/17] x86: Simplify Flash-to-RAM code execution transition Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:30   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 07/17] x86: Use fs for global data Graeme Russ
                   ` (10 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/lib/board.c |   23 +++++++++++------------
 1 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 978beaa..bc5027b 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -164,24 +164,23 @@ static int calculate_relocation_address(void)
 	ulong text_start = (ulong)&__text_start;
 	ulong bss_end = (ulong)&__bss_end;
 	ulong dest_addr;
-	ulong rel_offset;
-
-	/* Calculate destination RAM Address and relocation offset */
-	dest_addr = gd->ram_size;
-	dest_addr -= CONFIG_SYS_STACK_SIZE;
-	dest_addr -= (bss_end - text_start);
 
 	/*
-	 * Round destination address down to 16-byte boundary to keep
-	 * IDT and GDT 16-byte aligned
+	 * NOTE: All destination address are rounded down to 16-byte
+	 *       boundary to satisfy various worst-case alignment
+	 *       requirements
 	 */
-	dest_addr &= ~15;
 
-	rel_offset = dest_addr - text_start;
+	/* Stack is at top of available memory */
+	dest_addr = gd->ram_size;
+	gd->start_addr_sp = dest_addr;
 
-	gd->start_addr_sp = gd->ram_size;
+	/* U-Boot is below the stack */
+	dest_addr -= CONFIG_SYS_STACK_SIZE;
+	dest_addr -= (bss_end - text_start);
+	dest_addr &= ~15;
 	gd->relocaddr = dest_addr;
-	gd->reloc_off = rel_offset;
+	gd->reloc_off = (dest_addr - text_start);
 
 	return 0;
 }
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 07/17] x86: Use fs for global data
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (5 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 06/17] x86: Rework relocation calcuations Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:36   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot Graeme Russ
                   ` (9 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot

Use the base address of the 'F' segment as a pointer to the global data
structure. By adding the linear address (i.e. the 'D' segment address)
as the first word of the global data structure, the address of the
global data relative to the 'D' segment can be found simply, for
example, by:

	fs movl 0, %eax

This makes the gd 'pointer' writable prior to relocation (by reloading
the GDT) which brings x86 into line with all other arches

NOTE: Writing to the gd 'pointer' is expensive (but we only do it
twice) but using it to access global data members (read and write) is
still fairly cheap

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/cpu/cpu.c                 |   53 ++++++++++++++++++++--------------
 arch/x86/cpu/start.S               |    8 ++++-
 arch/x86/include/asm/global_data.h |   21 +++++++++----
 arch/x86/include/asm/processor.h   |    6 +++-
 arch/x86/include/asm/u-boot-x86.h  |    2 +
 arch/x86/lib/board.c               |   56 +++++++++++++++++++++++++-----------
 6 files changed, 98 insertions(+), 48 deletions(-)

diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index bf55c26..e7a5fc0 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -90,6 +90,37 @@ static void load_gdt(const u64 *boot_gdt, u16 num_entries)
 	asm volatile("lgdtl %0\n" : : "m" (gdt));
 }
 
+void init_gd(gd_t *id, u64 *gdt_addr)
+{
+	id->gd_addr = (ulong)id;
+	setup_gdt(id, gdt_addr);
+}
+
+void setup_gdt(gd_t *id, u64 *gdt_addr)
+{
+	/* CS: code, read/execute, 4 GB, base 0 */
+	gdt_addr[GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff);
+
+	/* DS: data, read/write, 4 GB, base 0 */
+	gdt_addr[GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff);
+
+	/* FS: data, read/write, 4 GB, base (Global Data Pointer) */
+	gdt_addr[GDT_ENTRY_32BIT_FS] = GDT_ENTRY(0xc093, (ulong)id, 0xfffff);
+
+		/* 16-bit CS: code, read/execute, 64 kB, base 0 */
+	gdt_addr[GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff);
+
+	/* 16-bit DS: data, read/write, 64 kB, base 0 */
+	gdt_addr[GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff);
+
+	load_gdt(gdt_addr, GDT_NUM_ENTRIES);
+	load_ds(GDT_ENTRY_32BIT_DS);
+	load_es(GDT_ENTRY_32BIT_DS);
+	load_gs(GDT_ENTRY_32BIT_DS);
+	load_ss(GDT_ENTRY_32BIT_DS);
+	load_fs(GDT_ENTRY_32BIT_FS);
+}
+
 int x86_cpu_init_f(void)
 {
 	const u32 em_rst = ~X86_CR0_EM;
@@ -117,28 +148,6 @@ int x86_cpu_init_r(void)
 	    "movl	%%eax, %%cr0\n"
 	    "wbinvd\n" : : "i" (nw_cd_rst) : "eax");
 
-	/*
-	 * There are machines which are known to not boot with the GDT
-	 * being 8-byte unaligned. Intel recommends 16 byte alignment
-	 */
-	static const u64 boot_gdt[] __aligned(16) = {
-		/* CS: code, read/execute, 4 GB, base 0 */
-		[GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
-		/* DS: data, read/write, 4 GB, base 0 */
-		[GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
-		/* 16-bit CS: code, read/execute, 64 kB, base 0 */
-		[GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
-		/* 16-bit DS: data, read/write, 64 kB, base 0 */
-		[GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
-	};
-
-	load_gdt(boot_gdt, GDT_NUM_ENTRIES);
-	load_ds(GDT_ENTRY_32BIT_DS);
-	load_es(GDT_ENTRY_32BIT_DS);
-	load_fs(GDT_ENTRY_32BIT_DS);
-	load_gs(GDT_ENTRY_32BIT_DS);
-	load_ss(GDT_ENTRY_32BIT_DS);
-
 	/* Initialize core interrupt and exception functionality of CPU */
 	cpu_init_interrupts();
 	return 0;
diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
index 9592158..4fb9e6b 100644
--- a/arch/x86/cpu/start.S
+++ b/arch/x86/cpu/start.S
@@ -31,7 +31,7 @@
 #include <asm/global_data.h>
 #include <asm/processor.h>
 #include <asm/processor-flags.h>
-#include <generated/asm-offsets.h>
+#include <generated/generic-asm-offsets.h>
 
 .section .text
 .code32
@@ -85,6 +85,12 @@ car_init_ret:
 	 */
 	movl	$CONFIG_SYS_INIT_SP_ADDR, %esp
 
+	/* Initialise the Global Data Pointer */
+	movl	$CONFIG_SYS_INIT_GD_ADDR, %eax
+	movl	%eax, %edx
+	addl	$GENERATED_GBL_DATA_SIZE, %edx
+	call	init_gd;
+
 	/* Set parameter to board_init_f() to boot flags */
 	xorl	%eax, %eax
 	movw	%bx, %ax
diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index 05a2139..908a02c 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -36,6 +36,8 @@
 #ifndef __ASSEMBLY__
 
 typedef	struct global_data {
+	/* NOTE: gd_addr MUST be first member of struct global_data! */
+	unsigned long	gd_addr;	/* Location of Global Data */
 	bd_t		*bd;
 	unsigned long	flags;
 	unsigned long	baudrate;
@@ -51,13 +53,24 @@ typedef	struct global_data {
 	unsigned long	bus_clk;
 	unsigned long	relocaddr;	/* Start address of U-Boot in RAM */
 	unsigned long	start_addr_sp;	/* start_addr_stackpointer */
+	unsigned long	gdt_addr;	/* Location of GDT */
+	unsigned long	new_gd_addr;	/* New location of Global Data */
 	phys_size_t	ram_size;	/* RAM size */
 	unsigned long	reset_status;	/* reset status register at boot */
 	void		**jt;		/* jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
 } gd_t;
 
-extern gd_t *gd;
+static inline gd_t *get_fs_gd_ptr(void)
+{
+	gd_t *gd_ptr;
+
+	asm volatile("fs movl 0, %0\n" : "=r" (gd_ptr));
+
+	return gd_ptr;
+}
+
+#define gd	get_fs_gd_ptr()
 
 #endif
 
@@ -73,12 +86,6 @@ extern gd_t *gd;
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/
 
-#if 0
 #define DECLARE_GLOBAL_DATA_PTR
-#else
-#define XTRN_DECLARE_GLOBAL_DATA_PTR    extern
-#define DECLARE_GLOBAL_DATA_PTR     XTRN_DECLARE_GLOBAL_DATA_PTR \
-gd_t *gd
-#endif
 
 #endif /* __ASM_GBL_DATA_H */
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 203c63a..07897f9 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -24,13 +24,17 @@
 #ifndef __ASM_PROCESSOR_H_
 #define __ASM_PROCESSOR_H_ 1
 
+#define GDT_ENTRY_SIZE		8
+
 #define GDT_ENTRY_NULL		0
 #define GDT_ENTRY_UNUSED	(GDT_ENTRY_NULL + 1)
 #define GDT_ENTRY_32BIT_CS	(GDT_ENTRY_UNUSED + 1)
 #define GDT_ENTRY_32BIT_DS	(GDT_ENTRY_32BIT_CS + 1)
-#define GDT_ENTRY_16BIT_CS	(GDT_ENTRY_32BIT_DS + 1)
+#define GDT_ENTRY_32BIT_FS	(GDT_ENTRY_32BIT_DS + 1)
+#define GDT_ENTRY_16BIT_CS	(GDT_ENTRY_32BIT_FS + 1)
 #define GDT_ENTRY_16BIT_DS	(GDT_ENTRY_16BIT_CS + 1)
 
 #define GDT_NUM_ENTRIES		(GDT_ENTRY_16BIT_DS + 1)
+#define GDT_SIZE		(GDT_NUM_ENTRIES * GDT_ENTRY_SIZE)
 
 #endif
diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
index c3d2277..5540d51 100644
--- a/arch/x86/include/asm/u-boot-x86.h
+++ b/arch/x86/include/asm/u-boot-x86.h
@@ -37,6 +37,8 @@ int x86_cpu_init_r(void);
 int cpu_init_r(void);
 int x86_cpu_init_f(void);
 int cpu_init_f(void);
+void init_gd(gd_t *id, u64 *gdt_addr);
+void setup_gdt(gd_t *id, u64 *gdt_addr);
 
 /* cpu/.../timer.c */
 void timer_isr(void *);
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index bc5027b..9c4ecda 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -42,20 +42,12 @@
 #include <serial.h>
 #include <asm/u-boot-x86.h>
 #include <elf.h>
+#include <asm/processor.h>
 
 #ifdef CONFIG_BITBANGMII
 #include <miiphy.h>
 #endif
 
-/*
- * 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);
-
 /************************************************************************
  * Init Utilities							*
  ************************************************************************
@@ -128,6 +120,7 @@ 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);
+static int copy_gd_to_ram(void);
 
 init_fnc_t *init_sequence_f[] = {
 	cpu_init_f,
@@ -146,6 +139,7 @@ init_fnc_t *init_sequence_f[] = {
 };
 
 init_fnc_t *init_sequence_r[] = {
+	copy_gd_to_ram,
 	cpu_init_r,		/* basic cpu dependent setup */
 	board_early_init_r,	/* basic board dependent setup */
 	dram_init,		/* configure available RAM banks */
@@ -157,8 +151,6 @@ init_fnc_t *init_sequence_r[] = {
 	NULL,
 };
 
-gd_t *gd;
-
 static int calculate_relocation_address(void)
 {
 	ulong text_start = (ulong)&__text_start;
@@ -171,8 +163,18 @@ static int calculate_relocation_address(void)
 	 *       requirements
 	 */
 
-	/* Stack is at top of available memory */
+	/* Global Data is at top of available memory */
 	dest_addr = gd->ram_size;
+	dest_addr -= GENERATED_GBL_DATA_SIZE;
+	dest_addr &= ~15;
+	gd->new_gd_addr = dest_addr;
+
+	/* GDT is below Global Data */
+	dest_addr -= GDT_SIZE;
+	dest_addr &= ~15;
+	gd->gdt_addr = dest_addr;
+
+	/* Stack is below GDT */
 	gd->start_addr_sp = dest_addr;
 
 	/* U-Boot is below the stack */
@@ -279,6 +281,31 @@ void board_init_f_r(void)
 		;
 }
 
+static int copy_gd_to_ram(void)
+{
+	gd_t *ram_gd;
+
+	/*
+	 * Global data is still in temporary memory (the CPU cache).
+	 * calculate_relocation_address() has set gd->new_gd_addr to
+	 * where the global data lives in RAM but getting it there
+	 * safely is a bit tricky due to the 'F-Segment Hack' that
+	 * we need to use for x86
+	 */
+	ram_gd = (gd_t *)gd->new_gd_addr;
+	memcpy((void *)ram_gd, gd, sizeof(gd_t));
+
+	/*
+	 * Reload the Global Descriptor Table so FS points to the
+	 * in-RAM copy of Global Data (calculate_relocation_address()
+	 * has already calculated the in-RAM location of the GDT)
+	 */
+	ram_gd->gd_addr = (ulong)ram_gd;
+	init_gd(ram_gd, (u64 *)gd->gdt_addr);
+
+	return 0;
+}
+
 void board_init_r(gd_t *id, ulong dest_addr)
 {
 #if defined(CONFIG_CMD_NET)
@@ -288,15 +315,10 @@ void board_init_r(gd_t *id, ulong dest_addr)
 	ulong size;
 #endif
 	static bd_t bd_data;
-	static gd_t gd_data;
 	init_fnc_t **init_fnc_ptr;
 
 	show_boot_progress(0x21);
 
-	/* 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");
 
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (6 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 07/17] x86: Use fs for global data Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:37   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 09/17] x86: Create weak init_cache() function Graeme Russ
                   ` (8 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/lib/board.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 9c4ecda..4e54dba 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -252,8 +252,6 @@ void board_init_f(ulong boot_flags)
 			hang();
 	}
 
-	gd->flags |= GD_FLG_RELOC;
-
 	/*
 	 * SDRAM is now initialised, U-Boot has been copied into SDRAM,
 	 * the BSS has been cleared etc. The final stack can now be setup
@@ -322,6 +320,8 @@ void board_init_r(gd_t *id, ulong dest_addr)
 	/* compiler optimization barrier needed for GCC >= 3.4 */
 	__asm__ __volatile__("" : : : "memory");
 
+	gd->flags |= GD_FLG_RELOC;
+
 	gd->bd = &bd_data;
 	memset(gd->bd, 0, sizeof(bd_t));
 	show_boot_progress(0x22);
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 09/17] x86: Create weak init_cache() function
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (7 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:38   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 10/17] x86: Allow cache before copy to RAM Graeme Russ
                   ` (7 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/cpu/cpu.c                |   18 +++++++++++++++---
 arch/x86/include/asm/u-boot-x86.h |    1 +
 arch/x86/lib/board.c              |    1 +
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index e7a5fc0..4351f20 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -140,6 +140,14 @@ int cpu_init_f(void) __attribute__((weak, alias("x86_cpu_init_f")));
 
 int x86_cpu_init_r(void)
 {
+	/* Initialize core interrupt and exception functionality of CPU */
+	cpu_init_interrupts();
+	return 0;
+}
+int cpu_init_r(void) __attribute__((weak, alias("x86_cpu_init_r")));
+
+void x86_enable_caches(void)
+{
 	const u32 nw_cd_rst = ~(X86_CR0_NW | X86_CR0_CD);
 
 	/* turn on the cache and disable write through */
@@ -147,12 +155,16 @@ int x86_cpu_init_r(void)
 	    "andl	%0, %%eax\n"
 	    "movl	%%eax, %%cr0\n"
 	    "wbinvd\n" : : "i" (nw_cd_rst) : "eax");
+}
+void enable_caches(void) __attribute__((weak, alias("x86_enable_caches")));
+
+int x86_init_cache(void)
+{
+	enable_caches();
 
-	/* Initialize core interrupt and exception functionality of CPU */
-	cpu_init_interrupts();
 	return 0;
 }
-int cpu_init_r(void) __attribute__((weak, alias("x86_cpu_init_r")));
+int init_cache(void) __attribute__((weak, alias("x86_init_cache")));
 
 int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
index 5540d51..878a1ee 100644
--- a/arch/x86/include/asm/u-boot-x86.h
+++ b/arch/x86/include/asm/u-boot-x86.h
@@ -39,6 +39,7 @@ int x86_cpu_init_f(void);
 int cpu_init_f(void);
 void init_gd(gd_t *id, u64 *gdt_addr);
 void setup_gdt(gd_t *id, u64 *gdt_addr);
+int init_cache(void);
 
 /* cpu/.../timer.c */
 void timer_isr(void *);
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 4e54dba..ffddfbe 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -140,6 +140,7 @@ init_fnc_t *init_sequence_f[] = {
 
 init_fnc_t *init_sequence_r[] = {
 	copy_gd_to_ram,
+	init_cache,
 	cpu_init_r,		/* basic cpu dependent setup */
 	board_early_init_r,	/* basic board dependent setup */
 	dram_init,		/* configure available RAM banks */
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 10/17] x86: Allow cache before copy to RAM
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (8 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 09/17] x86: Create weak init_cache() function Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:40   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 11/17] CHECKPATCH: arch/x86/cpu/* Graeme Russ
                   ` (6 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/lib/board.c |   15 ++++++++++-----
 1 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index ffddfbe..52e27e1 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -131,16 +131,11 @@ init_fnc_t *init_sequence_f[] = {
 	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[] = {
-	copy_gd_to_ram,
-	init_cache,
 	cpu_init_r,		/* basic cpu dependent setup */
 	board_early_init_r,	/* basic board dependent setup */
 	dram_init,		/* configure available RAM banks */
@@ -269,6 +264,16 @@ void board_init_f(ulong boot_flags)
 
 void board_init_f_r(void)
 {
+	if (copy_gd_to_ram() != 0)
+		hang();
+
+	if (init_cache() != 0)
+		hang();
+
+	copy_uboot_to_ram();
+	clear_bss();
+	do_elf_reloc_fixups();
+
 	/*
 	 * Transfer execution from Flash to RAM by calculating the address
 	 * of the in-RAM copy of board_init_r() and calling it
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 11/17] CHECKPATCH: arch/x86/cpu/*
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (9 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 10/17] x86: Allow cache before copy to RAM Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:42   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 12/17] CHECKPATCH: arch/x86/lib/* Graeme Russ
                   ` (5 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/cpu/interrupts.c |    2 +-
 arch/x86/cpu/start16.S    |   57 +++++++++++++++++++++++++++++++++++---------
 2 files changed, 46 insertions(+), 13 deletions(-)

diff --git a/arch/x86/cpu/interrupts.c b/arch/x86/cpu/interrupts.c
index e0958eb..43ec3f8 100644
--- a/arch/x86/cpu/interrupts.c
+++ b/arch/x86/cpu/interrupts.c
@@ -174,7 +174,7 @@ struct desc_ptr {
 	unsigned short segment;
 } __packed;
 
-struct idt_entry idt[256] __attribute__((aligned(16)));
+struct idt_entry idt[256] __aligned(16);
 
 struct desc_ptr idt_ptr;
 
diff --git a/arch/x86/cpu/start16.S b/arch/x86/cpu/start16.S
index 33e53cd..cc393ff 100644
--- a/arch/x86/cpu/start16.S
+++ b/arch/x86/cpu/start16.S
@@ -86,7 +86,11 @@ gdt_ptr:
 	.word	0x20		/* limit (32 bytes = 4 GDT entries) */
 	.long	BOOT_SEG + gdt	/* base */
 
-	/* The GDT table ...
+/* Some CPUs are picky about GDT alignment... */
+.align 16
+gdt:
+	/*
+	 * The GDT table ...
 	 *
 	 *	 Selector	Type
 	 *	 0x00		NULL
@@ -94,17 +98,46 @@ gdt_ptr:
 	 *	 0x10		32bit code
 	 *	 0x18		32bit data/stack
 	 */
+	/* The NULL Desciptor - Mandatory */
+	.word	0x0000		/* limit_low */
+	.word	0x0000		/* base_low */
+	.byte	0x00		/* base_middle */
+	.byte	0x00		/* access */
+	.byte	0x00		/* flags + limit_high */
+	.byte	0x00		/* base_high */
 
-gdt:
-	.word	0, 0, 0, 0	/* NULL  */
-	.word	0, 0, 0, 0	/* unused */
+	/* Unused Desciptor - (matches Linux) */
+	.word	0x0000		/* limit_low */
+	.word	0x0000		/* base_low */
+	.byte	0x00		/* base_middle */
+	.byte	0x00		/* access */
+	.byte	0x00		/* flags + limit_high */
+	.byte	0x00		/* base_high */
 
-	.word	0xFFFF		/* 4Gb - (0x100000*0x1000 = 4Gb) */
-	.word	0		/* base address = 0 */
-	.word	0x9B00		/* code read/exec */
-	.word	0x00CF		/* granularity = 4096, 386 (+5th nibble of limit) */
+	/*
+	 * The Code Segment Descriptor:
+	 * - Base   = 0x00000000
+	 * - Size   = 4GB
+	 * - Access = Present, Ring 0, Exec (Code), Readable
+	 * - Flags  = 4kB Granularity, 32-bit
+	 */
+	.word	0xffff		/* limit_low */
+	.word	0x0000		/* base_low */
+	.byte	0x00		/* base_middle */
+	.byte	0x9b		/* access */
+	.byte	0xcf		/* flags + limit_high */
+	.byte	0x00		/* base_high */
 
-	.word	0xFFFF		/* 4Gb - (0x100000*0x1000 = 4Gb) */
-	.word	0x0		/* base address = 0 */
-	.word	0x9300		/* data read/write */
-	.word	0x00CF		/* granularity = 4096, 386 (+5th nibble of limit) */
+	/*
+	 * The Data Segment Descriptor:
+	 * - Base   = 0x00000000
+	 * - Size   = 4GB
+	 * - Access = Present, Ring 0, Non-Exec (Data), Writable
+	 * - Flags  = 4kB Granularity, 32-bit
+	 */
+	.word	0xffff		/* limit_low */
+	.word	0x0000		/* base_low */
+	.byte	0x00		/* base_middle */
+	.byte	0x93		/* access */
+	.byte	0xcf		/* flags + limit_high */
+	.byte	0x00		/* base_high */
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 12/17] CHECKPATCH: arch/x86/lib/*
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (10 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 11/17] CHECKPATCH: arch/x86/cpu/* Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:47   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 13/17] x86: Move do_go_exec() out of board.c Graeme Russ
                   ` (4 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/lib/bios.S            |  134 +++++++++++++++++++++++++--------------
 arch/x86/lib/realmode_switch.S |   61 +++++++++++--------
 2 files changed, 122 insertions(+), 73 deletions(-)

diff --git a/arch/x86/lib/bios.S b/arch/x86/lib/bios.S
index ce8deb5..239aaa9 100644
--- a/arch/x86/lib/bios.S
+++ b/arch/x86/lib/bios.S
@@ -246,11 +246,9 @@ rm_int1f:
 rm_def_int:
 	iret
 
-
 	/*
-	 * All interrupt jumptable entries jump to here
-	 * after pushing the interrupt vector number onto the
-	 * stack.
+	 * All interrupt jumptable entries jump to here after pushing the
+	 * interrupt vector number onto the stack.
 	 */
 any_interrupt16:
 	MAKE_BIOS_STACK
@@ -272,7 +270,8 @@ gs	movw	OFFS_VECTOR(%bp), %ax
 	je	Lint_1ah
 	movw	$0xffff, %ax
 	jmp	Lout
-Lint_10h:					/* VGA BIOS services */
+Lint_10h:
+	/* VGA BIOS services */
 	call	bios_10h
 	jmp	Lout
 Lint_11h:
@@ -281,35 +280,42 @@ Lint_11h:
 Lint_12h:
 	call	bios_12h
 	jmp	Lout
-Lint_13h:					/* BIOS disk services */
+Lint_13h:
+	/* BIOS disk services */
 	call	bios_13h
 	jmp	Lout
-Lint_15h:					/* Misc. BIOS services */
+Lint_15h:
+	/* Misc. BIOS services */
 	call	bios_15h
 	jmp	Lout
-Lint_16h:					/* keyboard services */
+Lint_16h:
+	/* keyboard services */
 	call	bios_16h
 	jmp	Lout
-Lint_1ah:					/* PCI bios */
+Lint_1ah:
+	/* PCI bios */
 	call	bios_1ah
 	jmp	Lout
 Lout:
 	cmpw	$0, %ax
 	je	Lhandeled
 
-	/* Insert code for unhandeled INTs here.
+	/*
+	 * Insert code for unhandeled INTs here.
 	 *
-	 * ROLO prints a message to the console
-	 * (we could do that but then we're in 16bit mode
-	 * so we'll have to get back into 32bit mode
-	 * to use the console I/O routines (if we do this
-	 * we shuls make int 0x10 and int 0x16 work as well))
+	 * ROLO prints a message to the console we could do that but then
+	 * we're in 16bit mode so we'll have to get back into 32bit mode
+	 * to use the console I/O routines (if we do this we should make
+	 * int 0x10 and int 0x16 work as well)
 	 */
 Lhandeled:
 	RESTORE_CALLERS_STACK
-	addw	$2,%sp				/* dump vector number */
-	iret					/* return from interrupt */
 
+	/* dump vector number */
+	addw	$2,%sp
+
+	/* return from interrupt */
+	iret
 
 /*
  ************************************************************
@@ -327,22 +333,24 @@ gs	movw	OFFS_AX(%bp), %ax
 	je	Lvid_cfg
 	movw	$0xffff, %ax
 	ret
-Lcur_pos:					/* Read Cursor Position and Size */
+Lcur_pos:
+	/* Read Cursor Position and Size */
 gs	movw	$0, OFFS_CX(%bp)
 gs	movw	$0, OFFS_DX(%bp)
 	xorw	%ax, %ax
 	ret
-Lvid_state:					/* Get Video State */
-gs	movw	$(80 << 8|0x03), OFFS_AX(%bp)	/* 80 columns, 80x25, 16 colors */
+Lvid_state:
+	/* Get Video State - 80 columns, 80x25, 16 colors */
+gs	movw	$(80 << 8|0x03), OFFS_AX(%bp)
 gs	movw	$0, OFFS_BX(%bp)
 	xorw	%ax, %ax
 	ret
-Lvid_cfg:	/* Video Subsystem Configuration (EGA/VGA) */
-gs	movw	$0x10, OFFS_BX(%bp)		/* indicate CGA/MDA/HGA */
+Lvid_cfg:
+	/* Video Subsystem Configuration (EGA/VGA) - indicate CGA/MDA/HGA */
+gs	movw	$0x10, OFFS_BX(%bp)
 	xorw	%ax, %ax
 	ret
 
-
 /*
  ************************************************************
  * BIOS interrupt 11h -- Equipment determination
@@ -355,7 +363,6 @@ gs	movw	%ax, OFFS_AX(%bp)
 	xorw	%ax, %ax
 	ret
 
-
 /*
  ************************************************************
  * BIOS	interrupt 12h -- Get Memory Size
@@ -370,16 +377,18 @@ cs	movw	ram_in_64kb_chunks, %ax
 b12_more_than_640k:
 	movw	$0x280, %ax
 b12_return:
-gs	movw	%ax, OFFS_AX(%bp)		/* return number of kilobytes in ax */
+	/* return number of kilobytes in ax */
+gs	movw	%ax, OFFS_AX(%bp)
 
 gs	movw	OFFS_FLAGS(%bp), %ax
-	andw	$0xfffe, %ax			/* clear carry -- function succeeded */
+
+	/* clear carry -- function succeeded */
+	andw	$0xfffe, %ax
 gs	movw	%ax, OFFS_FLAGS(%bp)
 
 	xorw	%ax, %ax
 	ret
 
-
 /*
  ************************************************************
  * BIOS interrupt 13h -- Disk services
@@ -394,12 +403,13 @@ gs	movw	OFFS_AX(%bp), %ax
 	ret
 Lfunc_15h:
 gs	movw	OFFS_AX(%bp), %ax
-	andw	$0xff, %ax			/* return AH=0->drive not present */
+
+	/* return AH=0->drive not present */
+	andw	$0x00ff, %ax
 gs	movw	%ax, OFFS_AX(%bp)
 	xorw	%ax, %ax
 	ret
 
-
 /*
  ***********************************************************
  * BIOS interrupt 15h -- Miscellaneous services
@@ -417,9 +427,12 @@ gs	movw	OFFS_AX(%bp), %ax
 	movw	$0xffff, %ax
 	ret
 
-Lfunc_c0h:					/* Return System Configuration Parameters (PS2 only) */
+Lfunc_c0h:
+	/* Return System Configuration Parameters (PS2 only) */
 gs	movw	OFFS_FLAGS(%bp), %ax
-	orw	$1, %ax				/* return carry -- function not supported */
+
+	/* return carry -- function not supported */
+	orw	$1, %ax
 gs	movw	%ax, OFFS_FLAGS(%bp)
 	xorw	%ax, %ax
 	ret
@@ -430,38 +443,56 @@ gs	movw	OFFS_AX(%bp), %ax
 	cmpw	$1, %ax
 	je	Lfunc_e801h
 gs	movw	OFFS_FLAGS(%bp), %ax
-	orw	$1, %ax				/* return carry -- function not supported */
+
+	/* return carry -- function not supported */
+	orw	$1, %ax
 gs	movw	%ax, OFFS_FLAGS(%bp)
 	xorw	%ax, %ax
 	ret
 
-Lfunc_e801h:					/* Get memory size for >64M Configurations */
+Lfunc_e801h:
+	/* Get memory size for >64M Configurations */
 cs	movw	ram_in_64kb_chunks, %ax
 	cmpw	$0x100, %ax
 	ja	e801_more_than_16mb
-	shlw	$6, %ax				/* multiply by 64 */
-	subw	$0x400, %ax			/* 1st meg does not count */
 
-gs	movw	%ax, OFFS_AX(%bp)		/* return memory size between 1M and 16M in 1kb chunks in AX and CX */
+	/* multiply by 64 */
+	shlw	$6, %ax
+
+	/* 1st meg does not count */
+	subw	$0x400, %ax
+
+	/* return memory size between 1M and 16M in 1kb chunks in AX and CX */
+gs	movw	%ax, OFFS_AX(%bp)
 gs	movw	%ax, OFFS_CX(%bp)
-gs	movw	$0, OFFS_BX(%bp)		/* set BX and DX to 0*/
+
+	/* set BX and DX to 0*/
+gs	movw	$0, OFFS_BX(%bp)
 gs	movw	$0, OFFS_DX(%bp)
 gs	movw	OFFS_FLAGS(%bp), %ax
-	andw	$0xfffe, %ax			/* clear carry -- function succeeded */
+
+	/* clear carry -- function succeeded */
+	andw	$0xfffe, %ax
 gs	movw	%ax, OFFS_FLAGS(%bp)
 	xorw	%ax, %ax
 	ret
 
 e801_more_than_16mb:
-	subw	$0x100, %ax			/* subtract 16MB */
+	/* subtract 16MB */
+	subw	$0x100, %ax
 
-gs	movw	$0x3c00, OFFS_AX(%bp)		/* return 0x3c00 (16MB-1MB) in AX and CX */
+	/* return 0x3c00 (16MB-1MB) in AX and CX */
+gs	movw	$0x3c00, OFFS_AX(%bp)
 gs	movw	$0x3c00, OFFS_CX(%bp)
-gs	movw	%ax, OFFS_BX(%bp)		/* set BX and DX to number of 64kb chunks above 16MB */
+
+	/* set BX and DX to number of 64kb chunks above 16MB */
+gs	movw	%ax, OFFS_BX(%bp)
 gs	movw	%ax, OFFS_DX(%bp)
 
 gs	movw	OFFS_FLAGS(%bp), %ax
-	andw	$0xfffe, %ax			/* clear carry -- function succeeded */
+
+	/* clear carry -- function succeeded */
+	andw	$0xfffe, %ax
 gs	movw	%ax, OFFS_FLAGS(%bp)
 	xorw	%ax, %ax
 	ret
@@ -473,18 +504,22 @@ cs	movw	ram_in_64kb_chunks, %ax
 	movw	$0x100, %ax
 b88_not_more_than16:
 	shlw	$6, %ax
-	subw	$0x400, %ax			/* 1st meg does not count */
 
-gs	movw	%ax, OFFS_AX(%bp)		/* return number of kilobytes between 16MB and 16MB in ax */
+	/* 1st meg does not count */
+	subw	$0x400, %ax
+
+	/* return number of kilobytes between 16MB and 16MB in ax */
+gs	movw	%ax, OFFS_AX(%bp)
 
 gs	movw	OFFS_FLAGS(%bp), %ax
-	andw	$0xfffe, %ax			/* clear carry -- function succeeded */
+
+	/* clear carry -- function succeeded */
+	andw	$0xfffe, %ax
 gs	movw	%ax, OFFS_FLAGS(%bp)
 
 	xorw	%ax, %ax
 	ret
 
-
 /*
  ************************************************************
  * BIOS interrupt 16h -- keyboard services
@@ -498,7 +533,8 @@ gs	movw	OFFS_AX(%bp), %ax
 	movw	$0xffff, %ax
 	ret
 Lfunc_03h:
-	xorw	%ax, %ax			/* do nothing -- function not supported */
+	/* do nothing -- function not supported */
+	xorw	%ax, %ax
 	ret
 
 /*
@@ -514,7 +550,9 @@ gs	movw	OFFS_AX(%bp), %ax
 	ret
 Lfunc_b1h:
 	call	realmode_pci_bios
-	xorw	%ax, %ax			/* do nothing -- function not supported */
+
+	/* do nothing -- function not supported */
+	xorw	%ax, %ax
 	ret
 
 
diff --git a/arch/x86/lib/realmode_switch.S b/arch/x86/lib/realmode_switch.S
index 7ee709a..c4c4c43 100644
--- a/arch/x86/lib/realmode_switch.S
+++ b/arch/x86/lib/realmode_switch.S
@@ -44,12 +44,13 @@
  *	e40 ss;
  */
 
-#define a32		.byte 0x67;		/* address size prefix 32 */
-#define o32		.byte 0x66;		/* operand size prefix 32 */
+#define a32		.byte 0x67;	/* address size prefix 32 */
+#define o32		.byte 0x66;	/* operand size prefix 32 */
 
 .section .realmode, "ax"
 .code16
-						/* 16bit protected mode code here */
+
+	/* 16bit protected mode code here */
 .globl realmode_enter
 realmode_enter:
 o32	pusha
@@ -69,20 +70,23 @@ o32	pushf
 	movw	%ax, %gs
 
 	lidt	realmode_idt_ptr
-	movl	%cr0, %eax			/* Go back into real mode by */
-	andl	$0x7ffffffe, %eax		/* clearing PE to 0 */
+	/* Go back into real mode by clearing PE to 0 */
+	movl	%cr0, %eax
+	andl	$0x7ffffffe, %eax
 	movl	%eax, %cr0
-	ljmp	$0x0,$do_realmode		/* switch to real mode */
 
-do_realmode:					/* realmode code from here */
+	/* switch to real mode */
+	ljmp	$0x0,$do_realmode
+
+do_realmode:
+	/* realmode code from here */
 	movw	%cs,%ax
 	movw	%ax,%ds
 	movw	%ax,%es
 	movw	%ax,%fs
 	movw	%ax,%gs
 
-						/* create a temporary stack */
-
+	/* create a temporary stack */
 	movw	$0xc0, %ax
 	movw	%ax, %ss
 	movw	$0x200, %ax
@@ -114,26 +118,29 @@ o32	popf
 	popw	%ss
 	movl	%eax, %esp
 cs	movl	temp_eax, %eax
-	wbinvd					/* self-modifying code,
-						 * better flush the cache */
+
+	/* self-modifying code, better flush the cache */
+	wbinvd
 
 	.byte	0x9a				/* lcall */
 temp_ip:
 	.word	0				/* new ip */
 temp_cs:
 	.word	0				/* new cs */
+
 realmode_ret:
-						/* save eax, esp and ss */
+	/* save eax, esp and ss */
 cs	movl	%eax, saved_eax
 	movl	%esp, %eax
 cs	movl	%eax, saved_esp
 	movw	%ss, %ax
 cs	movw	%ax, saved_ss
 
-	/* restore the stack, note that we set sp to 0x244;
+	/*
+	 * restore the stack, note that we set sp to 0x244;
 	 * pt_regs is 0x44 bytes long and we push the structure
-	 * backwards on to the stack, bottom first */
-
+	 * backwards on to the stack, bottom first
+	 */
 	movw	$0xc0, %ax
 	movw	%ax, %ss
 	movw	$0x244, %ax
@@ -169,12 +176,15 @@ cs	movw	temp_ip, %ax
 	pushl	%ebx
 
 o32 cs	lidt	saved_idt
-o32 cs	lgdt	saved_gdt			/* Set GDTR */
+o32 cs	lgdt	saved_gdt
 
-	movl	%cr0, %eax			/* Go back into protected mode */
-	orl	$1,%eax	/* reset PE to 1 */
+	/* Go back into protected mode reset PE to 1 */
+	movl	%cr0, %eax
+	orl	$1,%eax
 	movl	%eax, %cr0
-	jmp	next_line			/* flush prefetch queue */
+
+	/* flush prefetch queue */
+	jmp	next_line
 next_line:
 	movw	$return_ptr, %ax
 	movw	%ax,%bp
@@ -182,12 +192,13 @@ o32 cs	ljmp	*(%bp)
 
 .code32
 protected_mode:
-	movl	$0x18,%eax			/* reload GDT[3] */
-	movw	%ax,%fs				/* reset FS */
-	movw	%ax,%ds				/* reset DS */
-	movw	%ax,%gs				/* reset GS */
-	movw	%ax,%es				/* reset ES */
-	movw	%ax,%ss				/* reset SS */
+	/* Reload segment registers */
+	movl	$0x18, %eax
+	movw	%ax, %fs
+	movw	%ax, %ds
+	movw	%ax, %gs
+	movw	%ax, %es
+	movw	%ax, %ss
 	movl	saved_protected_mode_esp, %eax
 	movl	%eax, %esp
 	popf
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 13/17] x86: Move do_go_exec() out of board.c
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (11 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 12/17] CHECKPATCH: arch/x86/lib/* Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:48   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 14/17] x86: Move setup_pcat_compatibility() " Graeme Russ
                   ` (3 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/lib/Makefile   |    1 +
 arch/x86/lib/board.c    |   27 -------------------
 arch/x86/lib/cmd_boot.c |   64 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 65 insertions(+), 27 deletions(-)
 create mode 100644 arch/x86/lib/cmd_boot.c

diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index d584aa4..7820895 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -32,6 +32,7 @@ SOBJS-$(CONFIG_SYS_X86_REALMODE)	+= realmode_switch.o
 COBJS-$(CONFIG_SYS_PC_BIOS)	+= bios_setup.o
 COBJS-y	+= board.o
 COBJS-y	+= bootm.o
+COBJS-y	+= cmd_boot.o
 COBJS-y	+= gcc.o
 COBJS-y	+= interrupts.o
 COBJS-$(CONFIG_SYS_PCAT_INTERRUPTS) += pcat_interrupts.o
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 52e27e1..533adf1 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -487,33 +487,6 @@ void hang(void)
 		;
 }
 
-unsigned long do_go_exec(ulong (*entry)(int, char * const []),
-			 int argc, char * const argv[])
-{
-	unsigned long ret = 0;
-	char **argv_tmp;
-
-	/*
-	 * x86 does not use a dedicated register to pass the pointer to
-	 * the global_data, so it is instead passed as argv[-1]. By using
-	 * argv[-1], the called 'Application' can use the contents of
-	 * argv natively. However, to safely use argv[-1] a new copy of
-	 * argv is needed with the extra element
-	 */
-	argv_tmp = malloc(sizeof(char *) * (argc + 1));
-
-	if (argv_tmp) {
-		argv_tmp[0] = (char *)gd;
-
-		memcpy(&argv_tmp[1], argv, (size_t)(sizeof(char *) * argc));
-
-		ret = (entry) (argc, &argv_tmp[1]);
-		free(argv_tmp);
-	}
-
-	return ret;
-}
-
 void setup_pcat_compatibility(void)
 	__attribute__((weak, alias("__setup_pcat_compatibility")));
 
diff --git a/arch/x86/lib/cmd_boot.c b/arch/x86/lib/cmd_boot.c
new file mode 100644
index 0000000..a81a9a3
--- /dev/null
+++ b/arch/x86/lib/cmd_boot.c
@@ -0,0 +1,64 @@
+/*
+ * (C) Copyright 2008-2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * (C) Copyright 2002
+ * Daniel Engstr?m, Omicron Ceti AB, <daniel@omicron.se>
+ *
+ * (C) Copyright 2002
+ * Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <command.h>
+#include <malloc.h>
+#include <asm/u-boot-x86.h>
+
+unsigned long do_go_exec(ulong (*entry)(int, char * const []),
+			 int argc, char * const argv[])
+{
+	unsigned long ret = 0;
+	char **argv_tmp;
+
+	/*
+	 * x86 does not use a dedicated register to pass the pointer to
+	 * the global_data, so it is instead passed as argv[-1]. By using
+	 * argv[-1], the called 'Application' can use the contents of
+	 * argv natively. However, to safely use argv[-1] a new copy of
+	 * argv is needed with the extra element
+	 */
+	argv_tmp = malloc(sizeof(char *) * (argc + 1));
+
+	if (argv_tmp) {
+		argv_tmp[0] = (char *)gd;
+
+		memcpy(&argv_tmp[1], argv, (size_t)(sizeof(char *) * argc));
+
+		ret = (entry) (argc, &argv_tmp[1]);
+		free(argv_tmp);
+	}
+
+	return ret;
+}
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 14/17] x86: Move setup_pcat_compatibility() out of board.c
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (12 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 13/17] x86: Move do_go_exec() out of board.c Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:48   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 15/17] x86: Move relocation code " Graeme Russ
                   ` (2 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/lib/board.c  |    7 -------
 arch/x86/lib/zimage.c |    7 +++++++
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 533adf1..993e7df 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -486,10 +486,3 @@ void hang(void)
 	for (;;)
 		;
 }
-
-void setup_pcat_compatibility(void)
-	__attribute__((weak, alias("__setup_pcat_compatibility")));
-
-void __setup_pcat_compatibility(void)
-{
-}
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index bb40517..2214286 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -314,6 +314,13 @@ void boot_zimage(void *setup_base, void *load_address)
 #endif
 }
 
+void setup_pcat_compatibility(void)
+	__attribute__((weak, alias("__setup_pcat_compatibility")));
+
+void __setup_pcat_compatibility(void)
+{
+}
+
 int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 {
 	struct boot_params *base_ptr;
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 15/17] x86: Move relocation code out of board.c
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (13 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 14/17] x86: Move setup_pcat_compatibility() " Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-02  4:09 ` [U-Boot] [PATCH 16/17] x86: Simplify board.c Graeme Russ
  2012-01-02  4:09 ` [U-Boot] [PATCH 17/17] x86: Tweak initialisation procedure Graeme Russ
  16 siblings, 0 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/lib/Makefile   |    1 +
 arch/x86/lib/board.c    |   69 +---------------------------
 arch/x86/lib/relocate.c |  115 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 118 insertions(+), 67 deletions(-)
 create mode 100644 arch/x86/lib/relocate.c

diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index 7820895..57b6896 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -40,6 +40,7 @@ COBJS-$(CONFIG_SYS_GENERIC_TIMER) += pcat_timer.o
 COBJS-$(CONFIG_PCI) += pci.o
 COBJS-$(CONFIG_PCI) += pci_type1.o
 COBJS-$(CONFIG_SYS_X86_REALMODE)	+= realmode.o
+COBJS-y	+= relocate.o
 COBJS-y	+= string.o
 COBJS-$(CONFIG_SYS_X86_ISR_TIMER)	+= timer.o
 COBJS-$(CONFIG_VIDEO)	+= video_bios.o
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 993e7df..fc7d0b7 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -41,7 +41,6 @@
 #include <ide.h>
 #include <serial.h>
 #include <asm/u-boot-x86.h>
-#include <elf.h>
 #include <asm/processor.h>
 
 #ifdef CONFIG_BITBANGMII
@@ -117,9 +116,6 @@ static void display_flash_config(ulong size)
 typedef int (init_fnc_t) (void);
 
 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);
 static int copy_gd_to_ram(void);
 
 init_fnc_t *init_sequence_f[] = {
@@ -183,59 +179,6 @@ static int calculate_relocation_address(void)
 	return 0;
 }
 
-static int copy_uboot_to_ram(void)
-{
-	size_t len = (size_t)(&__data_end) - (size_t)(&__text_start);
-
-	memcpy((void *)gd->relocaddr, (void *)&__text_start, len);
-
-	return 0;
-}
-
-static int clear_bss(void)
-{
-	ulong dst_addr = (ulong)(&__bss_start) + gd->reloc_off;
-	size_t len = (size_t)(&__bss_end) - (size_t)(&__bss_start);
-
-	memset((void *)dst_addr, 0x00, len);
-
-	return 0;
-}
-
-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);
-
-	Elf32_Addr *offset_ptr_rom;
-	Elf32_Addr *offset_ptr_ram;
-
-	/* The size of the region of u-boot that runs out of RAM. */
-	uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
-
-	do {
-		/* Get the location from the relocation entry */
-		offset_ptr_rom = (Elf32_Addr *)re_src->r_offset;
-
-		/* Check that the location of the relocation is in .text */
-		if (offset_ptr_rom >= (Elf32_Addr *)CONFIG_SYS_TEXT_BASE) {
-
-			/* Switch to the in-RAM version */
-			offset_ptr_ram = (Elf32_Addr *)((ulong)offset_ptr_rom +
-							gd->reloc_off);
-
-			/* Check that the target points into .text */
-			if (*offset_ptr_ram >= CONFIG_SYS_TEXT_BASE &&
-					*offset_ptr_ram <
-					(CONFIG_SYS_TEXT_BASE + size)) {
-				*offset_ptr_ram += 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)
 {
@@ -270,17 +213,9 @@ void board_init_f_r(void)
 	if (init_cache() != 0)
 		hang();
 
-	copy_uboot_to_ram();
-	clear_bss();
-	do_elf_reloc_fixups();
-
-	/*
-	 * Transfer execution from Flash to RAM by calculating the address
-	 * of the in-RAM copy of board_init_r() and calling it
-	 */
-	(board_init_r + gd->reloc_off)(gd, gd->relocaddr);
+	relocate_code(0, gd, 0);
 
-	/* NOTREACHED - board_init_r() does not return */
+	/* NOTREACHED - relocate_code() does not return */
 	while (1)
 		;
 }
diff --git a/arch/x86/lib/relocate.c b/arch/x86/lib/relocate.c
new file mode 100644
index 0000000..badb5f8
--- /dev/null
+++ b/arch/x86/lib/relocate.c
@@ -0,0 +1,115 @@
+/*
+ * (C) Copyright 2008-2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * (C) Copyright 2002
+ * Daniel Engstr?m, Omicron Ceti AB, <daniel@omicron.se>
+ *
+ * (C) Copyright 2002
+ * Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <malloc.h>
+#include <asm/u-boot-x86.h>
+#include <elf.h>
+
+static int copy_uboot_to_ram(void);
+static int clear_bss(void);
+static int do_elf_reloc_fixups(void);
+
+static int copy_uboot_to_ram(void)
+{
+	size_t len = (size_t)&__data_end - (size_t)&__text_start;
+
+	memcpy((void *)gd->relocaddr, (void *)&__text_start, len);
+
+	return 0;
+}
+
+static int clear_bss(void)
+{
+	ulong dst_addr = (ulong)&__bss_start + gd->reloc_off;
+	size_t len = (size_t)&__bss_end - (size_t)&__bss_start;
+
+	memset((void *)dst_addr, 0x00, len);
+
+	return 0;
+}
+
+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);
+
+	Elf32_Addr *offset_ptr_rom;
+	Elf32_Addr *offset_ptr_ram;
+
+	/* The size of the region of u-boot that runs out of RAM. */
+	uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
+
+	do {
+		/* Get the location from the relocation entry */
+		offset_ptr_rom = (Elf32_Addr *)re_src->r_offset;
+
+		/* Check that the location of the relocation is in .text */
+		if (offset_ptr_rom >= (Elf32_Addr *)CONFIG_SYS_TEXT_BASE) {
+
+			/* Switch to the in-RAM version */
+			offset_ptr_ram = (Elf32_Addr *)((ulong)offset_ptr_rom +
+							gd->reloc_off);
+
+			/* Check that the target points into .text */
+			if (*offset_ptr_ram >= CONFIG_SYS_TEXT_BASE &&
+					*offset_ptr_ram <
+					(CONFIG_SYS_TEXT_BASE + size)) {
+				*offset_ptr_ram += gd->reloc_off;
+			}
+		}
+	} while (re_src++ < re_end);
+
+	return 0;
+}
+
+void relocate_code(ulong dummy_1, gd_t *id, ulong dummy_2)
+{
+	/*
+	 * Copy U-Boot into RAM, clear the BSS and perform relocation
+	 * adjustments
+	 */
+	copy_uboot_to_ram();
+	clear_bss();
+	do_elf_reloc_fixups();
+
+	/*
+	 * Transfer execution from Flash to RAM by calculating the address
+	 * of the in-RAM copy of board_init_r() and calling it
+	 */
+	(board_init_r + gd->reloc_off)(gd, gd->relocaddr);
+
+	/* NOTREACHED - board_init_r() does not return */
+	while (1)
+		;
+}
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 16/17] x86: Simplify board.c
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (14 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 15/17] x86: Move relocation code " Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:51   ` Simon Glass
  2012-01-02  4:09 ` [U-Boot] [PATCH 17/17] x86: Tweak initialisation procedure Graeme Russ
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/include/asm/init_helpers.h  |   39 +++++
 arch/x86/include/asm/init_wrappers.h |   42 +++++
 arch/x86/lib/Makefile                |    2 +
 arch/x86/lib/board.c                 |  297 +++++++++-------------------------
 arch/x86/lib/init_helpers.c          |  142 ++++++++++++++++
 arch/x86/lib/init_wrappers.c         |  137 ++++++++++++++++
 6 files changed, 438 insertions(+), 221 deletions(-)
 create mode 100644 arch/x86/include/asm/init_helpers.h
 create mode 100644 arch/x86/include/asm/init_wrappers.h
 create mode 100644 arch/x86/lib/init_helpers.c
 create mode 100644 arch/x86/lib/init_wrappers.c

diff --git a/arch/x86/include/asm/init_helpers.h b/arch/x86/include/asm/init_helpers.h
new file mode 100644
index 0000000..14ef11a
--- /dev/null
+++ b/arch/x86/include/asm/init_helpers.h
@@ -0,0 +1,39 @@
+/*
+ * (C) Copyright 2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef _INIT_HELPERS_H_
+#define _INIT_HELPERS_H_
+
+int display_banner(void);
+int display_dram_config(void);
+int init_baudrate_f(void);
+
+int mem_malloc_init_r(void);
+int init_bd_struct_r(void);
+int flash_init_r(void);
+int init_ip_address_r(void);
+int status_led_set_r(void);
+int set_bootfile_r(void);
+int set_load_addr_r(void);
+
+#endif	/* !_INIT_HELPERS_H_ */
diff --git a/arch/x86/include/asm/init_wrappers.h b/arch/x86/include/asm/init_wrappers.h
new file mode 100644
index 0000000..899ffb1
--- /dev/null
+++ b/arch/x86/include/asm/init_wrappers.h
@@ -0,0 +1,42 @@
+/*
+ * (C) Copyright 2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef _INIT_WRAPPERS_H_
+#define _INIT_WRAPPERS_H_
+
+int serial_initialize_r(void);
+int env_relocate_r(void);
+int pci_init_r(void);
+int jumptable_init_r(void);
+int pcmcia_init_r(void);
+int kgdb_init_r(void);
+int enable_interrupts_r(void);
+int eth_initialize_r(void);
+int reset_phy_r(void);
+int ide_init_r(void);
+int scsi_init_r(void);
+int doc_init_r(void);
+int bb_miiphy_init_r(void);
+int post_run_r(void);
+
+#endif	/* !_INIT_WRAPPERS_H_ */
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index 57b6896..51836da 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -34,6 +34,8 @@ COBJS-y	+= board.o
 COBJS-y	+= bootm.o
 COBJS-y	+= cmd_boot.o
 COBJS-y	+= gcc.o
+COBJS-y	+= init_helpers.o
+COBJS-y	+= init_wrappers.o
 COBJS-y	+= interrupts.o
 COBJS-$(CONFIG_SYS_PCAT_INTERRUPTS) += pcat_interrupts.o
 COBJS-$(CONFIG_SYS_GENERIC_TIMER) += pcat_timer.o
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index fc7d0b7..f0a8e9c 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -33,62 +33,12 @@
 
 #include <common.h>
 #include <watchdog.h>
-#include <command.h>
 #include <stdio_dev.h>
-#include <version.h>
-#include <malloc.h>
-#include <net.h>
-#include <ide.h>
-#include <serial.h>
 #include <asm/u-boot-x86.h>
 #include <asm/processor.h>
 
-#ifdef CONFIG_BITBANGMII
-#include <miiphy.h>
-#endif
-
-/************************************************************************
- * Init Utilities							*
- ************************************************************************
- * Some of this code should be moved into the core functions,
- * or dropped completely,
- * but let's get it working (again) first...
- */
-static int init_baudrate(void)
-{
-	gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
-	return 0;
-}
-
-static int display_banner(void)
-{
-
-	printf("\n\n%s\n\n", version_string);
-
-	return 0;
-}
-
-static int display_dram_config(void)
-{
-	int i;
-
-	puts("DRAM Configuration:\n");
-
-	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
-		printf("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
-		print_size(gd->bd->bi_dram[i].size, "\n");
-	}
-
-	return 0;
-}
-
-#ifndef CONFIG_SYS_NO_FLASH
-static void display_flash_config(ulong size)
-{
-	puts("Flash: ");
-	print_size(size, "\n");
-}
-#endif
+#include <asm/init_helpers.h>
+#include <asm/init_wrappers.h>
 
 /*
  * Breath some life into the board...
@@ -122,7 +72,7 @@ init_fnc_t *init_sequence_f[] = {
 	cpu_init_f,
 	board_early_init_f,
 	env_init,
-	init_baudrate,
+	init_baudrate_f,
 	serial_init,
 	console_init_f,
 	dram_init_f,
@@ -132,17 +82,81 @@ init_fnc_t *init_sequence_f[] = {
 };
 
 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 */
-	interrupt_init,		/* set up exceptions */
+	init_bd_struct_r,
+	mem_malloc_init_r,
+	cpu_init_r,
+	board_early_init_r,
+	dram_init,
+	interrupt_init,
 	timer_init,
 	display_banner,
 	display_dram_config,
-
+#ifdef CONFIG_SERIAL_MULTI
+	serial_initialize_r,
+#endif
+#ifndef CONFIG_SYS_NO_FLASH
+	flash_init_r,
+#endif
+	env_relocate_r,
+#ifdef CONFIG_CMD_NET
+	init_ip_address_r,
+#endif
+#ifdef CONFIG_PCI
+	pci_init_r,
+#endif
+	stdio_init,
+	jumptable_init_r,
+	console_init_r,
+#ifdef CONFIG_MISC_INIT_R
+	misc_init_r,
+#endif
+#if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_CMD_IDE)
+	pci_init_r,
+#endif
+#if defined(CONFIG_CMD_KGDB)
+	kgdb_init_r,
+#endif
+	enable_interrupts_r,
+#ifdef CONFIG_STATUS_LED
+	status_led_set_r,
+#endif
+	set_load_addr_r,
+#if defined(CONFIG_CMD_NET)
+	set_bootfile_r,
+#endif
+#if defined(CONFIG_CMD_IDE)
+	ide_init_r,
+#endif
+#if defined(CONFIG_CMD_SCSI)
+	scsi_init_r,
+#endif
+#if defined(CONFIG_CMD_DOC)
+	doc_init_r,
+#endif
+#ifdef CONFIG_BITBANGMII
+	bb_miiphy_init_r,
+#endif
+#if defined(CONFIG_CMD_NET)
+	eth_initialize_r,
+#ifdef CONFIG_RESET_PHY_R
+	reset_phy_r,
+#endif
+#endif
+#ifdef CONFIG_LAST_STAGE_INIT
+	last_stage_init,
+#endif
 	NULL,
 };
 
+static void do_init_loop(init_fnc_t **init_fnc_ptr)
+{
+	for (; *init_fnc_ptr; ++init_fnc_ptr) {
+		WATCHDOG_RESET();
+		if ((*init_fnc_ptr)() != 0)
+			hang();
+	}
+}
+
 static int calculate_relocation_address(void)
 {
 	ulong text_start = (ulong)&__text_start;
@@ -179,17 +193,12 @@ static int calculate_relocation_address(void)
 	return 0;
 }
 
-/* Load U-Boot into RAM, initialize BSS, perform relocation adjustments */
+/* Perform all steps necessary to get RAM initialised ready for relocation */
 void board_init_f(ulong boot_flags)
 {
-	init_fnc_t **init_fnc_ptr;
-
 	gd->flags = boot_flags;
 
-	for (init_fnc_ptr = init_sequence_f; *init_fnc_ptr; ++init_fnc_ptr) {
-		if ((*init_fnc_ptr)() != 0)
-			hang();
-	}
+	do_init_loop(init_sequence_f);
 
 	/*
 	 * SDRAM is now initialised, U-Boot has been copied into SDRAM,
@@ -247,166 +256,12 @@ static int copy_gd_to_ram(void)
 
 void board_init_r(gd_t *id, ulong dest_addr)
 {
-#if defined(CONFIG_CMD_NET)
-	char *s;
-#endif
-#ifndef CONFIG_SYS_NO_FLASH
-	ulong size;
-#endif
-	static bd_t bd_data;
-	init_fnc_t **init_fnc_ptr;
-
-	show_boot_progress(0x21);
+	gd->flags |= GD_FLG_RELOC;
 
 	/* compiler optimization barrier needed for GCC >= 3.4 */
 	__asm__ __volatile__("" : : : "memory");
 
-	gd->flags |= GD_FLG_RELOC;
-
-	gd->bd = &bd_data;
-	memset(gd->bd, 0, sizeof(bd_t));
-	show_boot_progress(0x22);
-
-	gd->baudrate =  CONFIG_BAUDRATE;
-
-	mem_malloc_init((((ulong)dest_addr - CONFIG_SYS_MALLOC_LEN)+3)&~3,
-			CONFIG_SYS_MALLOC_LEN);
-
-	for (init_fnc_ptr = init_sequence_r; *init_fnc_ptr; ++init_fnc_ptr) {
-		if ((*init_fnc_ptr)() != 0)
-			hang();
-	}
-	show_boot_progress(0x23);
-
-#ifdef CONFIG_SERIAL_MULTI
-	serial_initialize();
-#endif
-
-#ifndef CONFIG_SYS_NO_FLASH
-	/* configure available FLASH banks */
-	size = flash_init();
-	display_flash_config(size);
-	show_boot_progress(0x24);
-#endif
-
-	show_boot_progress(0x25);
-
-	/* initialize environment */
-	env_relocate();
-	show_boot_progress(0x26);
-
-
-#ifdef CONFIG_CMD_NET
-	/* IP Address */
-	bd_data.bi_ip_addr = getenv_IPaddr("ipaddr");
-#endif
-
-#if defined(CONFIG_PCI)
-	/*
-	 * Do pci configuration
-	 */
-	pci_init();
-#endif
-
-	show_boot_progress(0x27);
-
-
-	stdio_init();
-
-	jumptable_init();
-
-	/* Initialize the console (after the relocation and devices init) */
-	console_init_r();
-
-#ifdef CONFIG_MISC_INIT_R
-	/* miscellaneous platform dependent initialisations */
-	misc_init_r();
-#endif
-
-#if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_CMD_IDE)
-	WATCHDOG_RESET();
-	puts("PCMCIA:");
-	pcmcia_init();
-#endif
-
-#if defined(CONFIG_CMD_KGDB)
-	WATCHDOG_RESET();
-	puts("KGDB:  ");
-	kgdb_init();
-#endif
-
-	/* enable exceptions */
-	enable_interrupts();
-	show_boot_progress(0x28);
-
-#ifdef CONFIG_STATUS_LED
-	status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
-#endif
-
-	udelay(20);
-
-	/* Initialize from environment */
-	load_addr = getenv_ulong("loadaddr", 16, load_addr);
-#if defined(CONFIG_CMD_NET)
-	s = getenv("bootfile");
-
-	if (s != NULL)
-		copy_filename(BootFile, s, sizeof(BootFile));
-#endif
-
-	WATCHDOG_RESET();
-
-#if defined(CONFIG_CMD_IDE)
-	WATCHDOG_RESET();
-	puts("IDE:   ");
-	ide_init();
-#endif
-
-#if defined(CONFIG_CMD_SCSI)
-	WATCHDOG_RESET();
-	puts("SCSI:  ");
-	scsi_init();
-#endif
-
-#if defined(CONFIG_CMD_DOC)
-	WATCHDOG_RESET();
-	puts("DOC:   ");
-	doc_init();
-#endif
-
-#ifdef CONFIG_BITBANGMII
-	bb_miiphy_init();
-#endif
-#if defined(CONFIG_CMD_NET)
-	WATCHDOG_RESET();
-	puts("Net:   ");
-	eth_initialize(gd->bd);
-#endif
-
-#if (defined(CONFIG_CMD_NET)) && (0)
-	WATCHDOG_RESET();
-# ifdef DEBUG
-	puts("Reset Ethernet PHY\n");
-# endif
-	reset_phy();
-#endif
-
-#ifdef CONFIG_LAST_STAGE_INIT
-	WATCHDOG_RESET();
-	/*
-	 * Some parts can be only initialized if all others (like
-	 * Interrupts) are up and running (i.e. the PC-style ISA
-	 * keyboard).
-	 */
-	last_stage_init();
-#endif
-
-
-#ifdef CONFIG_POST
-	post_run(NULL, POST_RAM | post_bootmode_get(0));
-#endif
-
-	show_boot_progress(0x29);
+	do_init_loop(init_sequence_r);
 
 	/* main_loop() can return to retry autoboot, if so just run it again. */
 	for (;;)
diff --git a/arch/x86/lib/init_helpers.c b/arch/x86/lib/init_helpers.c
new file mode 100644
index 0000000..547b180
--- /dev/null
+++ b/arch/x86/lib/init_helpers.c
@@ -0,0 +1,142 @@
+/*
+ * (C) Copyright 2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#include <common.h>
+#include <command.h>
+#include <stdio_dev.h>
+#include <version.h>
+#include <malloc.h>
+#include <net.h>
+#include <ide.h>
+#include <serial.h>
+#include <status_led.h>
+#include <asm/u-boot-x86.h>
+
+#include <asm/init_helpers.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/************************************************************************
+ * Init Utilities							*
+ ************************************************************************
+ * Some of this code should be moved into the core functions,
+ * or dropped completely,
+ * but let's get it working (again) first...
+ */
+
+int display_banner(void)
+{
+	printf("\n\n%s\n\n", version_string);
+
+	return 0;
+}
+
+int display_dram_config(void)
+{
+	int i;
+
+	puts("DRAM Configuration:\n");
+
+	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+		printf("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
+		print_size(gd->bd->bi_dram[i].size, "\n");
+	}
+
+	return 0;
+}
+
+int init_baudrate_f(void)
+{
+	gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
+	return 0;
+}
+
+int mem_malloc_init_r(void)
+{
+	mem_malloc_init(((gd->relocaddr - CONFIG_SYS_MALLOC_LEN)+3)&~3,
+			CONFIG_SYS_MALLOC_LEN);
+
+	return 0;
+}
+
+bd_t bd_data;
+
+int init_bd_struct_r(void)
+{
+	gd->bd = &bd_data;
+	memset(gd->bd, 0, sizeof(bd_t));
+
+	return 0;
+}
+
+#ifndef CONFIG_SYS_NO_FLASH
+int flash_init_r(void)
+{
+	ulong size;
+
+	puts("Flash: ");
+
+	/* configure available FLASH banks */
+	size = flash_init();
+
+	print_size(size, "\n");
+
+	return 0;
+}
+#endif
+
+int init_ip_address_r(void)
+{
+	/* IP Address */
+	bd_data.bi_ip_addr = getenv_IPaddr("ipaddr");
+
+	return 0;
+}
+
+#ifdef CONFIG_STATUS_LED
+int status_led_set_r(void)
+{
+	status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
+
+	return 0;
+}
+#endif
+
+int set_bootfile_r(void)
+{
+	char *s;
+
+	s = getenv("bootfile");
+
+	if (s != NULL)
+		copy_filename(BootFile, s, sizeof(BootFile));
+
+	return 0;
+}
+
+int set_load_addr_r(void)
+{
+	/* Initialize from environment */
+	load_addr = getenv_ulong("loadaddr", 16, load_addr);
+
+	return 0;
+}
diff --git a/arch/x86/lib/init_wrappers.c b/arch/x86/lib/init_wrappers.c
new file mode 100644
index 0000000..71449fe
--- /dev/null
+++ b/arch/x86/lib/init_wrappers.c
@@ -0,0 +1,137 @@
+/*
+ * (C) Copyright 2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#include <common.h>
+#include <serial.h>
+#include <kgdb.h>
+#include <scsi.h>
+#include <post.h>
+#include <miiphy.h>
+
+#include <asm/init_wrappers.h>
+
+int serial_initialize_r(void)
+{
+	serial_initialize();
+
+	return 0;
+}
+
+int env_relocate_r(void)
+{
+	/* initialize environment */
+	env_relocate();
+
+	return 0;
+}
+
+
+int pci_init_r(void)
+{
+	/* Do pci configuration */
+	pci_init();
+
+	return 0;
+}
+
+int jumptable_init_r(void)
+{
+	jumptable_init();
+
+	return 0;
+}
+
+int pcmcia_init_r(void)
+{
+	puts("PCMCIA:");
+	pcmcia_init();
+
+	return 0;
+}
+
+int kgdb_init_r(void)
+{
+	puts("KGDB:  ");
+	kgdb_init();
+
+	return 0;
+}
+
+int enable_interrupts_r(void)
+{
+	/* enable exceptions */
+	enable_interrupts();
+
+	return 0;
+}
+
+int eth_initialize_r(void)
+{
+	puts("Net:   ");
+	eth_initialize(gd->bd);
+
+	return 0;
+}
+
+int reset_phy_r(void)
+{
+#ifdef DEBUG
+	puts("Reset Ethernet PHY\n");
+#endif
+	reset_phy();
+
+	return 0;
+}
+
+int ide_init_r(void)
+{
+	puts("IDE:   ");
+	ide_init();
+
+	return 0;
+}
+
+int scsi_init_r(void)
+{
+	puts("SCSI:  ");
+	scsi_init();
+
+	return 0;
+}
+
+#ifdef CONFIG_BITBANGMII
+int bb_miiphy_init_r(void)
+{
+	bb_miiphy_init();
+
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_POST
+int post_run_r(void)
+{
+	post_run(NULL, POST_RAM | post_bootmode_get(0));
+
+	return 0;
+}
+#endif
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 17/17] x86: Tweak initialisation procedure
  2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
                   ` (15 preceding siblings ...)
  2012-01-02  4:09 ` [U-Boot] [PATCH 16/17] x86: Simplify board.c Graeme Russ
@ 2012-01-02  4:09 ` Graeme Russ
  2012-01-04  5:52   ` Simon Glass
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-02  4:09 UTC (permalink / raw)
  To: u-boot


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/include/asm/init_helpers.h |    5 +
 arch/x86/include/asm/relocate.h     |   33 ++++++
 arch/x86/lib/board.c                |  188 +++++++++++++++++------------------
 arch/x86/lib/init_helpers.c         |   75 ++++++++++++++
 arch/x86/lib/relocate.c             |   32 +-----
 5 files changed, 206 insertions(+), 127 deletions(-)
 create mode 100644 arch/x86/include/asm/relocate.h

diff --git a/arch/x86/include/asm/init_helpers.h b/arch/x86/include/asm/init_helpers.h
index 14ef11a..192f18e 100644
--- a/arch/x86/include/asm/init_helpers.h
+++ b/arch/x86/include/asm/init_helpers.h
@@ -27,7 +27,12 @@
 int display_banner(void);
 int display_dram_config(void);
 int init_baudrate_f(void);
+int calculate_relocation_address(void);
 
+int copy_gd_to_ram_f_r(void);
+int init_cache_f_r(void);
+
+int set_reloc_flag_r(void);
 int mem_malloc_init_r(void);
 int init_bd_struct_r(void);
 int flash_init_r(void);
diff --git a/arch/x86/include/asm/relocate.h b/arch/x86/include/asm/relocate.h
new file mode 100644
index 0000000..33129ef
--- /dev/null
+++ b/arch/x86/include/asm/relocate.h
@@ -0,0 +1,33 @@
+/*
+ * (C) Copyright 2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef _RELOCATE_H_
+#define _RELOCATE_H_
+
+#include <common.h>
+
+int copy_uboot_to_ram(void);
+int clear_bss(void);
+int do_elf_reloc_fixups(void);
+
+#endif	/* !_RELOCATE_H_ */
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index f0a8e9c..d45b8fd 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -35,7 +35,7 @@
 #include <watchdog.h>
 #include <stdio_dev.h>
 #include <asm/u-boot-x86.h>
-#include <asm/processor.h>
+#include <asm/relocate.h>
 
 #include <asm/init_helpers.h>
 #include <asm/init_wrappers.h>
@@ -43,31 +43,58 @@
 /*
  * Breath some life into the board...
  *
- * Initialize an SMC for serial comms, and carry out some hardware
- * tests.
+ * Getting the board up and running is a three-stage process:
+ *  1) Execute from Flash, SDRAM Uninitialised
+ *     At this point, there is a limited amount of non-SDRAM memory
+ *     (typically the CPU cache, but can also be SRAM or even a buffer of
+ *     of some peripheral). This limited memory is used to hold:
+ *      - The initial copy of the Global Data Structure
+ *      - A temporary stack
+ *      - A temporary x86 Global Descriptor Table
+ *      - The pre-console buffer (if enabled)
  *
- * The first part of initialization is running from Flash memory;
- * its main purpose is to initialize the RAM so that we
- * can relocate the monitor code to RAM.
+ *     The following is performed during this phase of execution:
+ *      - Core low-level CPU initialisation
+ *      - Console initialisation
+ *      - SDRAM initialisation
+ *
+ *  2) Execute from Flash, SDRAM Initialised
+ *     At this point we copy Global Data from the initial non-SDRAM
+ *     memory and set up the permanent stack in SDRAM. The CPU cache is no
+ *     longer being used as temporary memory, so we can now fully enable
+ *     it.
+ *
+ *     The following is performed during this phase of execution:
+ *      - Create final stack in SDRAM
+ *      - Copy Global Data from temporary memory to SDRAM
+ *      - Enabling of CPU cache(s),
+ *      - Copying of U-Boot code and data from Flash to RAM
+ *      - Clearing of the BSS
+ *      - ELF relocation adjustments
+ *
+ *  3) Execute from SDRAM
+ *     The following is performed during this phase of execution:
+ *      - All remaining initialisation
  */
 
 /*
- * All attempts to come up with a "common" initialization sequence
- * that works for all boards and architectures failed: some of the
- * requirements are just _too_ different. To get rid of the resulting
- * mess of board dependend #ifdef'ed code we now make the whole
- * initialization sequence configurable to the user.
- *
- * The requirements for any new initalization function is simple: it
- * receives a pointer to the "global data" structure as it's only
- * argument, and returns an integer return code, where 0 means
- * "continue" and != 0 means "fatal error, hang the system".
+ * The requirements for any new initalization function is simple: it is
+ * a function with no parameters which returns an integer return code,
+ * where 0 means "continue" and != 0 means "fatal error, hang the system"
  */
 typedef int (init_fnc_t) (void);
 
-static int calculate_relocation_address(void);
-static int copy_gd_to_ram(void);
-
+/*
+ * init_sequence_f is the list of init functions which are run when U-Boot
+ * is executing from Flash with a limited 'C' environment. The following
+ * limitations must be considered when implementing an '_f' function:
+ *  - 'static' variables are read-only
+ *  - Global Data (gd->xxx) is read/write
+ *  - Stack space is limited
+ *
+ * The '_f' sequence must, as a minimum, initialise SDRAM. It _should_
+ * also initialise the console (to provide early debug output)
+ */
 init_fnc_t *init_sequence_f[] = {
 	cpu_init_f,
 	board_early_init_f,
@@ -81,7 +108,39 @@ init_fnc_t *init_sequence_f[] = {
 	NULL,
 };
 
+/*
+ * init_sequence_f_r is the list of init functions which are run when
+ * U-Boot is executing from Flash with a semi-limited 'C' environment.
+ * The following limitations must be considered when implementing an
+ * '_f_r' function:
+ *  - 'static' variables are read-only
+ *  - Global Data (gd->xxx) is read/write
+ *
+ * The '_f_r' sequence must, as a minimum, copy U-Boot to RAM (if
+ * supported).  It _should_, if possible, copy global data to RAM and
+ * initialise the CPU caches (to speed up the relocation process)
+ */
+init_fnc_t *init_sequence_f_r[] = {
+	copy_gd_to_ram_f_r,
+	init_cache_f_r,
+	copy_uboot_to_ram,
+	clear_bss,
+	do_elf_reloc_fixups,
+
+	NULL,
+};
+
+/*
+ * init_sequence_r is the list of init functions which are run when U-Boot
+ * is executing from RAM with a full 'C' environment. There are no longer
+ * any limitations which must be considered when implementing an '_r'
+ * function, (i.e.'static' variables are read/write)
+ *
+ * If not already done, the '_r' sequence must copy global data to RAM and
+ * (should) initialise the CPU caches.
+ */
 init_fnc_t *init_sequence_r[] = {
+	set_reloc_flag_r,
 	init_bd_struct_r,
 	mem_malloc_init_r,
 	cpu_init_r,
@@ -157,54 +216,14 @@ static void do_init_loop(init_fnc_t **init_fnc_ptr)
 	}
 }
 
-static int calculate_relocation_address(void)
-{
-	ulong text_start = (ulong)&__text_start;
-	ulong bss_end = (ulong)&__bss_end;
-	ulong dest_addr;
-
-	/*
-	 * NOTE: All destination address are rounded down to 16-byte
-	 *       boundary to satisfy various worst-case alignment
-	 *       requirements
-	 */
-
-	/* Global Data is at top of available memory */
-	dest_addr = gd->ram_size;
-	dest_addr -= GENERATED_GBL_DATA_SIZE;
-	dest_addr &= ~15;
-	gd->new_gd_addr = dest_addr;
-
-	/* GDT is below Global Data */
-	dest_addr -= GDT_SIZE;
-	dest_addr &= ~15;
-	gd->gdt_addr = dest_addr;
-
-	/* Stack is below GDT */
-	gd->start_addr_sp = dest_addr;
-
-	/* U-Boot is below the stack */
-	dest_addr -= CONFIG_SYS_STACK_SIZE;
-	dest_addr -= (bss_end - text_start);
-	dest_addr &= ~15;
-	gd->relocaddr = dest_addr;
-	gd->reloc_off = (dest_addr - text_start);
-
-	return 0;
-}
-
-/* Perform all steps necessary to get RAM initialised ready for relocation */
 void board_init_f(ulong boot_flags)
 {
-	gd->flags = boot_flags;
-
 	do_init_loop(init_sequence_f);
 
 	/*
-	 * SDRAM is now initialised, U-Boot has been copied into SDRAM,
-	 * the BSS has been cleared etc. The final stack can now be setup
-	 * in SDRAM. Code execution will continue (momentarily) in Flash,
-	 * but with the stack in SDRAM and Global Data in temporary memory
+	 * SDRAM and console are now initialised. The final stack can now
+	 * be setup in SDRAM. Code execution will continue in Flash, but
+	 * with the stack in SDRAM and Global Data in temporary memory
 	 * (CPU cache)
 	 */
 	board_init_f_r_trampoline(gd->start_addr_sp);
@@ -216,51 +235,22 @@ void board_init_f(ulong boot_flags)
 
 void board_init_f_r(void)
 {
-	if (copy_gd_to_ram() != 0)
-		hang();
-
-	if (init_cache() != 0)
-		hang();
-
-	relocate_code(0, gd, 0);
-
-	/* NOTREACHED - relocate_code() does not return */
-	while (1)
-		;
-}
-
-static int copy_gd_to_ram(void)
-{
-	gd_t *ram_gd;
+	do_init_loop(init_sequence_f_r);
 
 	/*
-	 * Global data is still in temporary memory (the CPU cache).
-	 * calculate_relocation_address() has set gd->new_gd_addr to
-	 * where the global data lives in RAM but getting it there
-	 * safely is a bit tricky due to the 'F-Segment Hack' that
-	 * we need to use for x86
+	 * U-Boot has been copied into SDRAM, the BSS has been cleared etc.
+	 * Transfer execution from Flash to RAM by calculating the address
+	 * of the in-RAM copy of board_init_r() and calling it
 	 */
-	ram_gd = (gd_t *)gd->new_gd_addr;
-	memcpy((void *)ram_gd, gd, sizeof(gd_t));
+	(board_init_r + gd->reloc_off)(gd, gd->relocaddr);
 
-	/*
-	 * Reload the Global Descriptor Table so FS points to the
-	 * in-RAM copy of Global Data (calculate_relocation_address()
-	 * has already calculated the in-RAM location of the GDT)
-	 */
-	ram_gd->gd_addr = (ulong)ram_gd;
-	init_gd(ram_gd, (u64 *)gd->gdt_addr);
-
-	return 0;
+	/* NOTREACHED - board_init_r() does not return */
+	while (1)
+		;
 }
 
 void board_init_r(gd_t *id, ulong dest_addr)
 {
-	gd->flags |= GD_FLG_RELOC;
-
-	/* compiler optimization barrier needed for GCC >= 3.4 */
-	__asm__ __volatile__("" : : : "memory");
-
 	do_init_loop(init_sequence_r);
 
 	/* main_loop() can return to retry autoboot, if so just run it again. */
diff --git a/arch/x86/lib/init_helpers.c b/arch/x86/lib/init_helpers.c
index 547b180..acc825b 100644
--- a/arch/x86/lib/init_helpers.c
+++ b/arch/x86/lib/init_helpers.c
@@ -29,6 +29,7 @@
 #include <ide.h>
 #include <serial.h>
 #include <status_led.h>
+#include <asm/processor.h>
 #include <asm/u-boot-x86.h>
 
 #include <asm/init_helpers.h>
@@ -70,6 +71,80 @@ int init_baudrate_f(void)
 	return 0;
 }
 
+int calculate_relocation_address(void)
+{
+	ulong text_start = (ulong)&__text_start;
+	ulong bss_end = (ulong)&__bss_end;
+	ulong dest_addr;
+
+	/*
+	 * NOTE: All destination address are rounded down to 16-byte
+	 *       boundary to satisfy various worst-case alignment
+	 *       requirements
+	 */
+
+	/* Global Data is at top of available memory */
+	dest_addr = gd->ram_size;
+	dest_addr -= GENERATED_GBL_DATA_SIZE;
+	dest_addr &= ~15;
+	gd->new_gd_addr = dest_addr;
+
+	/* GDT is below Global Data */
+	dest_addr -= GDT_SIZE;
+	dest_addr &= ~15;
+	gd->gdt_addr = dest_addr;
+
+	/* Stack is below GDT */
+	gd->start_addr_sp = dest_addr;
+
+	/* U-Boot is below the stack */
+	dest_addr -= CONFIG_SYS_STACK_SIZE;
+	dest_addr -= (bss_end - text_start);
+	dest_addr &= ~15;
+	gd->relocaddr = dest_addr;
+	gd->reloc_off = (dest_addr - text_start);
+
+	return 0;
+}
+
+int copy_gd_to_ram_f_r(void)
+{
+	gd_t *ram_gd;
+
+	/*
+	 * Global data is still in temporary memory (the CPU cache).
+	 * calculate_relocation_address() has set gd->new_gd_addr to
+	 * where the global data lives in RAM but getting it there
+	 * safely is a bit tricky due to the 'F-Segment Hack' that
+	 * we need to use for x86
+	 */
+	ram_gd = (gd_t *)gd->new_gd_addr;
+	memcpy((void *)ram_gd, gd, sizeof(gd_t));
+
+	/*
+	 * Reload the Global Descriptor Table so FS points to the
+	 * in-RAM copy of Global Data (calculate_relocation_address()
+	 * has already calculated the in-RAM location of the GDT)
+	 */
+	ram_gd->gd_addr = (ulong)ram_gd;
+	init_gd(ram_gd, (u64 *)gd->gdt_addr);
+
+	return 0;
+}
+
+int init_cache_f_r(void)
+{
+	/* Initialise the CPU cache(s) */
+	return init_cache();
+}
+
+int set_reloc_flag_r(void)
+{
+	gd->flags = boot_flags;
+
+	return 0;
+}
+
 int mem_malloc_init_r(void)
 {
 	mem_malloc_init(((gd->relocaddr - CONFIG_SYS_MALLOC_LEN)+3)&~3,
diff --git a/arch/x86/lib/relocate.c b/arch/x86/lib/relocate.c
index badb5f8..200baab 100644
--- a/arch/x86/lib/relocate.c
+++ b/arch/x86/lib/relocate.c
@@ -34,13 +34,10 @@
 #include <common.h>
 #include <malloc.h>
 #include <asm/u-boot-x86.h>
+#include <asm/relocate.h>
 #include <elf.h>
 
-static int copy_uboot_to_ram(void);
-static int clear_bss(void);
-static int do_elf_reloc_fixups(void);
-
-static int copy_uboot_to_ram(void)
+int copy_uboot_to_ram(void)
 {
 	size_t len = (size_t)&__data_end - (size_t)&__text_start;
 
@@ -49,7 +46,7 @@ static int copy_uboot_to_ram(void)
 	return 0;
 }
 
-static int clear_bss(void)
+int clear_bss(void)
 {
 	ulong dst_addr = (ulong)&__bss_start + gd->reloc_off;
 	size_t len = (size_t)&__bss_end - (size_t)&__bss_start;
@@ -59,7 +56,7 @@ static int clear_bss(void)
 	return 0;
 }
 
-static int do_elf_reloc_fixups(void)
+int do_elf_reloc_fixups(void)
 {
 	Elf32_Rel *re_src = (Elf32_Rel *)(&__rel_dyn_start);
 	Elf32_Rel *re_end = (Elf32_Rel *)(&__rel_dyn_end);
@@ -92,24 +89,3 @@ static int do_elf_reloc_fixups(void)
 
 	return 0;
 }
-
-void relocate_code(ulong dummy_1, gd_t *id, ulong dummy_2)
-{
-	/*
-	 * Copy U-Boot into RAM, clear the BSS and perform relocation
-	 * adjustments
-	 */
-	copy_uboot_to_ram();
-	clear_bss();
-	do_elf_reloc_fixups();
-
-	/*
-	 * Transfer execution from Flash to RAM by calculating the address
-	 * of the in-RAM copy of board_init_r() and calling it
-	 */
-	(board_init_r + gd->reloc_off)(gd, gd->relocaddr);
-
-	/* NOTREACHED - board_init_r() does not return */
-	while (1)
-		;
-}
-- 
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 01/17] x86: Import glibc memcpy implementation
  2012-01-02  4:09 ` [U-Boot] [PATCH 01/17] x86: Import glibc memcpy implementation Graeme Russ
@ 2012-01-04  5:18   ` Simon Glass
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
  1 sibling, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:18 UTC (permalink / raw)
  To: u-boot

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Taken from glibc version 2.14.90
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> ?arch/x86/include/asm/string.h | ? ?2 +-
> ?arch/x86/lib/string.c ? ? ? ? | ? 61 +++++++++++++++++++++++++++++++++++++++++
> ?2 files changed, 62 insertions(+), 1 deletions(-)
>
> diff --git a/arch/x86/include/asm/string.h b/arch/x86/include/asm/string.h
> index 3aa6c11..0ad612f 100644
> --- a/arch/x86/include/asm/string.h
> +++ b/arch/x86/include/asm/string.h
> @@ -14,7 +14,7 @@ extern char * strrchr(const char * s, int c);
> ?#undef __HAVE_ARCH_STRCHR
> ?extern char * strchr(const char * s, int c);
>
> -#undef __HAVE_ARCH_MEMCPY
> +#define __HAVE_ARCH_MEMCPY
> ?extern void * memcpy(void *, const void *, __kernel_size_t);
>
> ?#undef __HAVE_ARCH_MEMMOVE
> diff --git a/arch/x86/lib/string.c b/arch/x86/lib/string.c
> index f2ea7e4..1fde81b 100644
> --- a/arch/x86/lib/string.c
> +++ b/arch/x86/lib/string.c
> @@ -85,3 +85,64 @@ void *memset(void *dstpp, int c, size_t len)
>
> ? ? ? ?return dstpp;
> ?}
> +
> +#define ? ? ? ?OP_T_THRES ? ? ?8
> +#define OPSIZ ?(sizeof(op_t))
> +
> +#define BYTE_COPY_FWD(dst_bp, src_bp, nbytes) ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> +do { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? int __d0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? asm volatile( ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? /* Clear the direction flag, so copying goes forward. ?*/ \
> + ? ? ? ? ? ? ? "cld\n" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? /* Copy bytes. ?*/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? ? ? ? ? "rep\n" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? "movsb" : ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? "=D" (dst_bp), "=S" (src_bp), "=c" (__d0) : ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? "0" (dst_bp), "1" (src_bp), "2" (nbytes) : ? ? ? ? ? ? ? ?\
> + ? ? ? ? ? ? ? "memory"); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> +} while (0)
> +
> +#define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes) ? ? ? ? ? ? ? \
> +do { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? int __d0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? asm volatile( ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? /* Clear the direction flag, so copying goes forward. ?*/ \
> + ? ? ? ? ? ? ? "cld\n" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? /* Copy longwords. ?*/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? ? ? ? ? "rep\n" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? "movsl" : ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? "=D" (dst_bp), "=S" (src_bp), "=c" (__d0) : ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? "0" (dst_bp), "1" (src_bp), "2" ((nbytes) / 4) : ? ? ? ? ?\
> + ? ? ? ? ? ? ? "memory"); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? (nbytes_left) = (nbytes) % 4; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> +} while (0)
> +
> +void *memcpy(void *dstpp, const void *srcpp, size_t len)
> +{
> + ? ? ? unsigned long int dstp = (long int)dstpp;
> + ? ? ? unsigned long int srcp = (long int)srcpp;
> +
> + ? ? ? /* Copy from the beginning to the end. ?*/
> +
> + ? ? ? /* If there not too few bytes to copy, use word copy. ?*/
> + ? ? ? if (len >= OP_T_THRES) {
> + ? ? ? ? ? ? ? /* Copy just a few bytes to make DSTP aligned. ?*/
> + ? ? ? ? ? ? ? len -= (-dstp) % OPSIZ;
> + ? ? ? ? ? ? ? BYTE_COPY_FWD(dstp, srcp, (-dstp) % OPSIZ);
> +
> + ? ? ? ? ? ? ? /* Copy from SRCP to DSTP taking advantage of the known
> + ? ? ? ? ? ? ? ?* alignment of DSTP. ?Number of bytes remaining is put
> + ? ? ? ? ? ? ? ?* in the third argument, i.e. in LEN. ?This number may
> + ? ? ? ? ? ? ? ?* vary from machine to machine.
> + ? ? ? ? ? ? ? ?*/
> + ? ? ? ? ? ? ? WORD_COPY_FWD(dstp, srcp, len, len);
> +
> + ? ? ? ? ? ? ? /* Fall out and copy the tail. ?*/
> + ? ? ? }
> +
> + ? ? ? /* There are just a few bytes to copy. Use byte memory operations. */
> + ? ? ? BYTE_COPY_FWD(dstp, srcp, len);
> +
> + ? ? ? return dstpp;
> +}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 02/17] x86: Speed up copy-to-RAM and clear BSS operations
  2012-01-02  4:09 ` [U-Boot] [PATCH 02/17] x86: Speed up copy-to-RAM and clear BSS operations Graeme Russ
@ 2012-01-04  5:21   ` Simon Glass
  2012-01-04 10:04     ` Graeme Russ
  0 siblings, 1 reply; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:21 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
> The implementations of memcpy and memset are now the optimised versions
> from glibc, so use them instead of simple copy loops
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> ?arch/x86/lib/board.c | ? 17 +++++------------
> ?1 files changed, 5 insertions(+), 12 deletions(-)
>
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index d742fec..ba6b59f 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -188,26 +188,19 @@ static int calculate_relocation_address(void)
>
> ?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;
> + ? ? ? size_t len = (size_t)(&__data_end) - (size_t)(&__text_start);

Extra brackets here. Also is the type of these not char[] already? Same Q below.

>
> - ? ? ? while (src_addr < end_addr)
> - ? ? ? ? ? ? ? *dst_addr++ = *src_addr++;
> + ? ? ? memcpy((void *)gd->relocaddr, (void *)&__text_start, len);
>
> ? ? ? ?return 0;
> ?}
>
> ?static int clear_bss(void)
> ?{
> - ? ? ? void *bss_start = &__bss_start;
> - ? ? ? void *bss_end = &__bss_end;
> + ? ? ? ulong dst_addr = (ulong)(&__bss_start) + gd->reloc_off;
> + ? ? ? size_t len = (size_t)(&__bss_end) - (size_t)(&__bss_start);
>
> - ? ? ? ulong *dst_addr = (ulong *)(bss_start + gd->reloc_off);
> - ? ? ? ulong *end_addr = (ulong *)(bss_end + gd->reloc_off);
> -
> - ? ? ? while (dst_addr < end_addr)
> - ? ? ? ? ? ? ? *dst_addr++ = 0x00000000;
> + ? ? ? memset((void *)dst_addr, 0x00, len);
>
> ? ? ? ?return 0;
> ?}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 03/17] x86: Remove GDR related magic numbers
  2012-01-02  4:09 ` [U-Boot] [PATCH 03/17] x86: Remove GDR related magic numbers Graeme Russ
@ 2012-01-04  5:23   ` Simon Glass
  2012-01-04 10:20     ` Graeme Russ
  0 siblings, 1 reply; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:23 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> ?arch/x86/cpu/start.S ? ? ? ? ? ? | ? ?3 ++-
> ?arch/x86/include/asm/processor.h | ? ?6 +++++-
> ?2 files changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
> index f87633b..7f9b6a7 100644
> --- a/arch/x86/cpu/start.S
> +++ b/arch/x86/cpu/start.S
> @@ -29,6 +29,7 @@
> ?#include <config.h>
> ?#include <version.h>
> ?#include <asm/global_data.h>
> +#include <asm/processor.h>
> ?#include <asm/processor-flags.h>
> ?#include <generated/asm-offsets.h>
>
> @@ -58,7 +59,7 @@ _start:
> ? ? ? ?/* This is the 32-bit cold-reset entry point */
>
> ? ? ? ?/* Load the segement registes to match the gdt loaded in start16.S */
> - ? ? ? movl ? ?$0x18, %eax
> + ? ? ? movl ? ?$(GDT_ENTRY_32BIT_DS * 8), %eax
> ? ? ? ?movw ? ?%ax, %fs
> ? ? ? ?movw ? ?%ax, %ds
> ? ? ? ?movw ? ?%ax, %gs
> diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
> index 1e5dccd..203c63a 100644
> --- a/arch/x86/include/asm/processor.h
> +++ b/arch/x86/include/asm/processor.h
> @@ -24,9 +24,13 @@
> ?#ifndef __ASM_PROCESSOR_H_
> ?#define __ASM_PROCESSOR_H_ 1
>
> -#define GDT_ENTRY_32BIT_CS ? ? 2
> +#define GDT_ENTRY_NULL ? ? ? ? 0
> +#define GDT_ENTRY_UNUSED ? ? ? (GDT_ENTRY_NULL + 1)
> +#define GDT_ENTRY_32BIT_CS ? ? (GDT_ENTRY_UNUSED + 1)
> ?#define GDT_ENTRY_32BIT_DS ? ? (GDT_ENTRY_32BIT_CS + 1)
> ?#define GDT_ENTRY_16BIT_CS ? ? (GDT_ENTRY_32BIT_DS + 1)
> ?#define GDT_ENTRY_16BIT_DS ? ? (GDT_ENTRY_16BIT_CS + 1)

>
> +#define GDT_NUM_ENTRIES ? ? ? ? ? ? ? ?(GDT_ENTRY_16BIT_DS + 1)
> +

Ick - any reason not to use an enum here?

Regards,
Simon

> ?#endif
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 04/17] x86: Rework Global Descriptor Table loading
  2012-01-02  4:09 ` [U-Boot] [PATCH 04/17] x86: Rework Global Descriptor Table loading Graeme Russ
@ 2012-01-04  5:24   ` Simon Glass
  2012-01-04 10:30     ` Graeme Russ
  0 siblings, 1 reply; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:24 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>

This probably needs a commit message?

Regards,
Simon

> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> ?arch/x86/cpu/cpu.c | ? 82 +++++++++++++++++++++++++++++++++------------------
> ?1 files changed, 53 insertions(+), 29 deletions(-)
>
> diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
> index 61d0b69..bf55c26 100644
> --- a/arch/x86/cpu/cpu.c
> +++ b/arch/x86/cpu/cpu.c
> @@ -55,35 +55,39 @@ struct gdt_ptr {
> ? ? ? ?u32 ptr;
> ?} __packed;
>
> -static void reload_gdt(void)
> +static void load_ds(u32 segment)
> ?{
> - ? ? ? /*
> - ? ? ? ?* There are machines which are known to not boot with the GDT
> - ? ? ? ?* being 8-byte unaligned. ?Intel recommends 16 byte alignment
> - ? ? ? ?*/
> - ? ? ? static const u64 boot_gdt[] __attribute__((aligned(16))) = {
> - ? ? ? ? ? ? ? /* CS: code, read/execute, 4 GB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
> - ? ? ? ? ? ? ? /* DS: data, read/write, 4 GB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
> - ? ? ? ? ? ? ? /* 16-bit CS: code, read/execute, 64 kB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
> - ? ? ? ? ? ? ? /* 16-bit DS: data, read/write, 64 kB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
> - ? ? ? };
> - ? ? ? static struct gdt_ptr gdt;
> -
> - ? ? ? gdt.len = sizeof(boot_gdt)-1;
> - ? ? ? gdt.ptr = (u32)&boot_gdt;
> -
> - ? ? ? asm volatile("lgdtl %0\n" \
> - ? ? ? ? ? ? ? ? ? ?"movl $((2+1)*8), %%ecx\n" \
> - ? ? ? ? ? ? ? ? ? ?"movl %%ecx, %%ds\n" \
> - ? ? ? ? ? ? ? ? ? ?"movl %%ecx, %%es\n" \
> - ? ? ? ? ? ? ? ? ? ?"movl %%ecx, %%fs\n" \
> - ? ? ? ? ? ? ? ? ? ?"movl %%ecx, %%gs\n" \
> - ? ? ? ? ? ? ? ? ? ?"movl %%ecx, %%ss" \
> - ? ? ? ? ? ? ? ? ? ?: : "m" (gdt) : "ecx");
> + ? ? ? asm volatile("movl %0, %%ds" : : "r" (segment * 8));
> +}
> +
> +static void load_es(u32 segment)
> +{
> + ? ? ? asm volatile("movl %0, %%es" : : "r" (segment * 8));
> +}
> +
> +static void load_fs(u32 segment)
> +{
> + ? ? ? asm volatile("movl %0, %%fs" : : "r" (segment * 8));
> +}
> +
> +static void load_gs(u32 segment)
> +{
> + ? ? ? asm volatile("movl %0, %%gs" : : "r" (segment * 8));
> +}
> +
> +static void load_ss(u32 segment)
> +{
> + ? ? ? asm volatile("movl %0, %%ss" : : "r" (segment * 8));
> +}
> +
> +static void load_gdt(const u64 *boot_gdt, u16 num_entries)
> +{
> + ? ? ? struct gdt_ptr gdt;
> +
> + ? ? ? gdt.len = (num_entries * 8) - 1;
> + ? ? ? gdt.ptr = (u32)boot_gdt;
> +
> + ? ? ? asm volatile("lgdtl %0\n" : : "m" (gdt));
> ?}
>
> ?int x86_cpu_init_f(void)
> @@ -113,7 +117,27 @@ int x86_cpu_init_r(void)
> ? ? ? ? ? ?"movl ? ? ? %%eax, %%cr0\n"
> ? ? ? ? ? ?"wbinvd\n" : : "i" (nw_cd_rst) : "eax");
>
> - ? ? ? reload_gdt();
> + ? ? ? /*
> + ? ? ? ?* There are machines which are known to not boot with the GDT
> + ? ? ? ?* being 8-byte unaligned. Intel recommends 16 byte alignment
> + ? ? ? ?*/
> + ? ? ? static const u64 boot_gdt[] __aligned(16) = {
> + ? ? ? ? ? ? ? /* CS: code, read/execute, 4 GB, base 0 */
> + ? ? ? ? ? ? ? [GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
> + ? ? ? ? ? ? ? /* DS: data, read/write, 4 GB, base 0 */
> + ? ? ? ? ? ? ? [GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
> + ? ? ? ? ? ? ? /* 16-bit CS: code, read/execute, 64 kB, base 0 */
> + ? ? ? ? ? ? ? [GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
> + ? ? ? ? ? ? ? /* 16-bit DS: data, read/write, 64 kB, base 0 */
> + ? ? ? ? ? ? ? [GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
> + ? ? ? };
> +
> + ? ? ? load_gdt(boot_gdt, GDT_NUM_ENTRIES);
> + ? ? ? load_ds(GDT_ENTRY_32BIT_DS);
> + ? ? ? load_es(GDT_ENTRY_32BIT_DS);
> + ? ? ? load_fs(GDT_ENTRY_32BIT_DS);
> + ? ? ? load_gs(GDT_ENTRY_32BIT_DS);
> + ? ? ? load_ss(GDT_ENTRY_32BIT_DS);
>
> ? ? ? ?/* Initialize core interrupt and exception functionality of CPU */
> ? ? ? ?cpu_init_interrupts();
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 05/17] x86: Simplify Flash-to-RAM code execution transition
  2012-01-02  4:09 ` [U-Boot] [PATCH 05/17] x86: Simplify Flash-to-RAM code execution transition Graeme Russ
@ 2012-01-04  5:28   ` Simon Glass
  2012-01-04 10:59     ` Graeme Russ
  0 siblings, 1 reply; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:28 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Commit message?

> ---
> ?arch/x86/cpu/start.S ? ? ? ? ? ? ?| ? 20 +++++---------------
> ?arch/x86/include/asm/u-boot-x86.h | ? ?2 ++
> ?arch/x86/lib/board.c ? ? ? ? ? ? ?| ? 25 ++++++++++++++++++++++---
> ?3 files changed, 29 insertions(+), 18 deletions(-)
>
> diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
> index 7f9b6a7..9592158 100644
> --- a/arch/x86/cpu/start.S
> +++ b/arch/x86/cpu/start.S
> @@ -96,32 +96,22 @@ car_init_ret:
> ? ? ? ?movw ? ?$0x85, %ax
> ? ? ? ?jmp ? ? die
>
> -.globl relocate_code
> -.type relocate_code, @function
> -relocate_code:
> +.globl board_init_f_r_trampoline
> +.type board_init_f_r_trampoline, @function
> +board_init_f_r_trampoline:
> ? ? ? ?/*
> ? ? ? ? * SDRAM has been initialised, U-Boot code has been copied into
> ? ? ? ? * RAM, BSS has been cleared and relocation adjustments have been
> ? ? ? ? * made. It is now time to jump into the in-RAM copy of U-Boot
> ? ? ? ? *
> ? ? ? ? * %eax = Address of top of stack

*new* top of stack?

> - ? ? ? ?* %edx = Address of Global Data
> - ? ? ? ?* %ecx = Base address of in-RAM copy of U-Boot
> ? ? ? ? */
>
> ? ? ? ?/* Setup stack in RAM */
> ? ? ? ?movl ? ?%eax, %esp
>
> - ? ? ? /* Setup call address of in-RAM copy of board_init_r() */
> - ? ? ? movl ? ?$board_init_r, %ebp
> - ? ? ? addl ? ?(GENERATED_GD_RELOC_OFF)(%edx), %ebp
> -
> - ? ? ? /* Setup parameters to board_init_r() */
> - ? ? ? movl ? ?%edx, %eax
> - ? ? ? movl ? ?%ecx, %edx
> -
> - ? ? ? /* Jump to in-RAM copy of board_init_r() */
> - ? ? ? call ? ?*%ebp
> + ? ? ? /* Re-enter U-Boot by calling board_init_f_r */
> + ? ? ? call ? ?board_init_f_r

Isn't this a bit of a funny name? Why not call it something like
call_board_init_r() ?

>
> ?die:
> ? ? ? ?hlt
> diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
> index 755f88a..c3d2277 100644
> --- a/arch/x86/include/asm/u-boot-x86.h
> +++ b/arch/x86/include/asm/u-boot-x86.h
> @@ -61,5 +61,7 @@ u32 isa_map_rom(u32 bus_addr, int size);
> ?int video_bios_init(void);
> ?int video_init(void);
>
> +void ? board_init_f_r_trampoline(ulong) __attribute__ ((noreturn));
> +void ? board_init_f_r(void) __attribute__ ((noreturn));
>
> ?#endif /* _U_BOOT_I386_H_ */
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index ba6b59f..978beaa 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -253,10 +253,29 @@ void board_init_f(ulong boot_flags)
>
> ? ? ? ?gd->flags |= GD_FLG_RELOC;
>
> - ? ? ? /* Enter the relocated U-Boot! */
> - ? ? ? relocate_code(gd->start_addr_sp, gd, gd->relocaddr);
> + ? ? ? /*
> + ? ? ? ?* SDRAM is now initialised, U-Boot has been copied into SDRAM,
> + ? ? ? ?* the BSS has been cleared etc. The final stack can now be setup
> + ? ? ? ?* in SDRAM. Code execution will continue (momentarily) in Flash,
> + ? ? ? ?* but with the stack in SDRAM and Global Data in temporary memory
> + ? ? ? ?* (CPU cache)
> + ? ? ? ?*/
> + ? ? ? board_init_f_r_trampoline(gd->start_addr_sp);
> +
> + ? ? ? /* NOTREACHED - board_init_f_r_trampoline() does not return */
> + ? ? ? while (1)
> + ? ? ? ? ? ? ? ;
> +}
> +
> +void board_init_f_r(void)
> +{
> + ? ? ? /*
> + ? ? ? ?* Transfer execution from Flash to RAM by calculating the address
> + ? ? ? ?* of the in-RAM copy of board_init_r() and calling it
> + ? ? ? ?*/
> + ? ? ? (board_init_r + gd->reloc_off)(gd, gd->relocaddr);

Nice that this is in C.

Regards,
Simon

>
> - ? ? ? /* NOTREACHED - relocate_code() does not return */
> + ? ? ? /* NOTREACHED - board_init_r() does not return */
> ? ? ? ?while (1)
> ? ? ? ? ? ? ? ?;
> ?}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 06/17] x86: Rework relocation calcuations
  2012-01-02  4:09 ` [U-Boot] [PATCH 06/17] x86: Rework relocation calcuations Graeme Russ
@ 2012-01-04  5:30   ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:30 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

I think all of these patches should have a commit message. Anyway:

Acked-by: Simon Glass <sjg@chromium.org>

Regards,
Simon

> ---
> ?arch/x86/lib/board.c | ? 23 +++++++++++------------
> ?1 files changed, 11 insertions(+), 12 deletions(-)
>
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index 978beaa..bc5027b 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -164,24 +164,23 @@ static int calculate_relocation_address(void)
> ? ? ? ?ulong text_start = (ulong)&__text_start;
> ? ? ? ?ulong bss_end = (ulong)&__bss_end;
> ? ? ? ?ulong dest_addr;
> - ? ? ? ulong rel_offset;
> -
> - ? ? ? /* Calculate destination RAM Address and relocation offset */
> - ? ? ? dest_addr = gd->ram_size;
> - ? ? ? dest_addr -= CONFIG_SYS_STACK_SIZE;
> - ? ? ? dest_addr -= (bss_end - text_start);
>
> ? ? ? ?/*
> - ? ? ? ?* Round destination address down to 16-byte boundary to keep
> - ? ? ? ?* IDT and GDT 16-byte aligned
> + ? ? ? ?* NOTE: All destination address are rounded down to 16-byte
> + ? ? ? ?* ? ? ? boundary to satisfy various worst-case alignment
> + ? ? ? ?* ? ? ? requirements
> ? ? ? ? */
> - ? ? ? dest_addr &= ~15;
>
> - ? ? ? rel_offset = dest_addr - text_start;
> + ? ? ? /* Stack is at top of available memory */
> + ? ? ? dest_addr = gd->ram_size;
> + ? ? ? gd->start_addr_sp = dest_addr;
>
> - ? ? ? gd->start_addr_sp = gd->ram_size;
> + ? ? ? /* U-Boot is below the stack */
> + ? ? ? dest_addr -= CONFIG_SYS_STACK_SIZE;
> + ? ? ? dest_addr -= (bss_end - text_start);
> + ? ? ? dest_addr &= ~15;
> ? ? ? ?gd->relocaddr = dest_addr;
> - ? ? ? gd->reloc_off = rel_offset;
> + ? ? ? gd->reloc_off = (dest_addr - text_start);
>
> ? ? ? ?return 0;
> ?}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 07/17] x86: Use fs for global data
  2012-01-02  4:09 ` [U-Boot] [PATCH 07/17] x86: Use fs for global data Graeme Russ
@ 2012-01-04  5:36   ` Simon Glass
  2012-01-04 11:14     ` Graeme Russ
  0 siblings, 1 reply; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:36 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Use the base address of the 'F' segment as a pointer to the global data
> structure. By adding the linear address (i.e. the 'D' segment address)
> as the first word of the global data structure, the address of the
> global data relative to the 'D' segment can be found simply, for
> example, by:
>
> ? ? ? ?fs movl 0, %eax
>
> This makes the gd 'pointer' writable prior to relocation (by reloading
> the GDT) which brings x86 into line with all other arches

What is the GDT?

>
> NOTE: Writing to the gd 'pointer' is expensive (but we only do it
> twice) but using it to access global data members (read and write) is
> still fairly cheap
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> ?arch/x86/cpu/cpu.c ? ? ? ? ? ? ? ? | ? 53 ++++++++++++++++++++--------------
> ?arch/x86/cpu/start.S ? ? ? ? ? ? ? | ? ?8 ++++-
> ?arch/x86/include/asm/global_data.h | ? 21 +++++++++----
> ?arch/x86/include/asm/processor.h ? | ? ?6 +++-
> ?arch/x86/include/asm/u-boot-x86.h ?| ? ?2 +
> ?arch/x86/lib/board.c ? ? ? ? ? ? ? | ? 56 +++++++++++++++++++++++++-----------
> ?6 files changed, 98 insertions(+), 48 deletions(-)
>
> diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
> index bf55c26..e7a5fc0 100644
> --- a/arch/x86/cpu/cpu.c
> +++ b/arch/x86/cpu/cpu.c
> @@ -90,6 +90,37 @@ static void load_gdt(const u64 *boot_gdt, u16 num_entries)
> ? ? ? ?asm volatile("lgdtl %0\n" : : "m" (gdt));
> ?}
>
> +void init_gd(gd_t *id, u64 *gdt_addr)
> +{
> + ? ? ? id->gd_addr = (ulong)id;
> + ? ? ? setup_gdt(id, gdt_addr);
> +}
> +
> +void setup_gdt(gd_t *id, u64 *gdt_addr)

I will probably never understand this function but a comment might be nice.

> +{
> + ? ? ? /* CS: code, read/execute, 4 GB, base 0 */
> + ? ? ? gdt_addr[GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff);
> +
> + ? ? ? /* DS: data, read/write, 4 GB, base 0 */
> + ? ? ? gdt_addr[GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff);
> +
> + ? ? ? /* FS: data, read/write, 4 GB, base (Global Data Pointer) */
> + ? ? ? gdt_addr[GDT_ENTRY_32BIT_FS] = GDT_ENTRY(0xc093, (ulong)id, 0xfffff);
> +
> + ? ? ? ? ? ? ? /* 16-bit CS: code, read/execute, 64 kB, base 0 */

Extra indent?

> + ? ? ? gdt_addr[GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff);
> +
> + ? ? ? /* 16-bit DS: data, read/write, 64 kB, base 0 */
> + ? ? ? gdt_addr[GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff);
> +
> + ? ? ? load_gdt(gdt_addr, GDT_NUM_ENTRIES);
> + ? ? ? load_ds(GDT_ENTRY_32BIT_DS);
> + ? ? ? load_es(GDT_ENTRY_32BIT_DS);
> + ? ? ? load_gs(GDT_ENTRY_32BIT_DS);
> + ? ? ? load_ss(GDT_ENTRY_32BIT_DS);
> + ? ? ? load_fs(GDT_ENTRY_32BIT_FS);
> +}
> +
> ?int x86_cpu_init_f(void)
> ?{
> ? ? ? ?const u32 em_rst = ~X86_CR0_EM;
> @@ -117,28 +148,6 @@ int x86_cpu_init_r(void)
> ? ? ? ? ? ?"movl ? ? ? %%eax, %%cr0\n"
> ? ? ? ? ? ?"wbinvd\n" : : "i" (nw_cd_rst) : "eax");
>
> - ? ? ? /*
> - ? ? ? ?* There are machines which are known to not boot with the GDT
> - ? ? ? ?* being 8-byte unaligned. Intel recommends 16 byte alignment
> - ? ? ? ?*/
> - ? ? ? static const u64 boot_gdt[] __aligned(16) = {
> - ? ? ? ? ? ? ? /* CS: code, read/execute, 4 GB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
> - ? ? ? ? ? ? ? /* DS: data, read/write, 4 GB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
> - ? ? ? ? ? ? ? /* 16-bit CS: code, read/execute, 64 kB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
> - ? ? ? ? ? ? ? /* 16-bit DS: data, read/write, 64 kB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
> - ? ? ? };
> -
> - ? ? ? load_gdt(boot_gdt, GDT_NUM_ENTRIES);
> - ? ? ? load_ds(GDT_ENTRY_32BIT_DS);
> - ? ? ? load_es(GDT_ENTRY_32BIT_DS);
> - ? ? ? load_fs(GDT_ENTRY_32BIT_DS);
> - ? ? ? load_gs(GDT_ENTRY_32BIT_DS);
> - ? ? ? load_ss(GDT_ENTRY_32BIT_DS);
> -
> ? ? ? ?/* Initialize core interrupt and exception functionality of CPU */
> ? ? ? ?cpu_init_interrupts();
> ? ? ? ?return 0;
> diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
> index 9592158..4fb9e6b 100644
> --- a/arch/x86/cpu/start.S
> +++ b/arch/x86/cpu/start.S
> @@ -31,7 +31,7 @@
> ?#include <asm/global_data.h>
> ?#include <asm/processor.h>
> ?#include <asm/processor-flags.h>
> -#include <generated/asm-offsets.h>
> +#include <generated/generic-asm-offsets.h>
>
> ?.section .text
> ?.code32
> @@ -85,6 +85,12 @@ car_init_ret:
> ? ? ? ? */
> ? ? ? ?movl ? ?$CONFIG_SYS_INIT_SP_ADDR, %esp
>
> + ? ? ? /* Initialise the Global Data Pointer */
> + ? ? ? movl ? ?$CONFIG_SYS_INIT_GD_ADDR, %eax
> + ? ? ? movl ? ?%eax, %edx
> + ? ? ? addl ? ?$GENERATED_GBL_DATA_SIZE, %edx
> + ? ? ? call ? ?init_gd;
> +
> ? ? ? ?/* Set parameter to board_init_f() to boot flags */
> ? ? ? ?xorl ? ?%eax, %eax
> ? ? ? ?movw ? ?%bx, %ax
> diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
> index 05a2139..908a02c 100644
> --- a/arch/x86/include/asm/global_data.h
> +++ b/arch/x86/include/asm/global_data.h
> @@ -36,6 +36,8 @@
> ?#ifndef __ASSEMBLY__
>
> ?typedef ? ? ? ?struct global_data {
> + ? ? ? /* NOTE: gd_addr MUST be first member of struct global_data! */
> + ? ? ? unsigned long ? gd_addr; ? ? ? ?/* Location of Global Data */
> ? ? ? ?bd_t ? ? ? ? ? ?*bd;
> ? ? ? ?unsigned long ? flags;
> ? ? ? ?unsigned long ? baudrate;
> @@ -51,13 +53,24 @@ typedef ? ? struct global_data {
> ? ? ? ?unsigned long ? bus_clk;
> ? ? ? ?unsigned long ? relocaddr; ? ? ?/* Start address of U-Boot in RAM */
> ? ? ? ?unsigned long ? start_addr_sp; ?/* start_addr_stackpointer */
> + ? ? ? unsigned long ? gdt_addr; ? ? ? /* Location of GDT */
> + ? ? ? unsigned long ? new_gd_addr; ? ?/* New location of Global Data */
> ? ? ? ?phys_size_t ? ? ram_size; ? ? ? /* RAM size */
> ? ? ? ?unsigned long ? reset_status; ? /* reset status register at boot */
> ? ? ? ?void ? ? ? ? ? ?**jt; ? ? ? ? ? /* jump table */
> ? ? ? ?char ? ? ? ? ? ?env_buf[32]; ? ?/* buffer for getenv() before reloc. */
> ?} gd_t;
>
> -extern gd_t *gd;
> +static inline gd_t *get_fs_gd_ptr(void)
> +{
> + ? ? ? gd_t *gd_ptr;
> +
> + ? ? ? asm volatile("fs movl 0, %0\n" : "=r" (gd_ptr));
> +
> + ? ? ? return gd_ptr;
> +}
> +
> +#define gd ? ? get_fs_gd_ptr()
>
> ?#endif
>
> @@ -73,12 +86,6 @@ extern gd_t *gd;
> ?#define GD_FLG_DISABLE_CONSOLE 0x00040 /* Disable console (in & out) ? ? ? ? ? */
> ?#define GD_FLG_ENV_READY ? ? ? 0x00080 /* Environment imported into hash table */
>
> -#if 0
> ?#define DECLARE_GLOBAL_DATA_PTR
> -#else
> -#define XTRN_DECLARE_GLOBAL_DATA_PTR ? ?extern
> -#define DECLARE_GLOBAL_DATA_PTR ? ? XTRN_DECLARE_GLOBAL_DATA_PTR \
> -gd_t *gd
> -#endif
>
> ?#endif /* __ASM_GBL_DATA_H */
> diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
> index 203c63a..07897f9 100644
> --- a/arch/x86/include/asm/processor.h
> +++ b/arch/x86/include/asm/processor.h
> @@ -24,13 +24,17 @@
> ?#ifndef __ASM_PROCESSOR_H_
> ?#define __ASM_PROCESSOR_H_ 1
>
> +#define GDT_ENTRY_SIZE ? ? ? ? 8
> +
> ?#define GDT_ENTRY_NULL ? ? ? ? 0
> ?#define GDT_ENTRY_UNUSED ? ? ? (GDT_ENTRY_NULL + 1)
> ?#define GDT_ENTRY_32BIT_CS ? ? (GDT_ENTRY_UNUSED + 1)
> ?#define GDT_ENTRY_32BIT_DS ? ? (GDT_ENTRY_32BIT_CS + 1)
> -#define GDT_ENTRY_16BIT_CS ? ? (GDT_ENTRY_32BIT_DS + 1)
> +#define GDT_ENTRY_32BIT_FS ? ? (GDT_ENTRY_32BIT_DS + 1)
> +#define GDT_ENTRY_16BIT_CS ? ? (GDT_ENTRY_32BIT_FS + 1)
> ?#define GDT_ENTRY_16BIT_DS ? ? (GDT_ENTRY_16BIT_CS + 1)
>
> ?#define GDT_NUM_ENTRIES ? ? ? ? ? ? ? ?(GDT_ENTRY_16BIT_DS + 1)
> +#define GDT_SIZE ? ? ? ? ? ? ? (GDT_NUM_ENTRIES * GDT_ENTRY_SIZE)

Wasn't this already done in an earlier patch?

>
> ?#endif
> diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
> index c3d2277..5540d51 100644
> --- a/arch/x86/include/asm/u-boot-x86.h
> +++ b/arch/x86/include/asm/u-boot-x86.h
> @@ -37,6 +37,8 @@ int x86_cpu_init_r(void);
> ?int cpu_init_r(void);
> ?int x86_cpu_init_f(void);
> ?int cpu_init_f(void);
> +void init_gd(gd_t *id, u64 *gdt_addr);
> +void setup_gdt(gd_t *id, u64 *gdt_addr);
>
> ?/* cpu/.../timer.c */
> ?void timer_isr(void *);
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index bc5027b..9c4ecda 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -42,20 +42,12 @@
> ?#include <serial.h>
> ?#include <asm/u-boot-x86.h>
> ?#include <elf.h>
> +#include <asm/processor.h>
>
> ?#ifdef CONFIG_BITBANGMII
> ?#include <miiphy.h>
> ?#endif
>
> -/*
> - * 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);
> -
> ?/************************************************************************
> ?* Init Utilities ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*
> ?************************************************************************
> @@ -128,6 +120,7 @@ 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);
> +static int copy_gd_to_ram(void);
>
> ?init_fnc_t *init_sequence_f[] = {
> ? ? ? ?cpu_init_f,
> @@ -146,6 +139,7 @@ init_fnc_t *init_sequence_f[] = {
> ?};
>
> ?init_fnc_t *init_sequence_r[] = {
> + ? ? ? copy_gd_to_ram,
> ? ? ? ?cpu_init_r, ? ? ? ? ? ? /* basic cpu dependent setup */
> ? ? ? ?board_early_init_r, ? ? /* basic board dependent setup */
> ? ? ? ?dram_init, ? ? ? ? ? ? ?/* configure available RAM banks */
> @@ -157,8 +151,6 @@ init_fnc_t *init_sequence_r[] = {
> ? ? ? ?NULL,
> ?};
>
> -gd_t *gd;
> -
> ?static int calculate_relocation_address(void)
> ?{
> ? ? ? ?ulong text_start = (ulong)&__text_start;
> @@ -171,8 +163,18 @@ static int calculate_relocation_address(void)
> ? ? ? ? * ? ? ? requirements
> ? ? ? ? */
>
> - ? ? ? /* Stack is at top of available memory */
> + ? ? ? /* Global Data is at top of available memory */
> ? ? ? ?dest_addr = gd->ram_size;
> + ? ? ? dest_addr -= GENERATED_GBL_DATA_SIZE;
> + ? ? ? dest_addr &= ~15;
> + ? ? ? gd->new_gd_addr = dest_addr;
> +
> + ? ? ? /* GDT is below Global Data */
> + ? ? ? dest_addr -= GDT_SIZE;
> + ? ? ? dest_addr &= ~15;
> + ? ? ? gd->gdt_addr = dest_addr;
> +
> + ? ? ? /* Stack is below GDT */
> ? ? ? ?gd->start_addr_sp = dest_addr;
>
> ? ? ? ?/* U-Boot is below the stack */
> @@ -279,6 +281,31 @@ void board_init_f_r(void)
> ? ? ? ? ? ? ? ?;
> ?}
>
> +static int copy_gd_to_ram(void)
> +{
> + ? ? ? gd_t *ram_gd;
> +
> + ? ? ? /*
> + ? ? ? ?* Global data is still in temporary memory (the CPU cache).
> + ? ? ? ?* calculate_relocation_address() has set gd->new_gd_addr to
> + ? ? ? ?* where the global data lives in RAM but getting it there
> + ? ? ? ?* safely is a bit tricky due to the 'F-Segment Hack' that
> + ? ? ? ?* we need to use for x86
> + ? ? ? ?*/
> + ? ? ? ram_gd = (gd_t *)gd->new_gd_addr;
> + ? ? ? memcpy((void *)ram_gd, gd, sizeof(gd_t));
> +
> + ? ? ? /*
> + ? ? ? ?* Reload the Global Descriptor Table so FS points to the
> + ? ? ? ?* in-RAM copy of Global Data (calculate_relocation_address()
> + ? ? ? ?* has already calculated the in-RAM location of the GDT)
> + ? ? ? ?*/
> + ? ? ? ram_gd->gd_addr = (ulong)ram_gd;
> + ? ? ? init_gd(ram_gd, (u64 *)gd->gdt_addr);
> +
> + ? ? ? return 0;
> +}
> +
> ?void board_init_r(gd_t *id, ulong dest_addr)
> ?{
> ?#if defined(CONFIG_CMD_NET)
> @@ -288,15 +315,10 @@ void board_init_r(gd_t *id, ulong dest_addr)
> ? ? ? ?ulong size;
> ?#endif
> ? ? ? ?static bd_t bd_data;
> - ? ? ? static gd_t gd_data;
> ? ? ? ?init_fnc_t **init_fnc_ptr;
>
> ? ? ? ?show_boot_progress(0x21);
>
> - ? ? ? /* 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");
>
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

Regards,
Simon

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot
  2012-01-02  4:09 ` [U-Boot] [PATCH 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot Graeme Russ
@ 2012-01-04  5:37   ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:37 UTC (permalink / raw)
  To: u-boot

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> ?arch/x86/lib/board.c | ? ?4 ++--
> ?1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index 9c4ecda..4e54dba 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -252,8 +252,6 @@ void board_init_f(ulong boot_flags)
> ? ? ? ? ? ? ? ? ? ? ? ?hang();
> ? ? ? ?}
>
> - ? ? ? gd->flags |= GD_FLG_RELOC;
> -
> ? ? ? ?/*
> ? ? ? ? * SDRAM is now initialised, U-Boot has been copied into SDRAM,
> ? ? ? ? * the BSS has been cleared etc. The final stack can now be setup
> @@ -322,6 +320,8 @@ void board_init_r(gd_t *id, ulong dest_addr)
> ? ? ? ?/* compiler optimization barrier needed for GCC >= 3.4 */
> ? ? ? ?__asm__ __volatile__("" : : : "memory");
>
> + ? ? ? gd->flags |= GD_FLG_RELOC;
> +
> ? ? ? ?gd->bd = &bd_data;
> ? ? ? ?memset(gd->bd, 0, sizeof(bd_t));
> ? ? ? ?show_boot_progress(0x22);
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 09/17] x86: Create weak init_cache() function
  2012-01-02  4:09 ` [U-Boot] [PATCH 09/17] x86: Create weak init_cache() function Graeme Russ
@ 2012-01-04  5:38   ` Simon Glass
  2012-01-04 11:25     ` Graeme Russ
  0 siblings, 1 reply; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:38 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> ?arch/x86/cpu/cpu.c ? ? ? ? ? ? ? ?| ? 18 +++++++++++++++---
> ?arch/x86/include/asm/u-boot-x86.h | ? ?1 +
> ?arch/x86/lib/board.c ? ? ? ? ? ? ?| ? ?1 +
> ?3 files changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
> index e7a5fc0..4351f20 100644
> --- a/arch/x86/cpu/cpu.c
> +++ b/arch/x86/cpu/cpu.c
> @@ -140,6 +140,14 @@ int cpu_init_f(void) __attribute__((weak, alias("x86_cpu_init_f")));
>
> ?int x86_cpu_init_r(void)
> ?{
> + ? ? ? /* Initialize core interrupt and exception functionality of CPU */
> + ? ? ? cpu_init_interrupts();
> + ? ? ? return 0;
> +}

This doesn't seem to match the commit title.

> +int cpu_init_r(void) __attribute__((weak, alias("x86_cpu_init_r")));
> +
> +void x86_enable_caches(void)
> +{
> ? ? ? ?const u32 nw_cd_rst = ~(X86_CR0_NW | X86_CR0_CD);
>
> ? ? ? ?/* turn on the cache and disable write through */
> @@ -147,12 +155,16 @@ int x86_cpu_init_r(void)
> ? ? ? ? ? ?"andl ? ? ? %0, %%eax\n"
> ? ? ? ? ? ?"movl ? ? ? %%eax, %%cr0\n"
> ? ? ? ? ? ?"wbinvd\n" : : "i" (nw_cd_rst) : "eax");
> +}
> +void enable_caches(void) __attribute__((weak, alias("x86_enable_caches")));
> +
> +int x86_init_cache(void)
> +{
> + ? ? ? enable_caches();

Does this enable both I and D caches?

>
> - ? ? ? /* Initialize core interrupt and exception functionality of CPU */
> - ? ? ? cpu_init_interrupts();
> ? ? ? ?return 0;
> ?}
> -int cpu_init_r(void) __attribute__((weak, alias("x86_cpu_init_r")));
> +int init_cache(void) __attribute__((weak, alias("x86_init_cache")));
>
> ?int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> ?{
> diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
> index 5540d51..878a1ee 100644
> --- a/arch/x86/include/asm/u-boot-x86.h
> +++ b/arch/x86/include/asm/u-boot-x86.h
> @@ -39,6 +39,7 @@ int x86_cpu_init_f(void);
> ?int cpu_init_f(void);
> ?void init_gd(gd_t *id, u64 *gdt_addr);
> ?void setup_gdt(gd_t *id, u64 *gdt_addr);
> +int init_cache(void);
>
> ?/* cpu/.../timer.c */
> ?void timer_isr(void *);
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index 4e54dba..ffddfbe 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -140,6 +140,7 @@ init_fnc_t *init_sequence_f[] = {
>
> ?init_fnc_t *init_sequence_r[] = {
> ? ? ? ?copy_gd_to_ram,
> + ? ? ? init_cache,

Would enable_caches be a better name?

> ? ? ? ?cpu_init_r, ? ? ? ? ? ? /* basic cpu dependent setup */
> ? ? ? ?board_early_init_r, ? ? /* basic board dependent setup */
> ? ? ? ?dram_init, ? ? ? ? ? ? ?/* configure available RAM banks */
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

Regards,
Simon

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 10/17] x86: Allow cache before copy to RAM
  2012-01-02  4:09 ` [U-Boot] [PATCH 10/17] x86: Allow cache before copy to RAM Graeme Russ
@ 2012-01-04  5:40   ` Simon Glass
  2012-01-04 11:29     ` Graeme Russ
  0 siblings, 1 reply; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:40 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> ?arch/x86/lib/board.c | ? 15 ++++++++++-----
> ?1 files changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index ffddfbe..52e27e1 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -131,16 +131,11 @@ init_fnc_t *init_sequence_f[] = {
> ? ? ? ?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[] = {
> - ? ? ? copy_gd_to_ram,
> - ? ? ? init_cache,
> ? ? ? ?cpu_init_r, ? ? ? ? ? ? /* basic cpu dependent setup */
> ? ? ? ?board_early_init_r, ? ? /* basic board dependent setup */
> ? ? ? ?dram_init, ? ? ? ? ? ? ?/* configure available RAM banks */
> @@ -269,6 +264,16 @@ void board_init_f(ulong boot_flags)
>
> ?void board_init_f_r(void)
> ?{
> + ? ? ? if (copy_gd_to_ram() != 0)
> + ? ? ? ? ? ? ? hang();
> +
> + ? ? ? if (init_cache() != 0)
> + ? ? ? ? ? ? ? hang();
> +
> + ? ? ? copy_uboot_to_ram();
> + ? ? ? clear_bss();
> + ? ? ? do_elf_reloc_fixups();

Can you not just put these in the init list above? Why do they need to
move back into this functoin?

Regards,
Simon

> +
> ? ? ? ?/*
> ? ? ? ? * Transfer execution from Flash to RAM by calculating the address
> ? ? ? ? * of the in-RAM copy of board_init_r() and calling it
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 11/17] CHECKPATCH: arch/x86/cpu/*
  2012-01-02  4:09 ` [U-Boot] [PATCH 11/17] CHECKPATCH: arch/x86/cpu/* Graeme Russ
@ 2012-01-04  5:42   ` Simon Glass
  2012-01-04 11:35     ` Graeme Russ
  0 siblings, 1 reply; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:42 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Seems a bit more than just checkpatch.

Acked-by: Simon Glass <sjg@chromium.org>

Regards,
Simon

> ---
> ?arch/x86/cpu/interrupts.c | ? ?2 +-
> ?arch/x86/cpu/start16.S ? ?| ? 57 +++++++++++++++++++++++++++++++++++---------
> ?2 files changed, 46 insertions(+), 13 deletions(-)
>
> diff --git a/arch/x86/cpu/interrupts.c b/arch/x86/cpu/interrupts.c
> index e0958eb..43ec3f8 100644
> --- a/arch/x86/cpu/interrupts.c
> +++ b/arch/x86/cpu/interrupts.c
> @@ -174,7 +174,7 @@ struct desc_ptr {
> ? ? ? ?unsigned short segment;
> ?} __packed;
>
> -struct idt_entry idt[256] __attribute__((aligned(16)));
> +struct idt_entry idt[256] __aligned(16);
>
> ?struct desc_ptr idt_ptr;
>
> diff --git a/arch/x86/cpu/start16.S b/arch/x86/cpu/start16.S
> index 33e53cd..cc393ff 100644
> --- a/arch/x86/cpu/start16.S
> +++ b/arch/x86/cpu/start16.S
> @@ -86,7 +86,11 @@ gdt_ptr:
> ? ? ? ?.word ? 0x20 ? ? ? ? ? ?/* limit (32 bytes = 4 GDT entries) */
> ? ? ? ?.long ? BOOT_SEG + gdt ?/* base */
>
> - ? ? ? /* The GDT table ...
> +/* Some CPUs are picky about GDT alignment... */
> +.align 16
> +gdt:
> + ? ? ? /*
> + ? ? ? ?* The GDT table ...
> ? ? ? ? *
> ? ? ? ? * ? ? ? Selector ? ? ? Type
> ? ? ? ? * ? ? ? 0x00 ? ? ? ? ? NULL
> @@ -94,17 +98,46 @@ gdt_ptr:
> ? ? ? ? * ? ? ? 0x10 ? ? ? ? ? 32bit code
> ? ? ? ? * ? ? ? 0x18 ? ? ? ? ? 32bit data/stack
> ? ? ? ? */
> + ? ? ? /* The NULL Desciptor - Mandatory */
> + ? ? ? .word ? 0x0000 ? ? ? ? ?/* limit_low */
> + ? ? ? .word ? 0x0000 ? ? ? ? ?/* base_low */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_middle */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* access */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* flags + limit_high */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_high */
>
> -gdt:
> - ? ? ? .word ? 0, 0, 0, 0 ? ? ?/* NULL ?*/
> - ? ? ? .word ? 0, 0, 0, 0 ? ? ?/* unused */
> + ? ? ? /* Unused Desciptor - (matches Linux) */
> + ? ? ? .word ? 0x0000 ? ? ? ? ?/* limit_low */
> + ? ? ? .word ? 0x0000 ? ? ? ? ?/* base_low */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_middle */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* access */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* flags + limit_high */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_high */
>
> - ? ? ? .word ? 0xFFFF ? ? ? ? ?/* 4Gb - (0x100000*0x1000 = 4Gb) */
> - ? ? ? .word ? 0 ? ? ? ? ? ? ? /* base address = 0 */
> - ? ? ? .word ? 0x9B00 ? ? ? ? ?/* code read/exec */
> - ? ? ? .word ? 0x00CF ? ? ? ? ?/* granularity = 4096, 386 (+5th nibble of limit) */
> + ? ? ? /*
> + ? ? ? ?* The Code Segment Descriptor:
> + ? ? ? ?* - Base ? = 0x00000000
> + ? ? ? ?* - Size ? = 4GB
> + ? ? ? ?* - Access = Present, Ring 0, Exec (Code), Readable
> + ? ? ? ?* - Flags ?= 4kB Granularity, 32-bit
> + ? ? ? ?*/
> + ? ? ? .word ? 0xffff ? ? ? ? ?/* limit_low */
> + ? ? ? .word ? 0x0000 ? ? ? ? ?/* base_low */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_middle */
> + ? ? ? .byte ? 0x9b ? ? ? ? ? ?/* access */
> + ? ? ? .byte ? 0xcf ? ? ? ? ? ?/* flags + limit_high */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_high */
>
> - ? ? ? .word ? 0xFFFF ? ? ? ? ?/* 4Gb - (0x100000*0x1000 = 4Gb) */
> - ? ? ? .word ? 0x0 ? ? ? ? ? ? /* base address = 0 */
> - ? ? ? .word ? 0x9300 ? ? ? ? ?/* data read/write */
> - ? ? ? .word ? 0x00CF ? ? ? ? ?/* granularity = 4096, 386 (+5th nibble of limit) */
> + ? ? ? /*
> + ? ? ? ?* The Data Segment Descriptor:
> + ? ? ? ?* - Base ? = 0x00000000
> + ? ? ? ?* - Size ? = 4GB
> + ? ? ? ?* - Access = Present, Ring 0, Non-Exec (Data), Writable
> + ? ? ? ?* - Flags ?= 4kB Granularity, 32-bit
> + ? ? ? ?*/
> + ? ? ? .word ? 0xffff ? ? ? ? ?/* limit_low */
> + ? ? ? .word ? 0x0000 ? ? ? ? ?/* base_low */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_middle */
> + ? ? ? .byte ? 0x93 ? ? ? ? ? ?/* access */
> + ? ? ? .byte ? 0xcf ? ? ? ? ? ?/* flags + limit_high */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_high */
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 12/17] CHECKPATCH: arch/x86/lib/*
  2012-01-02  4:09 ` [U-Boot] [PATCH 12/17] CHECKPATCH: arch/x86/lib/* Graeme Russ
@ 2012-01-04  5:47   ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:47 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

Thanks for the x86 assembler lesson :-)

Regards,
Simon

> ---
> ?arch/x86/lib/bios.S ? ? ? ? ? ?| ?134 +++++++++++++++++++++++++--------------
> ?arch/x86/lib/realmode_switch.S | ? 61 +++++++++++--------
> ?2 files changed, 122 insertions(+), 73 deletions(-)
>
> diff --git a/arch/x86/lib/bios.S b/arch/x86/lib/bios.S
> index ce8deb5..239aaa9 100644
> --- a/arch/x86/lib/bios.S
> +++ b/arch/x86/lib/bios.S
> @@ -246,11 +246,9 @@ rm_int1f:
> ?rm_def_int:
> ? ? ? ?iret
>
> -
> ? ? ? ?/*
> - ? ? ? ?* All interrupt jumptable entries jump to here
> - ? ? ? ?* after pushing the interrupt vector number onto the
> - ? ? ? ?* stack.
> + ? ? ? ?* All interrupt jumptable entries jump to here after pushing the
> + ? ? ? ?* interrupt vector number onto the stack.
> ? ? ? ? */
> ?any_interrupt16:
> ? ? ? ?MAKE_BIOS_STACK
> @@ -272,7 +270,8 @@ gs ?movw ? ?OFFS_VECTOR(%bp), %ax
> ? ? ? ?je ? ? ?Lint_1ah
> ? ? ? ?movw ? ?$0xffff, %ax
> ? ? ? ?jmp ? ? Lout
> -Lint_10h: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* VGA BIOS services */
> +Lint_10h:
> + ? ? ? /* VGA BIOS services */
> ? ? ? ?call ? ?bios_10h
> ? ? ? ?jmp ? ? Lout
> ?Lint_11h:
> @@ -281,35 +280,42 @@ Lint_11h:
> ?Lint_12h:
> ? ? ? ?call ? ?bios_12h
> ? ? ? ?jmp ? ? Lout
> -Lint_13h: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* BIOS disk services */
> +Lint_13h:
> + ? ? ? /* BIOS disk services */
> ? ? ? ?call ? ?bios_13h
> ? ? ? ?jmp ? ? Lout
> -Lint_15h: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* Misc. BIOS services */
> +Lint_15h:
> + ? ? ? /* Misc. BIOS services */
> ? ? ? ?call ? ?bios_15h
> ? ? ? ?jmp ? ? Lout
> -Lint_16h: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* keyboard services */
> +Lint_16h:
> + ? ? ? /* keyboard services */
> ? ? ? ?call ? ?bios_16h
> ? ? ? ?jmp ? ? Lout
> -Lint_1ah: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* PCI bios */
> +Lint_1ah:
> + ? ? ? /* PCI bios */
> ? ? ? ?call ? ?bios_1ah
> ? ? ? ?jmp ? ? Lout
> ?Lout:
> ? ? ? ?cmpw ? ?$0, %ax
> ? ? ? ?je ? ? ?Lhandeled
>
> - ? ? ? /* Insert code for unhandeled INTs here.
> + ? ? ? /*
> + ? ? ? ?* Insert code for unhandeled INTs here.
> ? ? ? ? *
> - ? ? ? ?* ROLO prints a message to the console
> - ? ? ? ?* (we could do that but then we're in 16bit mode
> - ? ? ? ?* so we'll have to get back into 32bit mode
> - ? ? ? ?* to use the console I/O routines (if we do this
> - ? ? ? ?* we shuls make int 0x10 and int 0x16 work as well))
> + ? ? ? ?* ROLO prints a message to the console we could do that but then
> + ? ? ? ?* we're in 16bit mode so we'll have to get back into 32bit mode
> + ? ? ? ?* to use the console I/O routines (if we do this we should make
> + ? ? ? ?* int 0x10 and int 0x16 work as well)
> ? ? ? ? */
> ?Lhandeled:
> ? ? ? ?RESTORE_CALLERS_STACK
> - ? ? ? addw ? ?$2,%sp ? ? ? ? ? ? ? ? ? ? ? ? ?/* dump vector number */
> - ? ? ? iret ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* return from interrupt */
>
> + ? ? ? /* dump vector number */
> + ? ? ? addw ? ?$2,%sp
> +
> + ? ? ? /* return from interrupt */
> + ? ? ? iret
>
> ?/*
> ?************************************************************
> @@ -327,22 +333,24 @@ gs ? ? ? ?movw ? ?OFFS_AX(%bp), %ax
> ? ? ? ?je ? ? ?Lvid_cfg
> ? ? ? ?movw ? ?$0xffff, %ax
> ? ? ? ?ret
> -Lcur_pos: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* Read Cursor Position and Size */
> +Lcur_pos:
> + ? ? ? /* Read Cursor Position and Size */
> ?gs ? ? movw ? ?$0, OFFS_CX(%bp)
> ?gs ? ? movw ? ?$0, OFFS_DX(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
> -Lvid_state: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* Get Video State */
> -gs ? ? movw ? ?$(80 << 8|0x03), OFFS_AX(%bp) ? /* 80 columns, 80x25, 16 colors */
> +Lvid_state:
> + ? ? ? /* Get Video State - 80 columns, 80x25, 16 colors */
> +gs ? ? movw ? ?$(80 << 8|0x03), OFFS_AX(%bp)
> ?gs ? ? movw ? ?$0, OFFS_BX(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
> -Lvid_cfg: ? ? ?/* Video Subsystem Configuration (EGA/VGA) */
> -gs ? ? movw ? ?$0x10, OFFS_BX(%bp) ? ? ? ? ? ? /* indicate CGA/MDA/HGA */
> +Lvid_cfg:
> + ? ? ? /* Video Subsystem Configuration (EGA/VGA) - indicate CGA/MDA/HGA */
> +gs ? ? movw ? ?$0x10, OFFS_BX(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> -
> ?/*
> ?************************************************************
> ?* BIOS interrupt 11h -- Equipment determination
> @@ -355,7 +363,6 @@ gs ?movw ? ?%ax, OFFS_AX(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> -
> ?/*
> ?************************************************************
> ?* BIOS ? ? ? ?interrupt 12h -- Get Memory Size
> @@ -370,16 +377,18 @@ cs ? ? ? ?movw ? ?ram_in_64kb_chunks, %ax
> ?b12_more_than_640k:
> ? ? ? ?movw ? ?$0x280, %ax
> ?b12_return:
> -gs ? ? movw ? ?%ax, OFFS_AX(%bp) ? ? ? ? ? ? ? /* return number of kilobytes in ax */
> + ? ? ? /* return number of kilobytes in ax */
> +gs ? ? movw ? ?%ax, OFFS_AX(%bp)
>
> ?gs ? ? movw ? ?OFFS_FLAGS(%bp), %ax
> - ? ? ? andw ? ?$0xfffe, %ax ? ? ? ? ? ? ? ? ? ?/* clear carry -- function succeeded */
> +
> + ? ? ? /* clear carry -- function succeeded */
> + ? ? ? andw ? ?$0xfffe, %ax
> ?gs ? ? movw ? ?%ax, OFFS_FLAGS(%bp)
>
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> -
> ?/*
> ?************************************************************
> ?* BIOS interrupt 13h -- Disk services
> @@ -394,12 +403,13 @@ gs ? ? ? ?movw ? ?OFFS_AX(%bp), %ax
> ? ? ? ?ret
> ?Lfunc_15h:
> ?gs ? ? movw ? ?OFFS_AX(%bp), %ax
> - ? ? ? andw ? ?$0xff, %ax ? ? ? ? ? ? ? ? ? ? ?/* return AH=0->drive not present */
> +
> + ? ? ? /* return AH=0->drive not present */
> + ? ? ? andw ? ?$0x00ff, %ax
> ?gs ? ? movw ? ?%ax, OFFS_AX(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> -
> ?/*
> ?***********************************************************
> ?* BIOS interrupt 15h -- Miscellaneous services
> @@ -417,9 +427,12 @@ gs movw ? ?OFFS_AX(%bp), %ax
> ? ? ? ?movw ? ?$0xffff, %ax
> ? ? ? ?ret
>
> -Lfunc_c0h: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Return System Configuration Parameters (PS2 only) */
> +Lfunc_c0h:
> + ? ? ? /* Return System Configuration Parameters (PS2 only) */
> ?gs ? ? movw ? ?OFFS_FLAGS(%bp), %ax
> - ? ? ? orw ? ? $1, %ax ? ? ? ? ? ? ? ? ? ? ? ? /* return carry -- function not supported */
> +
> + ? ? ? /* return carry -- function not supported */
> + ? ? ? orw ? ? $1, %ax
> ?gs ? ? movw ? ?%ax, OFFS_FLAGS(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
> @@ -430,38 +443,56 @@ gs ? ? ? ?movw ? ?OFFS_AX(%bp), %ax
> ? ? ? ?cmpw ? ?$1, %ax
> ? ? ? ?je ? ? ?Lfunc_e801h
> ?gs ? ? movw ? ?OFFS_FLAGS(%bp), %ax
> - ? ? ? orw ? ? $1, %ax ? ? ? ? ? ? ? ? ? ? ? ? /* return carry -- function not supported */
> +
> + ? ? ? /* return carry -- function not supported */
> + ? ? ? orw ? ? $1, %ax
> ?gs ? ? movw ? ?%ax, OFFS_FLAGS(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> -Lfunc_e801h: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Get memory size for >64M Configurations */
> +Lfunc_e801h:
> + ? ? ? /* Get memory size for >64M Configurations */
> ?cs ? ? movw ? ?ram_in_64kb_chunks, %ax
> ? ? ? ?cmpw ? ?$0x100, %ax
> ? ? ? ?ja ? ? ?e801_more_than_16mb
> - ? ? ? shlw ? ?$6, %ax ? ? ? ? ? ? ? ? ? ? ? ? /* multiply by 64 */
> - ? ? ? subw ? ?$0x400, %ax ? ? ? ? ? ? ? ? ? ? /* 1st meg does not count */
>
> -gs ? ? movw ? ?%ax, OFFS_AX(%bp) ? ? ? ? ? ? ? /* return memory size between 1M and 16M in 1kb chunks in AX and CX */
> + ? ? ? /* multiply by 64 */
> + ? ? ? shlw ? ?$6, %ax
> +
> + ? ? ? /* 1st meg does not count */
> + ? ? ? subw ? ?$0x400, %ax
> +
> + ? ? ? /* return memory size between 1M and 16M in 1kb chunks in AX and CX */
> +gs ? ? movw ? ?%ax, OFFS_AX(%bp)
> ?gs ? ? movw ? ?%ax, OFFS_CX(%bp)
> -gs ? ? movw ? ?$0, OFFS_BX(%bp) ? ? ? ? ? ? ? ?/* set BX and DX to 0*/
> +
> + ? ? ? /* set BX and DX to 0*/
> +gs ? ? movw ? ?$0, OFFS_BX(%bp)
> ?gs ? ? movw ? ?$0, OFFS_DX(%bp)
> ?gs ? ? movw ? ?OFFS_FLAGS(%bp), %ax
> - ? ? ? andw ? ?$0xfffe, %ax ? ? ? ? ? ? ? ? ? ?/* clear carry -- function succeeded */
> +
> + ? ? ? /* clear carry -- function succeeded */
> + ? ? ? andw ? ?$0xfffe, %ax
> ?gs ? ? movw ? ?%ax, OFFS_FLAGS(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> ?e801_more_than_16mb:
> - ? ? ? subw ? ?$0x100, %ax ? ? ? ? ? ? ? ? ? ? /* subtract 16MB */
> + ? ? ? /* subtract 16MB */
> + ? ? ? subw ? ?$0x100, %ax
>
> -gs ? ? movw ? ?$0x3c00, OFFS_AX(%bp) ? ? ? ? ? /* return 0x3c00 (16MB-1MB) in AX and CX */
> + ? ? ? /* return 0x3c00 (16MB-1MB) in AX and CX */
> +gs ? ? movw ? ?$0x3c00, OFFS_AX(%bp)
> ?gs ? ? movw ? ?$0x3c00, OFFS_CX(%bp)
> -gs ? ? movw ? ?%ax, OFFS_BX(%bp) ? ? ? ? ? ? ? /* set BX and DX to number of 64kb chunks above 16MB */
> +
> + ? ? ? /* set BX and DX to number of 64kb chunks above 16MB */
> +gs ? ? movw ? ?%ax, OFFS_BX(%bp)
> ?gs ? ? movw ? ?%ax, OFFS_DX(%bp)
>
> ?gs ? ? movw ? ?OFFS_FLAGS(%bp), %ax
> - ? ? ? andw ? ?$0xfffe, %ax ? ? ? ? ? ? ? ? ? ?/* clear carry -- function succeeded */
> +
> + ? ? ? /* clear carry -- function succeeded */
> + ? ? ? andw ? ?$0xfffe, %ax
> ?gs ? ? movw ? ?%ax, OFFS_FLAGS(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
> @@ -473,18 +504,22 @@ cs ? ? ? ?movw ? ?ram_in_64kb_chunks, %ax
> ? ? ? ?movw ? ?$0x100, %ax
> ?b88_not_more_than16:
> ? ? ? ?shlw ? ?$6, %ax
> - ? ? ? subw ? ?$0x400, %ax ? ? ? ? ? ? ? ? ? ? /* 1st meg does not count */
>
> -gs ? ? movw ? ?%ax, OFFS_AX(%bp) ? ? ? ? ? ? ? /* return number of kilobytes between 16MB and 16MB in ax */
> + ? ? ? /* 1st meg does not count */
> + ? ? ? subw ? ?$0x400, %ax
> +
> + ? ? ? /* return number of kilobytes between 16MB and 16MB in ax */
> +gs ? ? movw ? ?%ax, OFFS_AX(%bp)
>
> ?gs ? ? movw ? ?OFFS_FLAGS(%bp), %ax
> - ? ? ? andw ? ?$0xfffe, %ax ? ? ? ? ? ? ? ? ? ?/* clear carry -- function succeeded */
> +
> + ? ? ? /* clear carry -- function succeeded */
> + ? ? ? andw ? ?$0xfffe, %ax
> ?gs ? ? movw ? ?%ax, OFFS_FLAGS(%bp)
>
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> -
> ?/*
> ?************************************************************
> ?* BIOS interrupt 16h -- keyboard services
> @@ -498,7 +533,8 @@ gs ?movw ? ?OFFS_AX(%bp), %ax
> ? ? ? ?movw ? ?$0xffff, %ax
> ? ? ? ?ret
> ?Lfunc_03h:
> - ? ? ? xorw ? ?%ax, %ax ? ? ? ? ? ? ? ? ? ? ? ?/* do nothing -- function not supported */
> + ? ? ? /* do nothing -- function not supported */
> + ? ? ? xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> ?/*
> @@ -514,7 +550,9 @@ gs ?movw ? ?OFFS_AX(%bp), %ax
> ? ? ? ?ret
> ?Lfunc_b1h:
> ? ? ? ?call ? ?realmode_pci_bios
> - ? ? ? xorw ? ?%ax, %ax ? ? ? ? ? ? ? ? ? ? ? ?/* do nothing -- function not supported */
> +
> + ? ? ? /* do nothing -- function not supported */
> + ? ? ? xorw ? ?%ax, %ax
> ? ? ? ?ret
>
>
> diff --git a/arch/x86/lib/realmode_switch.S b/arch/x86/lib/realmode_switch.S
> index 7ee709a..c4c4c43 100644
> --- a/arch/x86/lib/realmode_switch.S
> +++ b/arch/x86/lib/realmode_switch.S
> @@ -44,12 +44,13 @@
> ?* ? ? e40 ss;
> ?*/
>
> -#define a32 ? ? ? ? ? ?.byte 0x67; ? ? ? ? ? ? /* address size prefix 32 */
> -#define o32 ? ? ? ? ? ?.byte 0x66; ? ? ? ? ? ? /* operand size prefix 32 */
> +#define a32 ? ? ? ? ? ?.byte 0x67; ? ? /* address size prefix 32 */
> +#define o32 ? ? ? ? ? ?.byte 0x66; ? ? /* operand size prefix 32 */
>
> ?.section .realmode, "ax"
> ?.code16
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 16bit protected mode code here */
> +
> + ? ? ? /* 16bit protected mode code here */
> ?.globl realmode_enter
> ?realmode_enter:
> ?o32 ? ?pusha
> @@ -69,20 +70,23 @@ o32 pushf
> ? ? ? ?movw ? ?%ax, %gs
>
> ? ? ? ?lidt ? ?realmode_idt_ptr
> - ? ? ? movl ? ?%cr0, %eax ? ? ? ? ? ? ? ? ? ? ?/* Go back into real mode by */
> - ? ? ? andl ? ?$0x7ffffffe, %eax ? ? ? ? ? ? ? /* clearing PE to 0 */
> + ? ? ? /* Go back into real mode by clearing PE to 0 */
> + ? ? ? movl ? ?%cr0, %eax
> + ? ? ? andl ? ?$0x7ffffffe, %eax
> ? ? ? ?movl ? ?%eax, %cr0
> - ? ? ? ljmp ? ?$0x0,$do_realmode ? ? ? ? ? ? ? /* switch to real mode */
>
> -do_realmode: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* realmode code from here */
> + ? ? ? /* switch to real mode */
> + ? ? ? ljmp ? ?$0x0,$do_realmode
> +
> +do_realmode:
> + ? ? ? /* realmode code from here */
> ? ? ? ?movw ? ?%cs,%ax
> ? ? ? ?movw ? ?%ax,%ds
> ? ? ? ?movw ? ?%ax,%es
> ? ? ? ?movw ? ?%ax,%fs
> ? ? ? ?movw ? ?%ax,%gs
>
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* create a temporary stack */
> -
> + ? ? ? /* create a temporary stack */
> ? ? ? ?movw ? ?$0xc0, %ax
> ? ? ? ?movw ? ?%ax, %ss
> ? ? ? ?movw ? ?$0x200, %ax
> @@ -114,26 +118,29 @@ o32 ? ? ? popf
> ? ? ? ?popw ? ?%ss
> ? ? ? ?movl ? ?%eax, %esp
> ?cs ? ? movl ? ?temp_eax, %eax
> - ? ? ? wbinvd ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* self-modifying code,
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?* better flush the cache */
> +
> + ? ? ? /* self-modifying code, better flush the cache */
> + ? ? ? wbinvd
>
> ? ? ? ?.byte ? 0x9a ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* lcall */
> ?temp_ip:
> ? ? ? ?.word ? 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* new ip */
> ?temp_cs:
> ? ? ? ?.word ? 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* new cs */
> +
> ?realmode_ret:
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* save eax, esp and ss */
> + ? ? ? /* save eax, esp and ss */
> ?cs ? ? movl ? ?%eax, saved_eax
> ? ? ? ?movl ? ?%esp, %eax
> ?cs ? ? movl ? ?%eax, saved_esp
> ? ? ? ?movw ? ?%ss, %ax
> ?cs ? ? movw ? ?%ax, saved_ss
>
> - ? ? ? /* restore the stack, note that we set sp to 0x244;
> + ? ? ? /*
> + ? ? ? ?* restore the stack, note that we set sp to 0x244;
> ? ? ? ? * pt_regs is 0x44 bytes long and we push the structure
> - ? ? ? ?* backwards on to the stack, bottom first */
> -
> + ? ? ? ?* backwards on to the stack, bottom first
> + ? ? ? ?*/
> ? ? ? ?movw ? ?$0xc0, %ax
> ? ? ? ?movw ? ?%ax, %ss
> ? ? ? ?movw ? ?$0x244, %ax
> @@ -169,12 +176,15 @@ cs ? ? ? ?movw ? ?temp_ip, %ax
> ? ? ? ?pushl ? %ebx
>
> ?o32 cs lidt ? ?saved_idt
> -o32 cs lgdt ? ?saved_gdt ? ? ? ? ? ? ? ? ? ? ? /* Set GDTR */
> +o32 cs lgdt ? ?saved_gdt
>
> - ? ? ? movl ? ?%cr0, %eax ? ? ? ? ? ? ? ? ? ? ?/* Go back into protected mode */
> - ? ? ? orl ? ? $1,%eax /* reset PE to 1 */
> + ? ? ? /* Go back into protected mode reset PE to 1 */
> + ? ? ? movl ? ?%cr0, %eax
> + ? ? ? orl ? ? $1,%eax
> ? ? ? ?movl ? ?%eax, %cr0
> - ? ? ? jmp ? ? next_line ? ? ? ? ? ? ? ? ? ? ? /* flush prefetch queue */
> +
> + ? ? ? /* flush prefetch queue */
> + ? ? ? jmp ? ? next_line
> ?next_line:
> ? ? ? ?movw ? ?$return_ptr, %ax
> ? ? ? ?movw ? ?%ax,%bp
> @@ -182,12 +192,13 @@ o32 cs ? ?ljmp ? ?*(%bp)
>
> ?.code32
> ?protected_mode:
> - ? ? ? movl ? ?$0x18,%eax ? ? ? ? ? ? ? ? ? ? ?/* reload GDT[3] */
> - ? ? ? movw ? ?%ax,%fs ? ? ? ? ? ? ? ? ? ? ? ? /* reset FS */
> - ? ? ? movw ? ?%ax,%ds ? ? ? ? ? ? ? ? ? ? ? ? /* reset DS */
> - ? ? ? movw ? ?%ax,%gs ? ? ? ? ? ? ? ? ? ? ? ? /* reset GS */
> - ? ? ? movw ? ?%ax,%es ? ? ? ? ? ? ? ? ? ? ? ? /* reset ES */
> - ? ? ? movw ? ?%ax,%ss ? ? ? ? ? ? ? ? ? ? ? ? /* reset SS */
> + ? ? ? /* Reload segment registers */
> + ? ? ? movl ? ?$0x18, %eax
> + ? ? ? movw ? ?%ax, %fs
> + ? ? ? movw ? ?%ax, %ds
> + ? ? ? movw ? ?%ax, %gs
> + ? ? ? movw ? ?%ax, %es
> + ? ? ? movw ? ?%ax, %ss
> ? ? ? ?movl ? ?saved_protected_mode_esp, %eax
> ? ? ? ?movl ? ?%eax, %esp
> ? ? ? ?popf
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 13/17] x86: Move do_go_exec() out of board.c
  2012-01-02  4:09 ` [U-Boot] [PATCH 13/17] x86: Move do_go_exec() out of board.c Graeme Russ
@ 2012-01-04  5:48   ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:48 UTC (permalink / raw)
  To: u-boot

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> ?arch/x86/lib/Makefile ? | ? ?1 +
> ?arch/x86/lib/board.c ? ?| ? 27 -------------------
> ?arch/x86/lib/cmd_boot.c | ? 64 +++++++++++++++++++++++++++++++++++++++++++++++
> ?3 files changed, 65 insertions(+), 27 deletions(-)
> ?create mode 100644 arch/x86/lib/cmd_boot.c
>
> diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
> index d584aa4..7820895 100644
> --- a/arch/x86/lib/Makefile
> +++ b/arch/x86/lib/Makefile
> @@ -32,6 +32,7 @@ SOBJS-$(CONFIG_SYS_X86_REALMODE) ? ? ?+= realmode_switch.o
> ?COBJS-$(CONFIG_SYS_PC_BIOS) ? ?+= bios_setup.o
> ?COBJS-y ? ? ? ?+= board.o
> ?COBJS-y ? ? ? ?+= bootm.o
> +COBJS-y ? ? ? ?+= cmd_boot.o
> ?COBJS-y ? ? ? ?+= gcc.o
> ?COBJS-y ? ? ? ?+= interrupts.o
> ?COBJS-$(CONFIG_SYS_PCAT_INTERRUPTS) += pcat_interrupts.o
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index 52e27e1..533adf1 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -487,33 +487,6 @@ void hang(void)
> ? ? ? ? ? ? ? ?;
> ?}
>
> -unsigned long do_go_exec(ulong (*entry)(int, char * const []),
> - ? ? ? ? ? ? ? ? ? ? ? ?int argc, char * const argv[])
> -{
> - ? ? ? unsigned long ret = 0;
> - ? ? ? char **argv_tmp;
> -
> - ? ? ? /*
> - ? ? ? ?* x86 does not use a dedicated register to pass the pointer to
> - ? ? ? ?* the global_data, so it is instead passed as argv[-1]. By using
> - ? ? ? ?* argv[-1], the called 'Application' can use the contents of
> - ? ? ? ?* argv natively. However, to safely use argv[-1] a new copy of
> - ? ? ? ?* argv is needed with the extra element
> - ? ? ? ?*/
> - ? ? ? argv_tmp = malloc(sizeof(char *) * (argc + 1));
> -
> - ? ? ? if (argv_tmp) {
> - ? ? ? ? ? ? ? argv_tmp[0] = (char *)gd;
> -
> - ? ? ? ? ? ? ? memcpy(&argv_tmp[1], argv, (size_t)(sizeof(char *) * argc));
> -
> - ? ? ? ? ? ? ? ret = (entry) (argc, &argv_tmp[1]);
> - ? ? ? ? ? ? ? free(argv_tmp);
> - ? ? ? }
> -
> - ? ? ? return ret;
> -}
> -
> ?void setup_pcat_compatibility(void)
> ? ? ? ?__attribute__((weak, alias("__setup_pcat_compatibility")));
>
> diff --git a/arch/x86/lib/cmd_boot.c b/arch/x86/lib/cmd_boot.c
> new file mode 100644
> index 0000000..a81a9a3
> --- /dev/null
> +++ b/arch/x86/lib/cmd_boot.c
> @@ -0,0 +1,64 @@
> +/*
> + * (C) Copyright 2008-2011
> + * Graeme Russ, <graeme.russ@gmail.com>
> + *
> + * (C) Copyright 2002
> + * Daniel Engstr?m, Omicron Ceti AB, <daniel@omicron.se>
> + *
> + * (C) Copyright 2002
> + * Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
> + *
> + * (C) Copyright 2002
> + * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
> + * Marius Groeger <mgroeger@sysgo.de>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ?See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <common.h>
> +#include <command.h>
> +#include <malloc.h>
> +#include <asm/u-boot-x86.h>
> +
> +unsigned long do_go_exec(ulong (*entry)(int, char * const []),
> + ? ? ? ? ? ? ? ? ? ? ? ?int argc, char * const argv[])
> +{
> + ? ? ? unsigned long ret = 0;
> + ? ? ? char **argv_tmp;
> +
> + ? ? ? /*
> + ? ? ? ?* x86 does not use a dedicated register to pass the pointer to
> + ? ? ? ?* the global_data, so it is instead passed as argv[-1]. By using
> + ? ? ? ?* argv[-1], the called 'Application' can use the contents of
> + ? ? ? ?* argv natively. However, to safely use argv[-1] a new copy of
> + ? ? ? ?* argv is needed with the extra element
> + ? ? ? ?*/
> + ? ? ? argv_tmp = malloc(sizeof(char *) * (argc + 1));
> +
> + ? ? ? if (argv_tmp) {
> + ? ? ? ? ? ? ? argv_tmp[0] = (char *)gd;
> +
> + ? ? ? ? ? ? ? memcpy(&argv_tmp[1], argv, (size_t)(sizeof(char *) * argc));
> +
> + ? ? ? ? ? ? ? ret = (entry) (argc, &argv_tmp[1]);
> + ? ? ? ? ? ? ? free(argv_tmp);
> + ? ? ? }
> +
> + ? ? ? return ret;
> +}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 14/17] x86: Move setup_pcat_compatibility() out of board.c
  2012-01-02  4:09 ` [U-Boot] [PATCH 14/17] x86: Move setup_pcat_compatibility() " Graeme Russ
@ 2012-01-04  5:48   ` Simon Glass
  2012-01-04 11:38     ` Graeme Russ
  0 siblings, 1 reply; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:48 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Perhaps mention why? Anyway:

Acked-by: Simon Glass <sjg@chromium.org>

Regards,
Simon

> ---
> ?arch/x86/lib/board.c ?| ? ?7 -------
> ?arch/x86/lib/zimage.c | ? ?7 +++++++
> ?2 files changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index 533adf1..993e7df 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -486,10 +486,3 @@ void hang(void)
> ? ? ? ?for (;;)
> ? ? ? ? ? ? ? ?;
> ?}
> -
> -void setup_pcat_compatibility(void)
> - ? ? ? __attribute__((weak, alias("__setup_pcat_compatibility")));
> -
> -void __setup_pcat_compatibility(void)
> -{
> -}
> diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
> index bb40517..2214286 100644
> --- a/arch/x86/lib/zimage.c
> +++ b/arch/x86/lib/zimage.c
> @@ -314,6 +314,13 @@ void boot_zimage(void *setup_base, void *load_address)
> ?#endif
> ?}
>
> +void setup_pcat_compatibility(void)
> + ? ? ? __attribute__((weak, alias("__setup_pcat_compatibility")));
> +
> +void __setup_pcat_compatibility(void)
> +{
> +}
> +
> ?int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
> ?{
> ? ? ? ?struct boot_params *base_ptr;
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 16/17] x86: Simplify board.c
  2012-01-02  4:09 ` [U-Boot] [PATCH 16/17] x86: Simplify board.c Graeme Russ
@ 2012-01-04  5:51   ` Simon Glass
  2012-01-04 11:50     ` Graeme Russ
  0 siblings, 1 reply; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:51 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> ?arch/x86/include/asm/init_helpers.h ?| ? 39 +++++
> ?arch/x86/include/asm/init_wrappers.h | ? 42 +++++
> ?arch/x86/lib/Makefile ? ? ? ? ? ? ? ?| ? ?2 +
> ?arch/x86/lib/board.c ? ? ? ? ? ? ? ? | ?297 +++++++++-------------------------
> ?arch/x86/lib/init_helpers.c ? ? ? ? ?| ?142 ++++++++++++++++
> ?arch/x86/lib/init_wrappers.c ? ? ? ? | ?137 ++++++++++++++++

What is the rationale for putting these into separate files? If you
didn't then they would be static and presumably less code size.

Also for the commit message, is this really a simplification? It looks
more like you are splitting the code into separate functions.

Regards,
Simon

> ?6 files changed, 438 insertions(+), 221 deletions(-)
> ?create mode 100644 arch/x86/include/asm/init_helpers.h
> ?create mode 100644 arch/x86/include/asm/init_wrappers.h
> ?create mode 100644 arch/x86/lib/init_helpers.c
> ?create mode 100644 arch/x86/lib/init_wrappers.c
>
> diff --git a/arch/x86/include/asm/init_helpers.h b/arch/x86/include/asm/init_helpers.h
> new file mode 100644
> index 0000000..14ef11a
> --- /dev/null
> +++ b/arch/x86/include/asm/init_helpers.h
> @@ -0,0 +1,39 @@
> +/*
> + * (C) Copyright 2011
> + * Graeme Russ, <graeme.russ@gmail.com>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ?See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#ifndef _INIT_HELPERS_H_
> +#define _INIT_HELPERS_H_
> +
> +int display_banner(void);
> +int display_dram_config(void);
> +int init_baudrate_f(void);
> +
> +int mem_malloc_init_r(void);
> +int init_bd_struct_r(void);
> +int flash_init_r(void);
> +int init_ip_address_r(void);
> +int status_led_set_r(void);
> +int set_bootfile_r(void);
> +int set_load_addr_r(void);
> +
> +#endif /* !_INIT_HELPERS_H_ */
> diff --git a/arch/x86/include/asm/init_wrappers.h b/arch/x86/include/asm/init_wrappers.h
> new file mode 100644
> index 0000000..899ffb1
> --- /dev/null
> +++ b/arch/x86/include/asm/init_wrappers.h
> @@ -0,0 +1,42 @@
> +/*
> + * (C) Copyright 2011
> + * Graeme Russ, <graeme.russ@gmail.com>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ?See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#ifndef _INIT_WRAPPERS_H_
> +#define _INIT_WRAPPERS_H_
> +
> +int serial_initialize_r(void);
> +int env_relocate_r(void);
> +int pci_init_r(void);
> +int jumptable_init_r(void);
> +int pcmcia_init_r(void);
> +int kgdb_init_r(void);
> +int enable_interrupts_r(void);
> +int eth_initialize_r(void);
> +int reset_phy_r(void);
> +int ide_init_r(void);
> +int scsi_init_r(void);
> +int doc_init_r(void);
> +int bb_miiphy_init_r(void);
> +int post_run_r(void);
> +
> +#endif /* !_INIT_WRAPPERS_H_ */
> diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
> index 57b6896..51836da 100644
> --- a/arch/x86/lib/Makefile
> +++ b/arch/x86/lib/Makefile
> @@ -34,6 +34,8 @@ COBJS-y ? ? ? += board.o
> ?COBJS-y ? ? ? ?+= bootm.o
> ?COBJS-y ? ? ? ?+= cmd_boot.o
> ?COBJS-y ? ? ? ?+= gcc.o
> +COBJS-y ? ? ? ?+= init_helpers.o
> +COBJS-y ? ? ? ?+= init_wrappers.o
> ?COBJS-y ? ? ? ?+= interrupts.o
> ?COBJS-$(CONFIG_SYS_PCAT_INTERRUPTS) += pcat_interrupts.o
> ?COBJS-$(CONFIG_SYS_GENERIC_TIMER) += pcat_timer.o
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index fc7d0b7..f0a8e9c 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -33,62 +33,12 @@
>
> ?#include <common.h>
> ?#include <watchdog.h>
> -#include <command.h>
> ?#include <stdio_dev.h>
> -#include <version.h>
> -#include <malloc.h>
> -#include <net.h>
> -#include <ide.h>
> -#include <serial.h>
> ?#include <asm/u-boot-x86.h>
> ?#include <asm/processor.h>
>
> -#ifdef CONFIG_BITBANGMII
> -#include <miiphy.h>
> -#endif
> -
> -/************************************************************************
> - * Init Utilities ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*
> - ************************************************************************
> - * Some of this code should be moved into the core functions,
> - * or dropped completely,
> - * but let's get it working (again) first...
> - */
> -static int init_baudrate(void)
> -{
> - ? ? ? gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
> - ? ? ? return 0;
> -}
> -
> -static int display_banner(void)
> -{
> -
> - ? ? ? printf("\n\n%s\n\n", version_string);
> -
> - ? ? ? return 0;
> -}
> -
> -static int display_dram_config(void)
> -{
> - ? ? ? int i;
> -
> - ? ? ? puts("DRAM Configuration:\n");
> -
> - ? ? ? for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
> - ? ? ? ? ? ? ? printf("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
> - ? ? ? ? ? ? ? print_size(gd->bd->bi_dram[i].size, "\n");
> - ? ? ? }
> -
> - ? ? ? return 0;
> -}
> -
> -#ifndef CONFIG_SYS_NO_FLASH
> -static void display_flash_config(ulong size)
> -{
> - ? ? ? puts("Flash: ");
> - ? ? ? print_size(size, "\n");
> -}
> -#endif
> +#include <asm/init_helpers.h>
> +#include <asm/init_wrappers.h>
>
> ?/*
> ?* Breath some life into the board...
> @@ -122,7 +72,7 @@ init_fnc_t *init_sequence_f[] = {
> ? ? ? ?cpu_init_f,
> ? ? ? ?board_early_init_f,
> ? ? ? ?env_init,
> - ? ? ? init_baudrate,
> + ? ? ? init_baudrate_f,
> ? ? ? ?serial_init,
> ? ? ? ?console_init_f,
> ? ? ? ?dram_init_f,
> @@ -132,17 +82,81 @@ init_fnc_t *init_sequence_f[] = {
> ?};
>
> ?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 */
> - ? ? ? interrupt_init, ? ? ? ? /* set up exceptions */
> + ? ? ? init_bd_struct_r,
> + ? ? ? mem_malloc_init_r,
> + ? ? ? cpu_init_r,
> + ? ? ? board_early_init_r,
> + ? ? ? dram_init,
> + ? ? ? interrupt_init,
> ? ? ? ?timer_init,
> ? ? ? ?display_banner,
> ? ? ? ?display_dram_config,
> -
> +#ifdef CONFIG_SERIAL_MULTI
> + ? ? ? serial_initialize_r,
> +#endif
> +#ifndef CONFIG_SYS_NO_FLASH
> + ? ? ? flash_init_r,
> +#endif
> + ? ? ? env_relocate_r,
> +#ifdef CONFIG_CMD_NET
> + ? ? ? init_ip_address_r,
> +#endif
> +#ifdef CONFIG_PCI
> + ? ? ? pci_init_r,
> +#endif
> + ? ? ? stdio_init,
> + ? ? ? jumptable_init_r,
> + ? ? ? console_init_r,
> +#ifdef CONFIG_MISC_INIT_R
> + ? ? ? misc_init_r,
> +#endif
> +#if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_CMD_IDE)
> + ? ? ? pci_init_r,
> +#endif
> +#if defined(CONFIG_CMD_KGDB)
> + ? ? ? kgdb_init_r,
> +#endif
> + ? ? ? enable_interrupts_r,
> +#ifdef CONFIG_STATUS_LED
> + ? ? ? status_led_set_r,
> +#endif
> + ? ? ? set_load_addr_r,
> +#if defined(CONFIG_CMD_NET)
> + ? ? ? set_bootfile_r,
> +#endif
> +#if defined(CONFIG_CMD_IDE)
> + ? ? ? ide_init_r,
> +#endif
> +#if defined(CONFIG_CMD_SCSI)
> + ? ? ? scsi_init_r,
> +#endif
> +#if defined(CONFIG_CMD_DOC)
> + ? ? ? doc_init_r,
> +#endif
> +#ifdef CONFIG_BITBANGMII
> + ? ? ? bb_miiphy_init_r,
> +#endif
> +#if defined(CONFIG_CMD_NET)
> + ? ? ? eth_initialize_r,
> +#ifdef CONFIG_RESET_PHY_R
> + ? ? ? reset_phy_r,
> +#endif
> +#endif
> +#ifdef CONFIG_LAST_STAGE_INIT
> + ? ? ? last_stage_init,
> +#endif
> ? ? ? ?NULL,
> ?};
>
> +static void do_init_loop(init_fnc_t **init_fnc_ptr)
> +{
> + ? ? ? for (; *init_fnc_ptr; ++init_fnc_ptr) {
> + ? ? ? ? ? ? ? WATCHDOG_RESET();
> + ? ? ? ? ? ? ? if ((*init_fnc_ptr)() != 0)
> + ? ? ? ? ? ? ? ? ? ? ? hang();
> + ? ? ? }
> +}
> +
> ?static int calculate_relocation_address(void)
> ?{
> ? ? ? ?ulong text_start = (ulong)&__text_start;
> @@ -179,17 +193,12 @@ static int calculate_relocation_address(void)
> ? ? ? ?return 0;
> ?}
>
> -/* Load U-Boot into RAM, initialize BSS, perform relocation adjustments */
> +/* Perform all steps necessary to get RAM initialised ready for relocation */
> ?void board_init_f(ulong boot_flags)
> ?{
> - ? ? ? init_fnc_t **init_fnc_ptr;
> -
> ? ? ? ?gd->flags = boot_flags;
>
> - ? ? ? for (init_fnc_ptr = init_sequence_f; *init_fnc_ptr; ++init_fnc_ptr) {
> - ? ? ? ? ? ? ? if ((*init_fnc_ptr)() != 0)
> - ? ? ? ? ? ? ? ? ? ? ? hang();
> - ? ? ? }
> + ? ? ? do_init_loop(init_sequence_f);
>
> ? ? ? ?/*
> ? ? ? ? * SDRAM is now initialised, U-Boot has been copied into SDRAM,
> @@ -247,166 +256,12 @@ static int copy_gd_to_ram(void)
>
> ?void board_init_r(gd_t *id, ulong dest_addr)
> ?{
> -#if defined(CONFIG_CMD_NET)
> - ? ? ? char *s;
> -#endif
> -#ifndef CONFIG_SYS_NO_FLASH
> - ? ? ? ulong size;
> -#endif
> - ? ? ? static bd_t bd_data;
> - ? ? ? init_fnc_t **init_fnc_ptr;
> -
> - ? ? ? show_boot_progress(0x21);
> + ? ? ? gd->flags |= GD_FLG_RELOC;
>
> ? ? ? ?/* compiler optimization barrier needed for GCC >= 3.4 */
> ? ? ? ?__asm__ __volatile__("" : : : "memory");
>
> - ? ? ? gd->flags |= GD_FLG_RELOC;
> -
> - ? ? ? gd->bd = &bd_data;
> - ? ? ? memset(gd->bd, 0, sizeof(bd_t));
> - ? ? ? show_boot_progress(0x22);
> -
> - ? ? ? gd->baudrate = ?CONFIG_BAUDRATE;
> -
> - ? ? ? mem_malloc_init((((ulong)dest_addr - CONFIG_SYS_MALLOC_LEN)+3)&~3,
> - ? ? ? ? ? ? ? ? ? ? ? CONFIG_SYS_MALLOC_LEN);
> -
> - ? ? ? for (init_fnc_ptr = init_sequence_r; *init_fnc_ptr; ++init_fnc_ptr) {
> - ? ? ? ? ? ? ? if ((*init_fnc_ptr)() != 0)
> - ? ? ? ? ? ? ? ? ? ? ? hang();
> - ? ? ? }
> - ? ? ? show_boot_progress(0x23);
> -
> -#ifdef CONFIG_SERIAL_MULTI
> - ? ? ? serial_initialize();
> -#endif
> -
> -#ifndef CONFIG_SYS_NO_FLASH
> - ? ? ? /* configure available FLASH banks */
> - ? ? ? size = flash_init();
> - ? ? ? display_flash_config(size);
> - ? ? ? show_boot_progress(0x24);
> -#endif
> -
> - ? ? ? show_boot_progress(0x25);
> -
> - ? ? ? /* initialize environment */
> - ? ? ? env_relocate();
> - ? ? ? show_boot_progress(0x26);
> -
> -
> -#ifdef CONFIG_CMD_NET
> - ? ? ? /* IP Address */
> - ? ? ? bd_data.bi_ip_addr = getenv_IPaddr("ipaddr");
> -#endif
> -
> -#if defined(CONFIG_PCI)
> - ? ? ? /*
> - ? ? ? ?* Do pci configuration
> - ? ? ? ?*/
> - ? ? ? pci_init();
> -#endif
> -
> - ? ? ? show_boot_progress(0x27);
> -
> -
> - ? ? ? stdio_init();
> -
> - ? ? ? jumptable_init();
> -
> - ? ? ? /* Initialize the console (after the relocation and devices init) */
> - ? ? ? console_init_r();
> -
> -#ifdef CONFIG_MISC_INIT_R
> - ? ? ? /* miscellaneous platform dependent initialisations */
> - ? ? ? misc_init_r();
> -#endif
> -
> -#if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_CMD_IDE)
> - ? ? ? WATCHDOG_RESET();
> - ? ? ? puts("PCMCIA:");
> - ? ? ? pcmcia_init();
> -#endif
> -
> -#if defined(CONFIG_CMD_KGDB)
> - ? ? ? WATCHDOG_RESET();
> - ? ? ? puts("KGDB: ?");
> - ? ? ? kgdb_init();
> -#endif
> -
> - ? ? ? /* enable exceptions */
> - ? ? ? enable_interrupts();
> - ? ? ? show_boot_progress(0x28);
> -
> -#ifdef CONFIG_STATUS_LED
> - ? ? ? status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
> -#endif
> -
> - ? ? ? udelay(20);
> -
> - ? ? ? /* Initialize from environment */
> - ? ? ? load_addr = getenv_ulong("loadaddr", 16, load_addr);
> -#if defined(CONFIG_CMD_NET)
> - ? ? ? s = getenv("bootfile");
> -
> - ? ? ? if (s != NULL)
> - ? ? ? ? ? ? ? copy_filename(BootFile, s, sizeof(BootFile));
> -#endif
> -
> - ? ? ? WATCHDOG_RESET();
> -
> -#if defined(CONFIG_CMD_IDE)
> - ? ? ? WATCHDOG_RESET();
> - ? ? ? puts("IDE: ? ");
> - ? ? ? ide_init();
> -#endif
> -
> -#if defined(CONFIG_CMD_SCSI)
> - ? ? ? WATCHDOG_RESET();
> - ? ? ? puts("SCSI: ?");
> - ? ? ? scsi_init();
> -#endif
> -
> -#if defined(CONFIG_CMD_DOC)
> - ? ? ? WATCHDOG_RESET();
> - ? ? ? puts("DOC: ? ");
> - ? ? ? doc_init();
> -#endif
> -
> -#ifdef CONFIG_BITBANGMII
> - ? ? ? bb_miiphy_init();
> -#endif
> -#if defined(CONFIG_CMD_NET)
> - ? ? ? WATCHDOG_RESET();
> - ? ? ? puts("Net: ? ");
> - ? ? ? eth_initialize(gd->bd);
> -#endif
> -
> -#if (defined(CONFIG_CMD_NET)) && (0)
> - ? ? ? WATCHDOG_RESET();
> -# ifdef DEBUG
> - ? ? ? puts("Reset Ethernet PHY\n");
> -# endif
> - ? ? ? reset_phy();
> -#endif
> -
> -#ifdef CONFIG_LAST_STAGE_INIT
> - ? ? ? WATCHDOG_RESET();
> - ? ? ? /*
> - ? ? ? ?* Some parts can be only initialized if all others (like
> - ? ? ? ?* Interrupts) are up and running (i.e. the PC-style ISA
> - ? ? ? ?* keyboard).
> - ? ? ? ?*/
> - ? ? ? last_stage_init();
> -#endif
> -
> -
> -#ifdef CONFIG_POST
> - ? ? ? post_run(NULL, POST_RAM | post_bootmode_get(0));
> -#endif
> -
> - ? ? ? show_boot_progress(0x29);
> + ? ? ? do_init_loop(init_sequence_r);
>
> ? ? ? ?/* main_loop() can return to retry autoboot, if so just run it again. */
> ? ? ? ?for (;;)
> diff --git a/arch/x86/lib/init_helpers.c b/arch/x86/lib/init_helpers.c
> new file mode 100644
> index 0000000..547b180
> --- /dev/null
> +++ b/arch/x86/lib/init_helpers.c
> @@ -0,0 +1,142 @@
> +/*
> + * (C) Copyright 2011
> + * Graeme Russ, <graeme.russ@gmail.com>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ?See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +#include <common.h>
> +#include <command.h>
> +#include <stdio_dev.h>
> +#include <version.h>
> +#include <malloc.h>
> +#include <net.h>
> +#include <ide.h>
> +#include <serial.h>
> +#include <status_led.h>
> +#include <asm/u-boot-x86.h>
> +
> +#include <asm/init_helpers.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +/************************************************************************
> + * Init Utilities ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*
> + ************************************************************************
> + * Some of this code should be moved into the core functions,
> + * or dropped completely,
> + * but let's get it working (again) first...
> + */
> +
> +int display_banner(void)
> +{
> + ? ? ? printf("\n\n%s\n\n", version_string);
> +
> + ? ? ? return 0;
> +}
> +
> +int display_dram_config(void)
> +{
> + ? ? ? int i;
> +
> + ? ? ? puts("DRAM Configuration:\n");
> +
> + ? ? ? for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
> + ? ? ? ? ? ? ? printf("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
> + ? ? ? ? ? ? ? print_size(gd->bd->bi_dram[i].size, "\n");
> + ? ? ? }
> +
> + ? ? ? return 0;
> +}
> +
> +int init_baudrate_f(void)
> +{
> + ? ? ? gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
> + ? ? ? return 0;
> +}
> +
> +int mem_malloc_init_r(void)
> +{
> + ? ? ? mem_malloc_init(((gd->relocaddr - CONFIG_SYS_MALLOC_LEN)+3)&~3,
> + ? ? ? ? ? ? ? ? ? ? ? CONFIG_SYS_MALLOC_LEN);
> +
> + ? ? ? return 0;
> +}
> +
> +bd_t bd_data;
> +
> +int init_bd_struct_r(void)
> +{
> + ? ? ? gd->bd = &bd_data;
> + ? ? ? memset(gd->bd, 0, sizeof(bd_t));
> +
> + ? ? ? return 0;
> +}
> +
> +#ifndef CONFIG_SYS_NO_FLASH
> +int flash_init_r(void)
> +{
> + ? ? ? ulong size;
> +
> + ? ? ? puts("Flash: ");
> +
> + ? ? ? /* configure available FLASH banks */
> + ? ? ? size = flash_init();
> +
> + ? ? ? print_size(size, "\n");
> +
> + ? ? ? return 0;
> +}
> +#endif
> +
> +int init_ip_address_r(void)
> +{
> + ? ? ? /* IP Address */
> + ? ? ? bd_data.bi_ip_addr = getenv_IPaddr("ipaddr");
> +
> + ? ? ? return 0;
> +}
> +
> +#ifdef CONFIG_STATUS_LED
> +int status_led_set_r(void)
> +{
> + ? ? ? status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
> +
> + ? ? ? return 0;
> +}
> +#endif
> +
> +int set_bootfile_r(void)
> +{
> + ? ? ? char *s;
> +
> + ? ? ? s = getenv("bootfile");
> +
> + ? ? ? if (s != NULL)
> + ? ? ? ? ? ? ? copy_filename(BootFile, s, sizeof(BootFile));
> +
> + ? ? ? return 0;
> +}
> +
> +int set_load_addr_r(void)
> +{
> + ? ? ? /* Initialize from environment */
> + ? ? ? load_addr = getenv_ulong("loadaddr", 16, load_addr);
> +
> + ? ? ? return 0;
> +}
> diff --git a/arch/x86/lib/init_wrappers.c b/arch/x86/lib/init_wrappers.c
> new file mode 100644
> index 0000000..71449fe
> --- /dev/null
> +++ b/arch/x86/lib/init_wrappers.c
> @@ -0,0 +1,137 @@
> +/*
> + * (C) Copyright 2011
> + * Graeme Russ, <graeme.russ@gmail.com>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ?See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +#include <common.h>
> +#include <serial.h>
> +#include <kgdb.h>
> +#include <scsi.h>
> +#include <post.h>
> +#include <miiphy.h>
> +
> +#include <asm/init_wrappers.h>
> +
> +int serial_initialize_r(void)
> +{
> + ? ? ? serial_initialize();
> +
> + ? ? ? return 0;
> +}
> +
> +int env_relocate_r(void)
> +{
> + ? ? ? /* initialize environment */
> + ? ? ? env_relocate();
> +
> + ? ? ? return 0;
> +}
> +
> +
> +int pci_init_r(void)
> +{
> + ? ? ? /* Do pci configuration */
> + ? ? ? pci_init();
> +
> + ? ? ? return 0;
> +}
> +
> +int jumptable_init_r(void)
> +{
> + ? ? ? jumptable_init();
> +
> + ? ? ? return 0;
> +}
> +
> +int pcmcia_init_r(void)
> +{
> + ? ? ? puts("PCMCIA:");
> + ? ? ? pcmcia_init();
> +
> + ? ? ? return 0;
> +}
> +
> +int kgdb_init_r(void)
> +{
> + ? ? ? puts("KGDB: ?");
> + ? ? ? kgdb_init();
> +
> + ? ? ? return 0;
> +}
> +
> +int enable_interrupts_r(void)
> +{
> + ? ? ? /* enable exceptions */
> + ? ? ? enable_interrupts();
> +
> + ? ? ? return 0;
> +}
> +
> +int eth_initialize_r(void)
> +{
> + ? ? ? puts("Net: ? ");
> + ? ? ? eth_initialize(gd->bd);
> +
> + ? ? ? return 0;
> +}
> +
> +int reset_phy_r(void)
> +{
> +#ifdef DEBUG
> + ? ? ? puts("Reset Ethernet PHY\n");
> +#endif
> + ? ? ? reset_phy();
> +
> + ? ? ? return 0;
> +}
> +
> +int ide_init_r(void)
> +{
> + ? ? ? puts("IDE: ? ");
> + ? ? ? ide_init();
> +
> + ? ? ? return 0;
> +}
> +
> +int scsi_init_r(void)
> +{
> + ? ? ? puts("SCSI: ?");
> + ? ? ? scsi_init();
> +
> + ? ? ? return 0;
> +}
> +
> +#ifdef CONFIG_BITBANGMII
> +int bb_miiphy_init_r(void)
> +{
> + ? ? ? bb_miiphy_init();
> +
> + ? ? ? return 0;
> +}
> +#endif
> +
> +#ifdef CONFIG_POST
> +int post_run_r(void)
> +{
> + ? ? ? post_run(NULL, POST_RAM | post_bootmode_get(0));
> +
> + ? ? ? return 0;
> +}
> +#endif
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 17/17] x86: Tweak initialisation procedure
  2012-01-02  4:09 ` [U-Boot] [PATCH 17/17] x86: Tweak initialisation procedure Graeme Russ
@ 2012-01-04  5:52   ` Simon Glass
  2012-01-04 12:02     ` Graeme Russ
  0 siblings, 1 reply; 87+ messages in thread
From: Simon Glass @ 2012-01-04  5:52 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> ?arch/x86/include/asm/init_helpers.h | ? ?5 +
> ?arch/x86/include/asm/relocate.h ? ? | ? 33 ++++++
> ?arch/x86/lib/board.c ? ? ? ? ? ? ? ?| ?188 +++++++++++++++++------------------
> ?arch/x86/lib/init_helpers.c ? ? ? ? | ? 75 ++++++++++++++
> ?arch/x86/lib/relocate.c ? ? ? ? ? ? | ? 32 +-----
> ?5 files changed, 206 insertions(+), 127 deletions(-)

Seems like a fairly major tweak :-) Should this commit be split,
and/or perhaps explain the purpose in the commit message?

Regards,
Simon

> ?create mode 100644 arch/x86/include/asm/relocate.h
>
> diff --git a/arch/x86/include/asm/init_helpers.h b/arch/x86/include/asm/init_helpers.h
> index 14ef11a..192f18e 100644
> --- a/arch/x86/include/asm/init_helpers.h
> +++ b/arch/x86/include/asm/init_helpers.h
> @@ -27,7 +27,12 @@
> ?int display_banner(void);
> ?int display_dram_config(void);
> ?int init_baudrate_f(void);
> +int calculate_relocation_address(void);
>
> +int copy_gd_to_ram_f_r(void);
> +int init_cache_f_r(void);
> +
> +int set_reloc_flag_r(void);
> ?int mem_malloc_init_r(void);
> ?int init_bd_struct_r(void);
> ?int flash_init_r(void);
> diff --git a/arch/x86/include/asm/relocate.h b/arch/x86/include/asm/relocate.h
> new file mode 100644
> index 0000000..33129ef
> --- /dev/null
> +++ b/arch/x86/include/asm/relocate.h
> @@ -0,0 +1,33 @@
> +/*
> + * (C) Copyright 2011
> + * Graeme Russ, <graeme.russ@gmail.com>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ?See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#ifndef _RELOCATE_H_
> +#define _RELOCATE_H_
> +
> +#include <common.h>
> +
> +int copy_uboot_to_ram(void);
> +int clear_bss(void);
> +int do_elf_reloc_fixups(void);
> +
> +#endif /* !_RELOCATE_H_ */
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index f0a8e9c..d45b8fd 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -35,7 +35,7 @@
> ?#include <watchdog.h>
> ?#include <stdio_dev.h>
> ?#include <asm/u-boot-x86.h>
> -#include <asm/processor.h>
> +#include <asm/relocate.h>
>
> ?#include <asm/init_helpers.h>
> ?#include <asm/init_wrappers.h>
> @@ -43,31 +43,58 @@
> ?/*
> ?* Breath some life into the board...
> ?*
> - * Initialize an SMC for serial comms, and carry out some hardware
> - * tests.
> + * Getting the board up and running is a three-stage process:
> + * ?1) Execute from Flash, SDRAM Uninitialised
> + * ? ? At this point, there is a limited amount of non-SDRAM memory
> + * ? ? (typically the CPU cache, but can also be SRAM or even a buffer of
> + * ? ? of some peripheral). This limited memory is used to hold:
> + * ? ? ?- The initial copy of the Global Data Structure
> + * ? ? ?- A temporary stack
> + * ? ? ?- A temporary x86 Global Descriptor Table
> + * ? ? ?- The pre-console buffer (if enabled)
> ?*
> - * The first part of initialization is running from Flash memory;
> - * its main purpose is to initialize the RAM so that we
> - * can relocate the monitor code to RAM.
> + * ? ? The following is performed during this phase of execution:
> + * ? ? ?- Core low-level CPU initialisation
> + * ? ? ?- Console initialisation
> + * ? ? ?- SDRAM initialisation
> + *
> + * ?2) Execute from Flash, SDRAM Initialised
> + * ? ? At this point we copy Global Data from the initial non-SDRAM
> + * ? ? memory and set up the permanent stack in SDRAM. The CPU cache is no
> + * ? ? longer being used as temporary memory, so we can now fully enable
> + * ? ? it.
> + *
> + * ? ? The following is performed during this phase of execution:
> + * ? ? ?- Create final stack in SDRAM
> + * ? ? ?- Copy Global Data from temporary memory to SDRAM
> + * ? ? ?- Enabling of CPU cache(s),
> + * ? ? ?- Copying of U-Boot code and data from Flash to RAM
> + * ? ? ?- Clearing of the BSS
> + * ? ? ?- ELF relocation adjustments
> + *
> + * ?3) Execute from SDRAM
> + * ? ? The following is performed during this phase of execution:
> + * ? ? ?- All remaining initialisation
> ?*/
>
> ?/*
> - * All attempts to come up with a "common" initialization sequence
> - * that works for all boards and architectures failed: some of the
> - * requirements are just _too_ different. To get rid of the resulting
> - * mess of board dependend #ifdef'ed code we now make the whole
> - * initialization sequence configurable to the user.
> - *
> - * The requirements for any new initalization function is simple: it
> - * receives a pointer to the "global data" structure as it's only
> - * argument, and returns an integer return code, where 0 means
> - * "continue" and != 0 means "fatal error, hang the system".
> + * The requirements for any new initalization function is simple: it is
> + * a function with no parameters which returns an integer return code,
> + * where 0 means "continue" and != 0 means "fatal error, hang the system"
> ?*/
> ?typedef int (init_fnc_t) (void);
>
> -static int calculate_relocation_address(void);
> -static int copy_gd_to_ram(void);
> -
> +/*
> + * init_sequence_f is the list of init functions which are run when U-Boot
> + * is executing from Flash with a limited 'C' environment. The following
> + * limitations must be considered when implementing an '_f' function:
> + * ?- 'static' variables are read-only
> + * ?- Global Data (gd->xxx) is read/write
> + * ?- Stack space is limited
> + *
> + * The '_f' sequence must, as a minimum, initialise SDRAM. It _should_
> + * also initialise the console (to provide early debug output)
> + */
> ?init_fnc_t *init_sequence_f[] = {
> ? ? ? ?cpu_init_f,
> ? ? ? ?board_early_init_f,
> @@ -81,7 +108,39 @@ init_fnc_t *init_sequence_f[] = {
> ? ? ? ?NULL,
> ?};
>
> +/*
> + * init_sequence_f_r is the list of init functions which are run when
> + * U-Boot is executing from Flash with a semi-limited 'C' environment.
> + * The following limitations must be considered when implementing an
> + * '_f_r' function:
> + * ?- 'static' variables are read-only
> + * ?- Global Data (gd->xxx) is read/write
> + *
> + * The '_f_r' sequence must, as a minimum, copy U-Boot to RAM (if
> + * supported). ?It _should_, if possible, copy global data to RAM and
> + * initialise the CPU caches (to speed up the relocation process)
> + */
> +init_fnc_t *init_sequence_f_r[] = {
> + ? ? ? copy_gd_to_ram_f_r,
> + ? ? ? init_cache_f_r,
> + ? ? ? copy_uboot_to_ram,
> + ? ? ? clear_bss,
> + ? ? ? do_elf_reloc_fixups,
> +
> + ? ? ? NULL,
> +};
> +
> +/*
> + * init_sequence_r is the list of init functions which are run when U-Boot
> + * is executing from RAM with a full 'C' environment. There are no longer
> + * any limitations which must be considered when implementing an '_r'
> + * function, (i.e.'static' variables are read/write)
> + *
> + * If not already done, the '_r' sequence must copy global data to RAM and
> + * (should) initialise the CPU caches.
> + */
> ?init_fnc_t *init_sequence_r[] = {
> + ? ? ? set_reloc_flag_r,
> ? ? ? ?init_bd_struct_r,
> ? ? ? ?mem_malloc_init_r,
> ? ? ? ?cpu_init_r,
> @@ -157,54 +216,14 @@ static void do_init_loop(init_fnc_t **init_fnc_ptr)
> ? ? ? ?}
> ?}
>
> -static int calculate_relocation_address(void)
> -{
> - ? ? ? ulong text_start = (ulong)&__text_start;
> - ? ? ? ulong bss_end = (ulong)&__bss_end;
> - ? ? ? ulong dest_addr;
> -
> - ? ? ? /*
> - ? ? ? ?* NOTE: All destination address are rounded down to 16-byte
> - ? ? ? ?* ? ? ? boundary to satisfy various worst-case alignment
> - ? ? ? ?* ? ? ? requirements
> - ? ? ? ?*/
> -
> - ? ? ? /* Global Data is at top of available memory */
> - ? ? ? dest_addr = gd->ram_size;
> - ? ? ? dest_addr -= GENERATED_GBL_DATA_SIZE;
> - ? ? ? dest_addr &= ~15;
> - ? ? ? gd->new_gd_addr = dest_addr;
> -
> - ? ? ? /* GDT is below Global Data */
> - ? ? ? dest_addr -= GDT_SIZE;
> - ? ? ? dest_addr &= ~15;
> - ? ? ? gd->gdt_addr = dest_addr;
> -
> - ? ? ? /* Stack is below GDT */
> - ? ? ? gd->start_addr_sp = dest_addr;
> -
> - ? ? ? /* U-Boot is below the stack */
> - ? ? ? dest_addr -= CONFIG_SYS_STACK_SIZE;
> - ? ? ? dest_addr -= (bss_end - text_start);
> - ? ? ? dest_addr &= ~15;
> - ? ? ? gd->relocaddr = dest_addr;
> - ? ? ? gd->reloc_off = (dest_addr - text_start);
> -
> - ? ? ? return 0;
> -}
> -
> -/* Perform all steps necessary to get RAM initialised ready for relocation */
> ?void board_init_f(ulong boot_flags)
> ?{
> - ? ? ? gd->flags = boot_flags;
> -
> ? ? ? ?do_init_loop(init_sequence_f);
>
> ? ? ? ?/*
> - ? ? ? ?* SDRAM is now initialised, U-Boot has been copied into SDRAM,
> - ? ? ? ?* the BSS has been cleared etc. The final stack can now be setup
> - ? ? ? ?* in SDRAM. Code execution will continue (momentarily) in Flash,
> - ? ? ? ?* but with the stack in SDRAM and Global Data in temporary memory
> + ? ? ? ?* SDRAM and console are now initialised. The final stack can now
> + ? ? ? ?* be setup in SDRAM. Code execution will continue in Flash, but
> + ? ? ? ?* with the stack in SDRAM and Global Data in temporary memory
> ? ? ? ? * (CPU cache)
> ? ? ? ? */
> ? ? ? ?board_init_f_r_trampoline(gd->start_addr_sp);
> @@ -216,51 +235,22 @@ void board_init_f(ulong boot_flags)
>
> ?void board_init_f_r(void)
> ?{
> - ? ? ? if (copy_gd_to_ram() != 0)
> - ? ? ? ? ? ? ? hang();
> -
> - ? ? ? if (init_cache() != 0)
> - ? ? ? ? ? ? ? hang();
> -
> - ? ? ? relocate_code(0, gd, 0);
> -
> - ? ? ? /* NOTREACHED - relocate_code() does not return */
> - ? ? ? while (1)
> - ? ? ? ? ? ? ? ;
> -}
> -
> -static int copy_gd_to_ram(void)
> -{
> - ? ? ? gd_t *ram_gd;
> + ? ? ? do_init_loop(init_sequence_f_r);
>
> ? ? ? ?/*
> - ? ? ? ?* Global data is still in temporary memory (the CPU cache).
> - ? ? ? ?* calculate_relocation_address() has set gd->new_gd_addr to
> - ? ? ? ?* where the global data lives in RAM but getting it there
> - ? ? ? ?* safely is a bit tricky due to the 'F-Segment Hack' that
> - ? ? ? ?* we need to use for x86
> + ? ? ? ?* U-Boot has been copied into SDRAM, the BSS has been cleared etc.
> + ? ? ? ?* Transfer execution from Flash to RAM by calculating the address
> + ? ? ? ?* of the in-RAM copy of board_init_r() and calling it
> ? ? ? ? */
> - ? ? ? ram_gd = (gd_t *)gd->new_gd_addr;
> - ? ? ? memcpy((void *)ram_gd, gd, sizeof(gd_t));
> + ? ? ? (board_init_r + gd->reloc_off)(gd, gd->relocaddr);
>
> - ? ? ? /*
> - ? ? ? ?* Reload the Global Descriptor Table so FS points to the
> - ? ? ? ?* in-RAM copy of Global Data (calculate_relocation_address()
> - ? ? ? ?* has already calculated the in-RAM location of the GDT)
> - ? ? ? ?*/
> - ? ? ? ram_gd->gd_addr = (ulong)ram_gd;
> - ? ? ? init_gd(ram_gd, (u64 *)gd->gdt_addr);
> -
> - ? ? ? return 0;
> + ? ? ? /* NOTREACHED - board_init_r() does not return */
> + ? ? ? while (1)
> + ? ? ? ? ? ? ? ;
> ?}
>
> ?void board_init_r(gd_t *id, ulong dest_addr)
> ?{
> - ? ? ? gd->flags |= GD_FLG_RELOC;
> -
> - ? ? ? /* compiler optimization barrier needed for GCC >= 3.4 */
> - ? ? ? __asm__ __volatile__("" : : : "memory");
> -
> ? ? ? ?do_init_loop(init_sequence_r);
>
> ? ? ? ?/* main_loop() can return to retry autoboot, if so just run it again. */
> diff --git a/arch/x86/lib/init_helpers.c b/arch/x86/lib/init_helpers.c
> index 547b180..acc825b 100644
> --- a/arch/x86/lib/init_helpers.c
> +++ b/arch/x86/lib/init_helpers.c
> @@ -29,6 +29,7 @@
> ?#include <ide.h>
> ?#include <serial.h>
> ?#include <status_led.h>
> +#include <asm/processor.h>
> ?#include <asm/u-boot-x86.h>
>
> ?#include <asm/init_helpers.h>
> @@ -70,6 +71,80 @@ int init_baudrate_f(void)
> ? ? ? ?return 0;
> ?}
>
> +int calculate_relocation_address(void)
> +{
> + ? ? ? ulong text_start = (ulong)&__text_start;
> + ? ? ? ulong bss_end = (ulong)&__bss_end;
> + ? ? ? ulong dest_addr;
> +
> + ? ? ? /*
> + ? ? ? ?* NOTE: All destination address are rounded down to 16-byte
> + ? ? ? ?* ? ? ? boundary to satisfy various worst-case alignment
> + ? ? ? ?* ? ? ? requirements
> + ? ? ? ?*/
> +
> + ? ? ? /* Global Data is at top of available memory */
> + ? ? ? dest_addr = gd->ram_size;
> + ? ? ? dest_addr -= GENERATED_GBL_DATA_SIZE;
> + ? ? ? dest_addr &= ~15;
> + ? ? ? gd->new_gd_addr = dest_addr;
> +
> + ? ? ? /* GDT is below Global Data */
> + ? ? ? dest_addr -= GDT_SIZE;
> + ? ? ? dest_addr &= ~15;
> + ? ? ? gd->gdt_addr = dest_addr;
> +
> + ? ? ? /* Stack is below GDT */
> + ? ? ? gd->start_addr_sp = dest_addr;
> +
> + ? ? ? /* U-Boot is below the stack */
> + ? ? ? dest_addr -= CONFIG_SYS_STACK_SIZE;
> + ? ? ? dest_addr -= (bss_end - text_start);
> + ? ? ? dest_addr &= ~15;
> + ? ? ? gd->relocaddr = dest_addr;
> + ? ? ? gd->reloc_off = (dest_addr - text_start);
> +
> + ? ? ? return 0;
> +}
> +
> +int copy_gd_to_ram_f_r(void)
> +{
> + ? ? ? gd_t *ram_gd;
> +
> + ? ? ? /*
> + ? ? ? ?* Global data is still in temporary memory (the CPU cache).
> + ? ? ? ?* calculate_relocation_address() has set gd->new_gd_addr to
> + ? ? ? ?* where the global data lives in RAM but getting it there
> + ? ? ? ?* safely is a bit tricky due to the 'F-Segment Hack' that
> + ? ? ? ?* we need to use for x86
> + ? ? ? ?*/
> + ? ? ? ram_gd = (gd_t *)gd->new_gd_addr;
> + ? ? ? memcpy((void *)ram_gd, gd, sizeof(gd_t));
> +
> + ? ? ? /*
> + ? ? ? ?* Reload the Global Descriptor Table so FS points to the
> + ? ? ? ?* in-RAM copy of Global Data (calculate_relocation_address()
> + ? ? ? ?* has already calculated the in-RAM location of the GDT)
> + ? ? ? ?*/
> + ? ? ? ram_gd->gd_addr = (ulong)ram_gd;
> + ? ? ? init_gd(ram_gd, (u64 *)gd->gdt_addr);
> +
> + ? ? ? return 0;
> +}
> +
> +int init_cache_f_r(void)
> +{
> + ? ? ? /* Initialise the CPU cache(s) */
> + ? ? ? return init_cache();
> +}
> +
> +int set_reloc_flag_r(void)
> +{
> + ? ? ? gd->flags = boot_flags;
> +
> + ? ? ? return 0;
> +}
> +
> ?int mem_malloc_init_r(void)
> ?{
> ? ? ? ?mem_malloc_init(((gd->relocaddr - CONFIG_SYS_MALLOC_LEN)+3)&~3,
> diff --git a/arch/x86/lib/relocate.c b/arch/x86/lib/relocate.c
> index badb5f8..200baab 100644
> --- a/arch/x86/lib/relocate.c
> +++ b/arch/x86/lib/relocate.c
> @@ -34,13 +34,10 @@
> ?#include <common.h>
> ?#include <malloc.h>
> ?#include <asm/u-boot-x86.h>
> +#include <asm/relocate.h>
> ?#include <elf.h>
>
> -static int copy_uboot_to_ram(void);
> -static int clear_bss(void);
> -static int do_elf_reloc_fixups(void);
> -
> -static int copy_uboot_to_ram(void)
> +int copy_uboot_to_ram(void)
> ?{
> ? ? ? ?size_t len = (size_t)&__data_end - (size_t)&__text_start;
>
> @@ -49,7 +46,7 @@ static int copy_uboot_to_ram(void)
> ? ? ? ?return 0;
> ?}
>
> -static int clear_bss(void)
> +int clear_bss(void)
> ?{
> ? ? ? ?ulong dst_addr = (ulong)&__bss_start + gd->reloc_off;
> ? ? ? ?size_t len = (size_t)&__bss_end - (size_t)&__bss_start;
> @@ -59,7 +56,7 @@ static int clear_bss(void)
> ? ? ? ?return 0;
> ?}
>
> -static int do_elf_reloc_fixups(void)
> +int do_elf_reloc_fixups(void)
> ?{
> ? ? ? ?Elf32_Rel *re_src = (Elf32_Rel *)(&__rel_dyn_start);
> ? ? ? ?Elf32_Rel *re_end = (Elf32_Rel *)(&__rel_dyn_end);
> @@ -92,24 +89,3 @@ static int do_elf_reloc_fixups(void)
>
> ? ? ? ?return 0;
> ?}
> -
> -void relocate_code(ulong dummy_1, gd_t *id, ulong dummy_2)
> -{
> - ? ? ? /*
> - ? ? ? ?* Copy U-Boot into RAM, clear the BSS and perform relocation
> - ? ? ? ?* adjustments
> - ? ? ? ?*/
> - ? ? ? copy_uboot_to_ram();
> - ? ? ? clear_bss();
> - ? ? ? do_elf_reloc_fixups();
> -
> - ? ? ? /*
> - ? ? ? ?* Transfer execution from Flash to RAM by calculating the address
> - ? ? ? ?* of the in-RAM copy of board_init_r() and calling it
> - ? ? ? ?*/
> - ? ? ? (board_init_r + gd->reloc_off)(gd, gd->relocaddr);
> -
> - ? ? ? /* NOTREACHED - board_init_r() does not return */
> - ? ? ? while (1)
> - ? ? ? ? ? ? ? ;
> -}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 02/17] x86: Speed up copy-to-RAM and clear BSS operations
  2012-01-04  5:21   ` Simon Glass
@ 2012-01-04 10:04     ` Graeme Russ
  0 siblings, 0 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 10:04 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 04/01/12 16:21, Simon Glass wrote:
> Hi Graeme,
> 
> On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>> The implementations of memcpy and memset are now the optimised versions
>> from glibc, so use them instead of simple copy loops
>>
>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
>> ---
>>  arch/x86/lib/board.c |   17 +++++------------
>>  1 files changed, 5 insertions(+), 12 deletions(-)
>>
>> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
>> index d742fec..ba6b59f 100644
>> --- a/arch/x86/lib/board.c
>> +++ b/arch/x86/lib/board.c
>> @@ -188,26 +188,19 @@ static int calculate_relocation_address(void)
>>
>>  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;
>> +       size_t len = (size_t)(&__data_end) - (size_t)(&__text_start);
> 
> Extra brackets here. Also is the type of these not char[] already? Same Q below.

I removed the brackets for v2 - The cast is required because &__data_end is
a ulong *

Actually:

	size_t len = &__data_end - &__text_start;

works, but is dangerous - I have been caught out several times in this code
doing raw arithmetic, particularly using increment and decrement operators.
I prefer to make the casts explicit now

Regards,

Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 03/17] x86: Remove GDR related magic numbers
  2012-01-04  5:23   ` Simon Glass
@ 2012-01-04 10:20     ` Graeme Russ
  0 siblings, 0 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 10:20 UTC (permalink / raw)
  To: u-boot

On 04/01/12 16:23, Simon Glass wrote:
> Hi Graeme,
> 
> On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>
>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
>> ---
>>  arch/x86/cpu/start.S             |    3 ++-
>>  arch/x86/include/asm/processor.h |    6 +++++-
>>  2 files changed, 7 insertions(+), 2 deletions(-)
>>
>> diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
>> index f87633b..7f9b6a7 100644
>> --- a/arch/x86/cpu/start.S
>> +++ b/arch/x86/cpu/start.S
>> @@ -29,6 +29,7 @@
>>  #include <config.h>
>>  #include <version.h>
>>  #include <asm/global_data.h>
>> +#include <asm/processor.h>
>>  #include <asm/processor-flags.h>
>>  #include <generated/asm-offsets.h>
>>
>> @@ -58,7 +59,7 @@ _start:
>>        /* This is the 32-bit cold-reset entry point */
>>
>>        /* Load the segement registes to match the gdt loaded in start16.S */
>> -       movl    $0x18, %eax
>> +       movl    $(GDT_ENTRY_32BIT_DS * 8), %eax
>>        movw    %ax, %fs
>>        movw    %ax, %ds
>>        movw    %ax, %gs
>> diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
>> index 1e5dccd..203c63a 100644
>> --- a/arch/x86/include/asm/processor.h
>> +++ b/arch/x86/include/asm/processor.h
>> @@ -24,9 +24,13 @@
>>  #ifndef __ASM_PROCESSOR_H_
>>  #define __ASM_PROCESSOR_H_ 1
>>
>> -#define GDT_ENTRY_32BIT_CS     2
>> +#define GDT_ENTRY_NULL         0
>> +#define GDT_ENTRY_UNUSED       (GDT_ENTRY_NULL + 1)
>> +#define GDT_ENTRY_32BIT_CS     (GDT_ENTRY_UNUSED + 1)
>>  #define GDT_ENTRY_32BIT_DS     (GDT_ENTRY_32BIT_CS + 1)
>>  #define GDT_ENTRY_16BIT_CS     (GDT_ENTRY_32BIT_DS + 1)
>>  #define GDT_ENTRY_16BIT_DS     (GDT_ENTRY_16BIT_CS + 1)
> 
>>
>> +#define GDT_NUM_ENTRIES                (GDT_ENTRY_16BIT_DS + 1)
>> +
> 
> Ick - any reason not to use an enum here?

Done, but I still need a rouge #define for the assembler case above

Also, I added an X86_ prefix as per Linux headers and moved the size define
up from patch 7

Regards

Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 04/17] x86: Rework Global Descriptor Table loading
  2012-01-04  5:24   ` Simon Glass
@ 2012-01-04 10:30     ` Graeme Russ
  0 siblings, 0 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 10:30 UTC (permalink / raw)
  To: u-boot

On 04/01/12 16:24, Simon Glass wrote:
> Hi Graeme,
> 
> On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>
> 
> This probably needs a commit message?

Done

Regards,

Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 05/17] x86: Simplify Flash-to-RAM code execution transition
  2012-01-04  5:28   ` Simon Glass
@ 2012-01-04 10:59     ` Graeme Russ
  0 siblings, 0 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 10:59 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 04/01/12 16:28, Simon Glass wrote:
> Hi Graeme,
> 
> On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>
>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> 
> Commit message?

Added in v2

> 
>> ---
>>  arch/x86/cpu/start.S              |   20 +++++---------------
>>  arch/x86/include/asm/u-boot-x86.h |    2 ++
>>  arch/x86/lib/board.c              |   25 ++++++++++++++++++++++---
>>  3 files changed, 29 insertions(+), 18 deletions(-)
>>
>> diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
>> index 7f9b6a7..9592158 100644
>> --- a/arch/x86/cpu/start.S
>> +++ b/arch/x86/cpu/start.S
>> @@ -96,32 +96,22 @@ car_init_ret:
>>        movw    $0x85, %ax
>>        jmp     die
>>
>> -.globl relocate_code
>> -.type relocate_code, @function
>> -relocate_code:
>> +.globl board_init_f_r_trampoline
>> +.type board_init_f_r_trampoline, @function
>> +board_init_f_r_trampoline:
>>        /*
>>         * SDRAM has been initialised, U-Boot code has been copied into
>>         * RAM, BSS has been cleared and relocation adjustments have been
>>         * made. It is now time to jump into the in-RAM copy of U-Boot
>>         *
>>         * %eax = Address of top of stack
> 
> *new* top of stack?

Changed to 'Address of top of new stack'

[snip]

>> -
>> -       /* Jump to in-RAM copy of board_init_r() */
>> -       call    *%ebp
>> +       /* Re-enter U-Boot by calling board_init_f_r */
>> +       call    board_init_f_r
> 
> Isn't this a bit of a funny name? Why not call it something like
> call_board_init_r() ?

No, board_init_f_r is where we are still running from Flash, but RAM has
been initialised so we can actually use it for the stack and Global Data.
board_init_r is when we are running exclusively from RAM

[snip]

Regards,

Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 07/17] x86: Use fs for global data
  2012-01-04  5:36   ` Simon Glass
@ 2012-01-04 11:14     ` Graeme Russ
  0 siblings, 0 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 11:14 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 04/01/12 16:36, Simon Glass wrote:
> Hi Graeme,
> 
> On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>> Use the base address of the 'F' segment as a pointer to the global data
>> structure. By adding the linear address (i.e. the 'D' segment address)
>> as the first word of the global data structure, the address of the
>> global data relative to the 'D' segment can be found simply, for
>> example, by:
>>
>>        fs movl 0, %eax
>>
>> This makes the gd 'pointer' writable prior to relocation (by reloading
>> the GDT) which brings x86 into line with all other arches
> 
> What is the GDT?

Global Descriptor Table - It's a kind of lookup table which the x86 CPU
uses to calculate physical addresses relative to 'segments' - By placing
the start of the 'F' segment to the physical address of the global data
structure, and adding a self-referencing physical address to the global
data structure (as the first member), reading the first word of the 'F'
segment provides the physical address of the global data

>>
>> NOTE: Writing to the gd 'pointer' is expensive (but we only do it
>> twice) but using it to access global data members (read and write) is
>> still fairly cheap
>>
>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
>> ---
>>  arch/x86/cpu/cpu.c                 |   53 ++++++++++++++++++++--------------
>>  arch/x86/cpu/start.S               |    8 ++++-
>>  arch/x86/include/asm/global_data.h |   21 +++++++++----
>>  arch/x86/include/asm/processor.h   |    6 +++-
>>  arch/x86/include/asm/u-boot-x86.h  |    2 +
>>  arch/x86/lib/board.c               |   56 +++++++++++++++++++++++++-----------
>>  6 files changed, 98 insertions(+), 48 deletions(-)
>>
>> diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
>> index bf55c26..e7a5fc0 100644
>> --- a/arch/x86/cpu/cpu.c
>> +++ b/arch/x86/cpu/cpu.c
>> @@ -90,6 +90,37 @@ static void load_gdt(const u64 *boot_gdt, u16 num_entries)
>>        asm volatile("lgdtl %0\n" : : "m" (gdt));
>>  }
>>
>> +void init_gd(gd_t *id, u64 *gdt_addr)
>> +{
>> +       id->gd_addr = (ulong)id;
>> +       setup_gdt(id, gdt_addr);
>> +}
>> +
>> +void setup_gdt(gd_t *id, u64 *gdt_addr)
> 
> I will probably never understand this function but a comment might be nice.

Hmm, I guess I really don't know how to comment this to explain it clearly
- The GDT is a bit of a magical beast which you kind of have to learn by
osmosis ;)

> 
>> +{
>> +       /* CS: code, read/execute, 4 GB, base 0 */
>> +       gdt_addr[GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff);
>> +
>> +       /* DS: data, read/write, 4 GB, base 0 */
>> +       gdt_addr[GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff);
>> +
>> +       /* FS: data, read/write, 4 GB, base (Global Data Pointer) */
>> +       gdt_addr[GDT_ENTRY_32BIT_FS] = GDT_ENTRY(0xc093, (ulong)id, 0xfffff);
>> +
>> +               /* 16-bit CS: code, read/execute, 64 kB, base 0 */
> 
> Extra indent?

Removed

[snip]

>> diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
>> index 203c63a..07897f9 100644
>> --- a/arch/x86/include/asm/processor.h
>> +++ b/arch/x86/include/asm/processor.h
>> @@ -24,13 +24,17 @@
>>  #ifndef __ASM_PROCESSOR_H_
>>  #define __ASM_PROCESSOR_H_ 1
>>
>> +#define GDT_ENTRY_SIZE         8
>> +
>>  #define GDT_ENTRY_NULL         0
>>  #define GDT_ENTRY_UNUSED       (GDT_ENTRY_NULL + 1)
>>  #define GDT_ENTRY_32BIT_CS     (GDT_ENTRY_UNUSED + 1)
>>  #define GDT_ENTRY_32BIT_DS     (GDT_ENTRY_32BIT_CS + 1)
>> -#define GDT_ENTRY_16BIT_CS     (GDT_ENTRY_32BIT_DS + 1)
>> +#define GDT_ENTRY_32BIT_FS     (GDT_ENTRY_32BIT_DS + 1)
>> +#define GDT_ENTRY_16BIT_CS     (GDT_ENTRY_32BIT_FS + 1)
>>  #define GDT_ENTRY_16BIT_DS     (GDT_ENTRY_16BIT_CS + 1)
>>
>>  #define GDT_NUM_ENTRIES                (GDT_ENTRY_16BIT_DS + 1)
>> +#define GDT_SIZE               (GDT_NUM_ENTRIES * GDT_ENTRY_SIZE)
> 
> Wasn't this already done in an earlier patch?

I've moved this change into patch #3

Regards,

Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 09/17] x86: Create weak init_cache() function
  2012-01-04  5:38   ` Simon Glass
@ 2012-01-04 11:25     ` Graeme Russ
  0 siblings, 0 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 11:25 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 04/01/12 16:38, Simon Glass wrote:
> Hi Graeme,
> 
> On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>
>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
>> ---
>>  arch/x86/cpu/cpu.c                |   18 +++++++++++++++---
>>  arch/x86/include/asm/u-boot-x86.h |    1 +
>>  arch/x86/lib/board.c              |    1 +
>>  3 files changed, 17 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
>> index e7a5fc0..4351f20 100644
>> --- a/arch/x86/cpu/cpu.c
>> +++ b/arch/x86/cpu/cpu.c
>> @@ -140,6 +140,14 @@ int cpu_init_f(void) __attribute__((weak, alias("x86_cpu_init_f")));
>>
>>  int x86_cpu_init_r(void)
>>  {
>> +       /* Initialize core interrupt and exception functionality of CPU */
>> +       cpu_init_interrupts();
>> +       return 0;
>> +}
> 
> This doesn't seem to match the commit title.

Well git diffs do some weird things sometimes - if you look further down,
you'll see that there isn't actually a code change here

> 
>> +int cpu_init_r(void) __attribute__((weak, alias("x86_cpu_init_r")));
>> +
>> +void x86_enable_caches(void)
>> +{
>>        const u32 nw_cd_rst = ~(X86_CR0_NW | X86_CR0_CD);
>>
>>        /* turn on the cache and disable write through */
>> @@ -147,12 +155,16 @@ int x86_cpu_init_r(void)
>>            "andl       %0, %%eax\n"
>>            "movl       %%eax, %%cr0\n"
>>            "wbinvd\n" : : "i" (nw_cd_rst) : "eax");
>> +}
>> +void enable_caches(void) __attribute__((weak, alias("x86_enable_caches")));
>> +
>> +int x86_init_cache(void)
>> +{
>> +       enable_caches();
> 
> Does this enable both I and D caches?

Yes - In x86, the I & D caches are turned on and off simultaneously. Also,
some x86 CPU's only have a single unified cache anyway

>>
>> -       /* Initialize core interrupt and exception functionality of CPU */
>> -       cpu_init_interrupts();
>>        return 0;
>>  }
>> -int cpu_init_r(void) __attribute__((weak, alias("x86_cpu_init_r")));
>> +int init_cache(void) __attribute__((weak, alias("x86_init_cache")));
>>
>>  int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>>  {
>> diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
>> index 5540d51..878a1ee 100644
>> --- a/arch/x86/include/asm/u-boot-x86.h
>> +++ b/arch/x86/include/asm/u-boot-x86.h
>> @@ -39,6 +39,7 @@ int x86_cpu_init_f(void);
>>  int cpu_init_f(void);
>>  void init_gd(gd_t *id, u64 *gdt_addr);
>>  void setup_gdt(gd_t *id, u64 *gdt_addr);
>> +int init_cache(void);
>>
>>  /* cpu/.../timer.c */
>>  void timer_isr(void *);
>> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
>> index 4e54dba..ffddfbe 100644
>> --- a/arch/x86/lib/board.c
>> +++ b/arch/x86/lib/board.c
>> @@ -140,6 +140,7 @@ init_fnc_t *init_sequence_f[] = {
>>
>>  init_fnc_t *init_sequence_r[] = {
>>        copy_gd_to_ram,
>> +       init_cache,
> 
> Would enable_caches be a better name?

Getting the cache working is a two step process - init_cache() sets up the
cache regions, typically using the Memory Type Range Registers (MTRRs)

enable_caches() actually turns the CPU cache on

Regards,

Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 10/17] x86: Allow cache before copy to RAM
  2012-01-04  5:40   ` Simon Glass
@ 2012-01-04 11:29     ` Graeme Russ
  0 siblings, 0 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 11:29 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 04/01/12 16:40, Simon Glass wrote:
> Hi Graeme,
> 
> On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>
>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
>> ---
>>  arch/x86/lib/board.c |   15 ++++++++++-----
>>  1 files changed, 10 insertions(+), 5 deletions(-)
>>
>> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
>> index ffddfbe..52e27e1 100644
>> --- a/arch/x86/lib/board.c
>> +++ b/arch/x86/lib/board.c
>> @@ -131,16 +131,11 @@ init_fnc_t *init_sequence_f[] = {
>>        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[] = {
>> -       copy_gd_to_ram,
>> -       init_cache,
>>        cpu_init_r,             /* basic cpu dependent setup */
>>        board_early_init_r,     /* basic board dependent setup */
>>        dram_init,              /* configure available RAM banks */
>> @@ -269,6 +264,16 @@ void board_init_f(ulong boot_flags)
>>
>>  void board_init_f_r(void)
>>  {
>> +       if (copy_gd_to_ram() != 0)
>> +               hang();
>> +
>> +       if (init_cache() != 0)
>> +               hang();
>> +
>> +       copy_uboot_to_ram();
>> +       clear_bss();
>> +       do_elf_reloc_fixups();
> 
> Can you not just put these in the init list above? Why do they need to
> move back into this functoin?

board_init_f_r() is the intermediate step when we are running from Flash,
but with the stack and global data in RAM. If these functions are put in
init_sequence_f() we cannot enable the CPU cache (as the stack and global
data would get trashed). We can't put them in init_sequence_r because these
are the functions that actually copy U-Boot to RAM (and hence must be done
before init_sequence_r)

Regards,

Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 11/17] CHECKPATCH: arch/x86/cpu/*
  2012-01-04  5:42   ` Simon Glass
@ 2012-01-04 11:35     ` Graeme Russ
  0 siblings, 0 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 11:35 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 04/01/12 16:42, Simon Glass wrote:
> Hi Graeme,
> 
> On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>
>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> 
> Seems a bit more than just checkpatch.

True - I'll change the name to 'Tweak IDT and GDT for alignment and
readability' - Saves me splitting the patch ;)

Regards,

Graeme

> 
> Acked-by: Simon Glass <sjg@chromium.org>
> 
> Regards,
> Simon
> 
>> ---
>>  arch/x86/cpu/interrupts.c |    2 +-
>>  arch/x86/cpu/start16.S    |   57 +++++++++++++++++++++++++++++++++++---------
>>  2 files changed, 46 insertions(+), 13 deletions(-)
>>
>> diff --git a/arch/x86/cpu/interrupts.c b/arch/x86/cpu/interrupts.c
>> index e0958eb..43ec3f8 100644
>> --- a/arch/x86/cpu/interrupts.c
>> +++ b/arch/x86/cpu/interrupts.c
>> @@ -174,7 +174,7 @@ struct desc_ptr {
>>        unsigned short segment;
>>  } __packed;
>>
>> -struct idt_entry idt[256] __attribute__((aligned(16)));
>> +struct idt_entry idt[256] __aligned(16);
>>
>>  struct desc_ptr idt_ptr;
>>
>> diff --git a/arch/x86/cpu/start16.S b/arch/x86/cpu/start16.S
>> index 33e53cd..cc393ff 100644
>> --- a/arch/x86/cpu/start16.S
>> +++ b/arch/x86/cpu/start16.S
>> @@ -86,7 +86,11 @@ gdt_ptr:
>>        .word   0x20            /* limit (32 bytes = 4 GDT entries) */
>>        .long   BOOT_SEG + gdt  /* base */
>>
>> -       /* The GDT table ...
>> +/* Some CPUs are picky about GDT alignment... */
>> +.align 16
>> +gdt:
>> +       /*
>> +        * The GDT table ...
>>         *
>>         *       Selector       Type
>>         *       0x00           NULL
>> @@ -94,17 +98,46 @@ gdt_ptr:
>>         *       0x10           32bit code
>>         *       0x18           32bit data/stack
>>         */
>> +       /* The NULL Desciptor - Mandatory */
>> +       .word   0x0000          /* limit_low */
>> +       .word   0x0000          /* base_low */
>> +       .byte   0x00            /* base_middle */
>> +       .byte   0x00            /* access */
>> +       .byte   0x00            /* flags + limit_high */
>> +       .byte   0x00            /* base_high */
>>
>> -gdt:
>> -       .word   0, 0, 0, 0      /* NULL  */
>> -       .word   0, 0, 0, 0      /* unused */
>> +       /* Unused Desciptor - (matches Linux) */
>> +       .word   0x0000          /* limit_low */
>> +       .word   0x0000          /* base_low */
>> +       .byte   0x00            /* base_middle */
>> +       .byte   0x00            /* access */
>> +       .byte   0x00            /* flags + limit_high */
>> +       .byte   0x00            /* base_high */
>>
>> -       .word   0xFFFF          /* 4Gb - (0x100000*0x1000 = 4Gb) */
>> -       .word   0               /* base address = 0 */
>> -       .word   0x9B00          /* code read/exec */
>> -       .word   0x00CF          /* granularity = 4096, 386 (+5th nibble of limit) */
>> +       /*
>> +        * The Code Segment Descriptor:
>> +        * - Base   = 0x00000000
>> +        * - Size   = 4GB
>> +        * - Access = Present, Ring 0, Exec (Code), Readable
>> +        * - Flags  = 4kB Granularity, 32-bit
>> +        */
>> +       .word   0xffff          /* limit_low */
>> +       .word   0x0000          /* base_low */
>> +       .byte   0x00            /* base_middle */
>> +       .byte   0x9b            /* access */
>> +       .byte   0xcf            /* flags + limit_high */
>> +       .byte   0x00            /* base_high */
>>
>> -       .word   0xFFFF          /* 4Gb - (0x100000*0x1000 = 4Gb) */
>> -       .word   0x0             /* base address = 0 */
>> -       .word   0x9300          /* data read/write */
>> -       .word   0x00CF          /* granularity = 4096, 386 (+5th nibble of limit) */
>> +       /*
>> +        * The Data Segment Descriptor:
>> +        * - Base   = 0x00000000
>> +        * - Size   = 4GB
>> +        * - Access = Present, Ring 0, Non-Exec (Data), Writable
>> +        * - Flags  = 4kB Granularity, 32-bit
>> +        */
>> +       .word   0xffff          /* limit_low */
>> +       .word   0x0000          /* base_low */
>> +       .byte   0x00            /* base_middle */
>> +       .byte   0x93            /* access */
>> +       .byte   0xcf            /* flags + limit_high */
>> +       .byte   0x00            /* base_high */
>> --
>> 1.7.5.2.317.g391b14
>>
>> _______________________________________________
>> U-Boot mailing list
>> U-Boot at lists.denx.de
>> http://lists.denx.de/mailman/listinfo/u-boot
> 

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 14/17] x86: Move setup_pcat_compatibility() out of board.c
  2012-01-04  5:48   ` Simon Glass
@ 2012-01-04 11:38     ` Graeme Russ
  0 siblings, 0 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 11:38 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 04/01/12 16:48, Simon Glass wrote:
> Hi Graeme,
> 
> On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>
>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> 
> Perhaps mention why? Anyway:

Added commit message 'This function simply does not belong in board.c'

Regards,

Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 16/17] x86: Simplify board.c
  2012-01-04  5:51   ` Simon Glass
@ 2012-01-04 11:50     ` Graeme Russ
  0 siblings, 0 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 11:50 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 04/01/12 16:51, Simon Glass wrote:
> Hi Graeme,
> 
> On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>
>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
>> ---
>>  arch/x86/include/asm/init_helpers.h  |   39 +++++
>>  arch/x86/include/asm/init_wrappers.h |   42 +++++
>>  arch/x86/lib/Makefile                |    2 +
>>  arch/x86/lib/board.c                 |  297 +++++++++-------------------------
>>  arch/x86/lib/init_helpers.c          |  142 ++++++++++++++++
>>  arch/x86/lib/init_wrappers.c         |  137 ++++++++++++++++
> 
> What is the rationale for putting these into separate files? If you
> didn't then they would be static and presumably less code size.

The rationale is to reduce board.c to a set of init function arrays, an
init function execution loop and three initialisation phase (_f, _f_r, and
_r) functions which should be a generic methodology for all architectures

> Also for the commit message, is this really a simplification? It looks
> more like you are splitting the code into separate functions.

I'll change to title and commit message

Regards,

Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH 17/17] x86: Tweak initialisation procedure
  2012-01-04  5:52   ` Simon Glass
@ 2012-01-04 12:02     ` Graeme Russ
  0 siblings, 0 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 12:02 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 04/01/12 16:52, Simon Glass wrote:
> Hi Graeme,
> 
> On Sun, Jan 1, 2012 at 8:09 PM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>
>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
>> ---
>>  arch/x86/include/asm/init_helpers.h |    5 +
>>  arch/x86/include/asm/relocate.h     |   33 ++++++
>>  arch/x86/lib/board.c                |  188 +++++++++++++++++------------------
>>  arch/x86/lib/init_helpers.c         |   75 ++++++++++++++
>>  arch/x86/lib/relocate.c             |   32 +-----
>>  5 files changed, 206 insertions(+), 127 deletions(-)
> 
> Seems like a fairly major tweak :-) Should this commit be split,
> and/or perhaps explain the purpose in the commit message?

OK, 'tweak' was the wrong word. What this patch does is convert
init_sequence_f_r into an standard init processing loop and cleans up a few
comments along the way (I suppose they could be moved into one last
'documentation' patch)

I've renamed the patch

Regards,

Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 01/17] x86: Import glibc memcpy implementation
  2012-01-02  4:09 ` [U-Boot] [PATCH 01/17] x86: Import glibc memcpy implementation Graeme Russ
  2012-01-04  5:18   ` Simon Glass
@ 2012-01-04 19:59   ` Graeme Russ
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 02/17] x86: Speed up copy-to-RAM and clear BSS operations Graeme Russ
                       ` (16 more replies)
  1 sibling, 17 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

Taken from glibc version 2.14.90

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - None

 arch/x86/include/asm/string.h |    2 +-
 arch/x86/lib/string.c         |   61 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+), 1 deletions(-)

diff --git a/arch/x86/include/asm/string.h b/arch/x86/include/asm/string.h
index 3aa6c11..0ad612f 100644
--- a/arch/x86/include/asm/string.h
+++ b/arch/x86/include/asm/string.h
@@ -14,7 +14,7 @@ extern char * strrchr(const char * s, int c);
 #undef __HAVE_ARCH_STRCHR
 extern char * strchr(const char * s, int c);

-#undef __HAVE_ARCH_MEMCPY
+#define __HAVE_ARCH_MEMCPY
 extern void * memcpy(void *, const void *, __kernel_size_t);

 #undef __HAVE_ARCH_MEMMOVE
diff --git a/arch/x86/lib/string.c b/arch/x86/lib/string.c
index f2ea7e4..1fde81b 100644
--- a/arch/x86/lib/string.c
+++ b/arch/x86/lib/string.c
@@ -85,3 +85,64 @@ void *memset(void *dstpp, int c, size_t len)

 	return dstpp;
 }
+
+#define	OP_T_THRES	8
+#define OPSIZ	(sizeof(op_t))
+
+#define BYTE_COPY_FWD(dst_bp, src_bp, nbytes)				  \
+do {									  \
+	int __d0;							  \
+	asm volatile(							  \
+		/* Clear the direction flag, so copying goes forward.  */ \
+		"cld\n"							  \
+		/* Copy bytes.  */					  \
+		"rep\n"							  \
+		"movsb" :						  \
+		"=D" (dst_bp), "=S" (src_bp), "=c" (__d0) :		  \
+		"0" (dst_bp), "1" (src_bp), "2" (nbytes) :		  \
+		"memory");						  \
+} while (0)
+
+#define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes)		  \
+do {									  \
+	int __d0;							  \
+	asm volatile(							  \
+		/* Clear the direction flag, so copying goes forward.  */ \
+		"cld\n"							  \
+		/* Copy longwords.  */					  \
+		"rep\n"							  \
+		"movsl" :						  \
+		"=D" (dst_bp), "=S" (src_bp), "=c" (__d0) :		  \
+		"0" (dst_bp), "1" (src_bp), "2" ((nbytes) / 4) :	  \
+		"memory");						  \
+	(nbytes_left) = (nbytes) % 4;					  \
+} while (0)
+
+void *memcpy(void *dstpp, const void *srcpp, size_t len)
+{
+	unsigned long int dstp = (long int)dstpp;
+	unsigned long int srcp = (long int)srcpp;
+
+	/* Copy from the beginning to the end.  */
+
+	/* If there not too few bytes to copy, use word copy.  */
+	if (len >= OP_T_THRES) {
+		/* Copy just a few bytes to make DSTP aligned.  */
+		len -= (-dstp) % OPSIZ;
+		BYTE_COPY_FWD(dstp, srcp, (-dstp) % OPSIZ);
+
+		/* Copy from SRCP to DSTP taking advantage of the known
+		 * alignment of DSTP.  Number of bytes remaining is put
+		 * in the third argument, i.e. in LEN.  This number may
+		 * vary from machine to machine.
+		 */
+		WORD_COPY_FWD(dstp, srcp, len, len);
+
+		/* Fall out and copy the tail.  */
+	}
+
+	/* There are just a few bytes to copy. Use byte memory operations. */
+	BYTE_COPY_FWD(dstp, srcp, len);
+
+	return dstpp;
+}
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 02/17] x86: Speed up copy-to-RAM and clear BSS operations
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-04 20:04       ` Graeme Russ
  2012-01-12  4:45       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 03/17] x86: Remove GDR related magic numbers Graeme Russ
                       ` (15 subsequent siblings)
  16 siblings, 2 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

The implementations of memcpy and memset are now the optimised versions
from glibc, so use them instead of simple copy loops

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - Removed unneeded brackets

 arch/x86/lib/board.c |   17 +++++------------
 1 files changed, 5 insertions(+), 12 deletions(-)

diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index d742fec..f9eb15b 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -188,26 +188,19 @@ static int calculate_relocation_address(void)

 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;
+	size_t len = (size_t)&__data_end - (size_t)&__text_start;

-	while (src_addr < end_addr)
-		*dst_addr++ = *src_addr++;
+	memcpy((void *)gd->relocaddr, (void *)&__text_start, len);

 	return 0;
 }

 static int clear_bss(void)
 {
-	void *bss_start = &__bss_start;
-	void *bss_end = &__bss_end;
+	ulong dst_addr = (ulong)&__bss_start + gd->reloc_off;
+	size_t len = (size_t)&__bss_end - (size_t)&__bss_start;

-	ulong *dst_addr = (ulong *)(bss_start + gd->reloc_off);
-	ulong *end_addr = (ulong *)(bss_end + gd->reloc_off);
-
-	while (dst_addr < end_addr)
-		*dst_addr++ = 0x00000000;
+	memset((void *)dst_addr, 0x00, len);

 	return 0;
 }
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 03/17] x86: Remove GDR related magic numbers
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 02/17] x86: Speed up copy-to-RAM and clear BSS operations Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-07 22:05       ` Simon Glass
  2012-01-12  4:46       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 04/17] x86: Rework Global Descriptor Table loading Graeme Russ
                       ` (14 subsequent siblings)
  16 siblings, 2 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - Use an enum
 - Add defined for GDT size (previously added in patch 7)
 - Use X86_ namespace (as per Linux headers)

 arch/x86/cpu/cpu.c               |    8 ++++----
 arch/x86/cpu/start.S             |    3 ++-
 arch/x86/include/asm/processor.h |   23 +++++++++++++++++++----
 3 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index 61d0b69..209ff29 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -63,13 +63,13 @@ static void reload_gdt(void)
 	 */
 	static const u64 boot_gdt[] __attribute__((aligned(16))) = {
 		/* CS: code, read/execute, 4 GB, base 0 */
-		[GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
+		[X86_GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
 		/* DS: data, read/write, 4 GB, base 0 */
-		[GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
+		[X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
 		/* 16-bit CS: code, read/execute, 64 kB, base 0 */
-		[GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
+		[X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
 		/* 16-bit DS: data, read/write, 64 kB, base 0 */
-		[GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
+		[X86_GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
 	};
 	static struct gdt_ptr gdt;

diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
index f87633b..6027f54 100644
--- a/arch/x86/cpu/start.S
+++ b/arch/x86/cpu/start.S
@@ -29,6 +29,7 @@
 #include <config.h>
 #include <version.h>
 #include <asm/global_data.h>
+#include <asm/processor.h>
 #include <asm/processor-flags.h>
 #include <generated/asm-offsets.h>

@@ -58,7 +59,7 @@ _start:
 	/* This is the 32-bit cold-reset entry point */

 	/* Load the segement registes to match the gdt loaded in start16.S */
-	movl	$0x18, %eax
+	movl	$(X86_GDT_ENTRY_32BIT_DS * X86_GDT_ENTRY_SIZE), %eax
 	movw	%ax, %fs
 	movw	%ax, %ds
 	movw	%ax, %gs
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 1e5dccd..aa8188e 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -24,9 +24,24 @@
 #ifndef __ASM_PROCESSOR_H_
 #define __ASM_PROCESSOR_H_ 1

-#define GDT_ENTRY_32BIT_CS	2
-#define GDT_ENTRY_32BIT_DS	(GDT_ENTRY_32BIT_CS + 1)
-#define GDT_ENTRY_16BIT_CS	(GDT_ENTRY_32BIT_DS + 1)
-#define GDT_ENTRY_16BIT_DS	(GDT_ENTRY_16BIT_CS + 1)
+#define X86_GDT_ENTRY_SIZE	8
+
+#ifndef __ASSEMBLY__
+
+enum {
+	X86_GDT_ENTRY_NULL = 0,
+	X86_GDT_ENTRY_UNUSED,
+	X86_GDT_ENTRY_32BIT_CS,
+	X86_GDT_ENTRY_32BIT_DS,
+	X86_GDT_ENTRY_16BIT_CS,
+	X86_GDT_ENTRY_16BIT_DS,
+	X86_GDT_NUM_ENTRIES
+};
+#else
+/* NOTE: If the above enum is modified, this define must be checked */
+#define X86_GDT_ENTRY_32BIT_DS	3
+#endif
+
+#define X86_GDT_SIZE		(X86_GDT_NUM_ENTRIES * X86_GDT_ENTRY_SIZE)

 #endif
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 04/17] x86: Rework Global Descriptor Table loading
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 02/17] x86: Speed up copy-to-RAM and clear BSS operations Graeme Russ
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 03/17] x86: Remove GDR related magic numbers Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-12  4:47       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 05/17] x86: Simplify Flash-to-RAM code execution transition Graeme Russ
                       ` (13 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

The inline assembler is ugly and uses hard coded magic numbers. Make it more
elegant to allow cleaner implementation of future GDT related patches. The
compiler seems smart enough to generate the same code anyway

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - Rebased against revised patch #3
 - Use GDT size define instead of magic number
 - Added commit message

 arch/x86/cpu/cpu.c |   82 +++++++++++++++++++++++++++++++++------------------
 1 files changed, 53 insertions(+), 29 deletions(-)

diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index 209ff29..8102fb9 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -55,35 +55,39 @@ struct gdt_ptr {
 	u32 ptr;
 } __packed;

-static void reload_gdt(void)
+static void load_ds(u32 segment)
 {
-	/*
-	 * There are machines which are known to not boot with the GDT
-	 * being 8-byte unaligned.  Intel recommends 16 byte alignment
-	 */
-	static const u64 boot_gdt[] __attribute__((aligned(16))) = {
-		/* CS: code, read/execute, 4 GB, base 0 */
-		[X86_GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
-		/* DS: data, read/write, 4 GB, base 0 */
-		[X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
-		/* 16-bit CS: code, read/execute, 64 kB, base 0 */
-		[X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
-		/* 16-bit DS: data, read/write, 64 kB, base 0 */
-		[X86_GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
-	};
-	static struct gdt_ptr gdt;
-
-	gdt.len = sizeof(boot_gdt)-1;
-	gdt.ptr = (u32)&boot_gdt;
-
-	asm volatile("lgdtl %0\n" \
-		     "movl $((2+1)*8), %%ecx\n" \
-		     "movl %%ecx, %%ds\n" \
-		     "movl %%ecx, %%es\n" \
-		     "movl %%ecx, %%fs\n" \
-		     "movl %%ecx, %%gs\n" \
-		     "movl %%ecx, %%ss" \
-		     : : "m" (gdt) : "ecx");
+	asm volatile("movl %0, %%ds" : : "r" (segment * X86_GDT_ENTRY_SIZE));
+}
+
+static void load_es(u32 segment)
+{
+	asm volatile("movl %0, %%es" : : "r" (segment * X86_GDT_ENTRY_SIZE));
+}
+
+static void load_fs(u32 segment)
+{
+	asm volatile("movl %0, %%fs" : : "r" (segment * X86_GDT_ENTRY_SIZE));
+}
+
+static void load_gs(u32 segment)
+{
+	asm volatile("movl %0, %%gs" : : "r" (segment * X86_GDT_ENTRY_SIZE));
+}
+
+static void load_ss(u32 segment)
+{
+	asm volatile("movl %0, %%ss" : : "r" (segment * X86_GDT_ENTRY_SIZE));
+}
+
+static void load_gdt(const u64 *boot_gdt, u16 num_entries)
+{
+	struct gdt_ptr gdt;
+
+	gdt.len = (num_entries * 8) - 1;
+	gdt.ptr = (u32)boot_gdt;
+
+	asm volatile("lgdtl %0\n" : : "m" (gdt));
 }

 int x86_cpu_init_f(void)
@@ -113,7 +117,27 @@ int x86_cpu_init_r(void)
 	    "movl	%%eax, %%cr0\n"
 	    "wbinvd\n" : : "i" (nw_cd_rst) : "eax");

-	reload_gdt();
+	/*
+	 * There are machines which are known to not boot with the GDT
+	 * being 8-byte unaligned. Intel recommends 16 byte alignment
+	 */
+	static const u64 boot_gdt[] __aligned(16) = {
+		/* CS: code, read/execute, 4 GB, base 0 */
+		[X86_GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
+		/* DS: data, read/write, 4 GB, base 0 */
+		[X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
+		/* 16-bit CS: code, read/execute, 64 kB, base 0 */
+		[X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
+		/* 16-bit DS: data, read/write, 64 kB, base 0 */
+		[X86_GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
+	};
+
+	load_gdt(boot_gdt, X86_GDT_NUM_ENTRIES);
+	load_ds(X86_GDT_ENTRY_32BIT_DS);
+	load_es(X86_GDT_ENTRY_32BIT_DS);
+	load_fs(X86_GDT_ENTRY_32BIT_DS);
+	load_gs(X86_GDT_ENTRY_32BIT_DS);
+	load_ss(X86_GDT_ENTRY_32BIT_DS);

 	/* Initialize core interrupt and exception functionality of CPU */
 	cpu_init_interrupts();
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 05/17] x86: Simplify Flash-to-RAM code execution transition
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (2 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 04/17] x86: Rework Global Descriptor Table loading Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-12  4:48       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 06/17] x86: Rework relocation calculations Graeme Russ
                       ` (12 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

Move the relocation offset calculation out of assembler and into C. This
also paves the way for the upcoming init sequence simplification by adding
the board_init_f_r flash to RAM transitional function

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - Added commit message
 - Minor adjustment to new stack address comment

 arch/x86/cpu/start.S              |   22 ++++++----------------
 arch/x86/include/asm/u-boot-x86.h |    2 ++
 arch/x86/lib/board.c              |   25 ++++++++++++++++++++++---
 3 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
index 6027f54..69a9b2c 100644
--- a/arch/x86/cpu/start.S
+++ b/arch/x86/cpu/start.S
@@ -96,32 +96,22 @@ car_init_ret:
 	movw	$0x85, %ax
 	jmp	die

-.globl relocate_code
-.type relocate_code, @function
-relocate_code:
+.globl board_init_f_r_trampoline
+.type board_init_f_r_trampoline, @function
+board_init_f_r_trampoline:
 	/*
 	 * SDRAM has been initialised, U-Boot code has been copied into
 	 * RAM, BSS has been cleared and relocation adjustments have been
 	 * made. It is now time to jump into the in-RAM copy of U-Boot
 	 *
-	 * %eax = Address of top of stack
-	 * %edx = Address of Global Data
-	 * %ecx = Base address of in-RAM copy of U-Boot
+	 * %eax = Address of top of new stack
 	 */

 	/* Setup stack in RAM */
 	movl	%eax, %esp

-	/* Setup call address of in-RAM copy of board_init_r() */
-	movl	$board_init_r, %ebp
-	addl	(GENERATED_GD_RELOC_OFF)(%edx), %ebp
-
-	/* Setup parameters to board_init_r() */
-	movl	%edx, %eax
-	movl	%ecx, %edx
-
-	/* Jump to in-RAM copy of board_init_r() */
-	call	*%ebp
+	/* Re-enter U-Boot by calling board_init_f_r */
+	call	board_init_f_r

 die:
 	hlt
diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
index 755f88a..c3d2277 100644
--- a/arch/x86/include/asm/u-boot-x86.h
+++ b/arch/x86/include/asm/u-boot-x86.h
@@ -61,5 +61,7 @@ u32 isa_map_rom(u32 bus_addr, int size);
 int video_bios_init(void);
 int video_init(void);

+void	board_init_f_r_trampoline(ulong) __attribute__ ((noreturn));
+void	board_init_f_r(void) __attribute__ ((noreturn));

 #endif	/* _U_BOOT_I386_H_ */
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index f9eb15b..382ada7 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -253,10 +253,29 @@ void board_init_f(ulong boot_flags)

 	gd->flags |= GD_FLG_RELOC;

-	/* Enter the relocated U-Boot! */
-	relocate_code(gd->start_addr_sp, gd, gd->relocaddr);
+	/*
+	 * SDRAM is now initialised, U-Boot has been copied into SDRAM,
+	 * the BSS has been cleared etc. The final stack can now be setup
+	 * in SDRAM. Code execution will continue (momentarily) in Flash,
+	 * but with the stack in SDRAM and Global Data in temporary memory
+	 * (CPU cache)
+	 */
+	board_init_f_r_trampoline(gd->start_addr_sp);
+
+	/* NOTREACHED - board_init_f_r_trampoline() does not return */
+	while (1)
+		;
+}
+
+void board_init_f_r(void)
+{
+	/*
+	 * Transfer execution from Flash to RAM by calculating the address
+	 * of the in-RAM copy of board_init_r() and calling it
+	 */
+	(board_init_r + gd->reloc_off)(gd, gd->relocaddr);

-	/* NOTREACHED - relocate_code() does not return */
+	/* NOTREACHED - board_init_r() does not return */
 	while (1)
 		;
 }
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 06/17] x86: Rework relocation calculations
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (3 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 05/17] x86: Simplify Flash-to-RAM code execution transition Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-12  4:49       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 07/17] x86: Use fs for global data Graeme Russ
                       ` (11 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

This commit introduces no functional changes - It simply re-arranges the
calculations so that adding to them in future commits will be cleaner

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - Fixed typo in title
 - Added commit message

 arch/x86/lib/board.c |   23 +++++++++++------------
 1 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 382ada7..6f075b7 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -164,24 +164,23 @@ static int calculate_relocation_address(void)
 	ulong text_start = (ulong)&__text_start;
 	ulong bss_end = (ulong)&__bss_end;
 	ulong dest_addr;
-	ulong rel_offset;
-
-	/* Calculate destination RAM Address and relocation offset */
-	dest_addr = gd->ram_size;
-	dest_addr -= CONFIG_SYS_STACK_SIZE;
-	dest_addr -= (bss_end - text_start);

 	/*
-	 * Round destination address down to 16-byte boundary to keep
-	 * IDT and GDT 16-byte aligned
+	 * NOTE: All destination address are rounded down to 16-byte
+	 *       boundary to satisfy various worst-case alignment
+	 *       requirements
 	 */
-	dest_addr &= ~15;

-	rel_offset = dest_addr - text_start;
+	/* Stack is at top of available memory */
+	dest_addr = gd->ram_size;
+	gd->start_addr_sp = dest_addr;

-	gd->start_addr_sp = gd->ram_size;
+	/* U-Boot is below the stack */
+	dest_addr -= CONFIG_SYS_STACK_SIZE;
+	dest_addr -= (bss_end - text_start);
+	dest_addr &= ~15;
 	gd->relocaddr = dest_addr;
-	gd->reloc_off = rel_offset;
+	gd->reloc_off = (dest_addr - text_start);

 	return 0;
 }
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 07/17] x86: Use fs for global data
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (4 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 06/17] x86: Rework relocation calculations Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-12  4:51       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot Graeme Russ
                       ` (10 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

Use the base address of the 'F' segment as a pointer to the global data
structure. By adding the linear address (i.e. the 'D' segment address) as
the first word of the global data structure, the address of the global data
relative to the 'D' segment can be found simply, for example, by:

	fs movl 0, %eax

This makes the gd 'pointer' writable prior to relocation (by reloading the
Global Descriptor Table) which brings x86 into line with all other arches

NOTE: Writing to the gd 'pointer' is expensive (but we only do it
twice) but using it to access global data members (read and write) is
still fairly cheap

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - Rebased against changes made to patch #3
 - Removed extra indent
 - Tweaked commit message

 arch/x86/cpu/cpu.c                 |   53 ++++++++++++++++++++--------------
 arch/x86/cpu/start.S               |    8 ++++-
 arch/x86/include/asm/global_data.h |   21 +++++++++----
 arch/x86/include/asm/processor.h   |    1 +
 arch/x86/include/asm/u-boot-x86.h  |    2 +
 arch/x86/lib/board.c               |   56 +++++++++++++++++++++++++-----------
 6 files changed, 94 insertions(+), 47 deletions(-)

diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index 8102fb9..8c3b92c 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -90,6 +90,37 @@ static void load_gdt(const u64 *boot_gdt, u16 num_entries)
 	asm volatile("lgdtl %0\n" : : "m" (gdt));
 }

+void init_gd(gd_t *id, u64 *gdt_addr)
+{
+	id->gd_addr = (ulong)id;
+	setup_gdt(id, gdt_addr);
+}
+
+void setup_gdt(gd_t *id, u64 *gdt_addr)
+{
+	/* CS: code, read/execute, 4 GB, base 0 */
+	gdt_addr[X86_GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff);
+
+	/* DS: data, read/write, 4 GB, base 0 */
+	gdt_addr[X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff);
+
+	/* FS: data, read/write, 4 GB, base (Global Data Pointer) */
+	gdt_addr[X86_GDT_ENTRY_32BIT_FS] = GDT_ENTRY(0xc093, (ulong)id, 0xfffff);
+
+	/* 16-bit CS: code, read/execute, 64 kB, base 0 */
+	gdt_addr[X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff);
+
+	/* 16-bit DS: data, read/write, 64 kB, base 0 */
+	gdt_addr[X86_GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff);
+
+	load_gdt(gdt_addr, X86_GDT_NUM_ENTRIES);
+	load_ds(X86_GDT_ENTRY_32BIT_DS);
+	load_es(X86_GDT_ENTRY_32BIT_DS);
+	load_gs(X86_GDT_ENTRY_32BIT_DS);
+	load_ss(X86_GDT_ENTRY_32BIT_DS);
+	load_fs(X86_GDT_ENTRY_32BIT_FS);
+}
+
 int x86_cpu_init_f(void)
 {
 	const u32 em_rst = ~X86_CR0_EM;
@@ -117,28 +148,6 @@ int x86_cpu_init_r(void)
 	    "movl	%%eax, %%cr0\n"
 	    "wbinvd\n" : : "i" (nw_cd_rst) : "eax");

-	/*
-	 * There are machines which are known to not boot with the GDT
-	 * being 8-byte unaligned. Intel recommends 16 byte alignment
-	 */
-	static const u64 boot_gdt[] __aligned(16) = {
-		/* CS: code, read/execute, 4 GB, base 0 */
-		[X86_GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
-		/* DS: data, read/write, 4 GB, base 0 */
-		[X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
-		/* 16-bit CS: code, read/execute, 64 kB, base 0 */
-		[X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
-		/* 16-bit DS: data, read/write, 64 kB, base 0 */
-		[X86_GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
-	};
-
-	load_gdt(boot_gdt, X86_GDT_NUM_ENTRIES);
-	load_ds(X86_GDT_ENTRY_32BIT_DS);
-	load_es(X86_GDT_ENTRY_32BIT_DS);
-	load_fs(X86_GDT_ENTRY_32BIT_DS);
-	load_gs(X86_GDT_ENTRY_32BIT_DS);
-	load_ss(X86_GDT_ENTRY_32BIT_DS);
-
 	/* Initialize core interrupt and exception functionality of CPU */
 	cpu_init_interrupts();
 	return 0;
diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
index 69a9b2c..ee0dabe 100644
--- a/arch/x86/cpu/start.S
+++ b/arch/x86/cpu/start.S
@@ -31,7 +31,7 @@
 #include <asm/global_data.h>
 #include <asm/processor.h>
 #include <asm/processor-flags.h>
-#include <generated/asm-offsets.h>
+#include <generated/generic-asm-offsets.h>

 .section .text
 .code32
@@ -85,6 +85,12 @@ car_init_ret:
 	 */
 	movl	$CONFIG_SYS_INIT_SP_ADDR, %esp

+	/* Initialise the Global Data Pointer */
+	movl	$CONFIG_SYS_INIT_GD_ADDR, %eax
+	movl	%eax, %edx
+	addl	$GENERATED_GBL_DATA_SIZE, %edx
+	call	init_gd;
+
 	/* Set parameter to board_init_f() to boot flags */
 	xorl	%eax, %eax
 	movw	%bx, %ax
diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
index 05a2139..908a02c 100644
--- a/arch/x86/include/asm/global_data.h
+++ b/arch/x86/include/asm/global_data.h
@@ -36,6 +36,8 @@
 #ifndef __ASSEMBLY__

 typedef	struct global_data {
+	/* NOTE: gd_addr MUST be first member of struct global_data! */
+	unsigned long	gd_addr;	/* Location of Global Data */
 	bd_t		*bd;
 	unsigned long	flags;
 	unsigned long	baudrate;
@@ -51,13 +53,24 @@ typedef	struct global_data {
 	unsigned long	bus_clk;
 	unsigned long	relocaddr;	/* Start address of U-Boot in RAM */
 	unsigned long	start_addr_sp;	/* start_addr_stackpointer */
+	unsigned long	gdt_addr;	/* Location of GDT */
+	unsigned long	new_gd_addr;	/* New location of Global Data */
 	phys_size_t	ram_size;	/* RAM size */
 	unsigned long	reset_status;	/* reset status register at boot */
 	void		**jt;		/* jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
 } gd_t;

-extern gd_t *gd;
+static inline gd_t *get_fs_gd_ptr(void)
+{
+	gd_t *gd_ptr;
+
+	asm volatile("fs movl 0, %0\n" : "=r" (gd_ptr));
+
+	return gd_ptr;
+}
+
+#define gd	get_fs_gd_ptr()

 #endif

@@ -73,12 +86,6 @@ extern gd_t *gd;
 #define GD_FLG_DISABLE_CONSOLE	0x00040	/* Disable console (in & out)		*/
 #define GD_FLG_ENV_READY	0x00080	/* Environment imported into hash table	*/

-#if 0
 #define DECLARE_GLOBAL_DATA_PTR
-#else
-#define XTRN_DECLARE_GLOBAL_DATA_PTR    extern
-#define DECLARE_GLOBAL_DATA_PTR     XTRN_DECLARE_GLOBAL_DATA_PTR \
-gd_t *gd
-#endif

 #endif /* __ASM_GBL_DATA_H */
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index aa8188e..6eb5180 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -33,6 +33,7 @@ enum {
 	X86_GDT_ENTRY_UNUSED,
 	X86_GDT_ENTRY_32BIT_CS,
 	X86_GDT_ENTRY_32BIT_DS,
+	X86_GDT_ENTRY_32BIT_FS,
 	X86_GDT_ENTRY_16BIT_CS,
 	X86_GDT_ENTRY_16BIT_DS,
 	X86_GDT_NUM_ENTRIES
diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
index c3d2277..5540d51 100644
--- a/arch/x86/include/asm/u-boot-x86.h
+++ b/arch/x86/include/asm/u-boot-x86.h
@@ -37,6 +37,8 @@ int x86_cpu_init_r(void);
 int cpu_init_r(void);
 int x86_cpu_init_f(void);
 int cpu_init_f(void);
+void init_gd(gd_t *id, u64 *gdt_addr);
+void setup_gdt(gd_t *id, u64 *gdt_addr);

 /* cpu/.../timer.c */
 void timer_isr(void *);
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 6f075b7..b64c2d3 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -42,20 +42,12 @@
 #include <serial.h>
 #include <asm/u-boot-x86.h>
 #include <elf.h>
+#include <asm/processor.h>

 #ifdef CONFIG_BITBANGMII
 #include <miiphy.h>
 #endif

-/*
- * 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);
-
 /************************************************************************
  * Init Utilities							*
  ************************************************************************
@@ -128,6 +120,7 @@ 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);
+static int copy_gd_to_ram(void);

 init_fnc_t *init_sequence_f[] = {
 	cpu_init_f,
@@ -146,6 +139,7 @@ init_fnc_t *init_sequence_f[] = {
 };

 init_fnc_t *init_sequence_r[] = {
+	copy_gd_to_ram,
 	cpu_init_r,		/* basic cpu dependent setup */
 	board_early_init_r,	/* basic board dependent setup */
 	dram_init,		/* configure available RAM banks */
@@ -157,8 +151,6 @@ init_fnc_t *init_sequence_r[] = {
 	NULL,
 };

-gd_t *gd;
-
 static int calculate_relocation_address(void)
 {
 	ulong text_start = (ulong)&__text_start;
@@ -171,8 +163,18 @@ static int calculate_relocation_address(void)
 	 *       requirements
 	 */

-	/* Stack is at top of available memory */
+	/* Global Data is at top of available memory */
 	dest_addr = gd->ram_size;
+	dest_addr -= GENERATED_GBL_DATA_SIZE;
+	dest_addr &= ~15;
+	gd->new_gd_addr = dest_addr;
+
+	/* GDT is below Global Data */
+	dest_addr -= X86_GDT_SIZE;
+	dest_addr &= ~15;
+	gd->gdt_addr = dest_addr;
+
+	/* Stack is below GDT */
 	gd->start_addr_sp = dest_addr;

 	/* U-Boot is below the stack */
@@ -279,6 +281,31 @@ void board_init_f_r(void)
 		;
 }

+static int copy_gd_to_ram(void)
+{
+	gd_t *ram_gd;
+
+	/*
+	 * Global data is still in temporary memory (the CPU cache).
+	 * calculate_relocation_address() has set gd->new_gd_addr to
+	 * where the global data lives in RAM but getting it there
+	 * safely is a bit tricky due to the 'F-Segment Hack' that
+	 * we need to use for x86
+	 */
+	ram_gd = (gd_t *)gd->new_gd_addr;
+	memcpy((void *)ram_gd, gd, sizeof(gd_t));
+
+	/*
+	 * Reload the Global Descriptor Table so FS points to the
+	 * in-RAM copy of Global Data (calculate_relocation_address()
+	 * has already calculated the in-RAM location of the GDT)
+	 */
+	ram_gd->gd_addr = (ulong)ram_gd;
+	init_gd(ram_gd, (u64 *)gd->gdt_addr);
+
+	return 0;
+}
+
 void board_init_r(gd_t *id, ulong dest_addr)
 {
 #if defined(CONFIG_CMD_NET)
@@ -288,15 +315,10 @@ void board_init_r(gd_t *id, ulong dest_addr)
 	ulong size;
 #endif
 	static bd_t bd_data;
-	static gd_t gd_data;
 	init_fnc_t **init_fnc_ptr;

 	show_boot_progress(0x21);

-	/* 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");

--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (5 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 07/17] x86: Use fs for global data Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-12  4:51       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 09/17] x86: Create weak init_cache() and default enable_caches() functions Graeme Russ
                       ` (9 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - None

 arch/x86/lib/board.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index b64c2d3..3d82165 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -252,8 +252,6 @@ void board_init_f(ulong boot_flags)
 			hang();
 	}

-	gd->flags |= GD_FLG_RELOC;
-
 	/*
 	 * SDRAM is now initialised, U-Boot has been copied into SDRAM,
 	 * the BSS has been cleared etc. The final stack can now be setup
@@ -322,6 +320,8 @@ void board_init_r(gd_t *id, ulong dest_addr)
 	/* compiler optimization barrier needed for GCC >= 3.4 */
 	__asm__ __volatile__("" : : : "memory");

+	gd->flags |= GD_FLG_RELOC;
+
 	gd->bd = &bd_data;
 	memset(gd->bd, 0, sizeof(bd_t));
 	show_boot_progress(0x22);
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 09/17] x86: Create weak init_cache() and default enable_caches() functions
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (6 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-12  4:55       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 10/17] x86: Allow cache before copy to RAM Graeme Russ
                       ` (8 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - Tweaked commit title

 arch/x86/cpu/cpu.c                |   18 +++++++++++++++---
 arch/x86/include/asm/u-boot-x86.h |    1 +
 arch/x86/lib/board.c              |    1 +
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index 8c3b92c..e9bb0d7 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -140,6 +140,14 @@ int cpu_init_f(void) __attribute__((weak, alias("x86_cpu_init_f")));

 int x86_cpu_init_r(void)
 {
+	/* Initialize core interrupt and exception functionality of CPU */
+	cpu_init_interrupts();
+	return 0;
+}
+int cpu_init_r(void) __attribute__((weak, alias("x86_cpu_init_r")));
+
+void x86_enable_caches(void)
+{
 	const u32 nw_cd_rst = ~(X86_CR0_NW | X86_CR0_CD);

 	/* turn on the cache and disable write through */
@@ -147,12 +155,16 @@ int x86_cpu_init_r(void)
 	    "andl	%0, %%eax\n"
 	    "movl	%%eax, %%cr0\n"
 	    "wbinvd\n" : : "i" (nw_cd_rst) : "eax");
+}
+void enable_caches(void) __attribute__((weak, alias("x86_enable_caches")));
+
+int x86_init_cache(void)
+{
+	enable_caches();

-	/* Initialize core interrupt and exception functionality of CPU */
-	cpu_init_interrupts();
 	return 0;
 }
-int cpu_init_r(void) __attribute__((weak, alias("x86_cpu_init_r")));
+int init_cache(void) __attribute__((weak, alias("x86_init_cache")));

 int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
index 5540d51..878a1ee 100644
--- a/arch/x86/include/asm/u-boot-x86.h
+++ b/arch/x86/include/asm/u-boot-x86.h
@@ -39,6 +39,7 @@ int x86_cpu_init_f(void);
 int cpu_init_f(void);
 void init_gd(gd_t *id, u64 *gdt_addr);
 void setup_gdt(gd_t *id, u64 *gdt_addr);
+int init_cache(void);

 /* cpu/.../timer.c */
 void timer_isr(void *);
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 3d82165..56acf35 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -140,6 +140,7 @@ init_fnc_t *init_sequence_f[] = {

 init_fnc_t *init_sequence_r[] = {
 	copy_gd_to_ram,
+	init_cache,
 	cpu_init_r,		/* basic cpu dependent setup */
 	board_early_init_r,	/* basic board dependent setup */
 	dram_init,		/* configure available RAM banks */
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 10/17] x86: Allow cache before copy to RAM
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (7 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 09/17] x86: Create weak init_cache() and default enable_caches() functions Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-12  4:56       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 11/17] x86: Tweak IDT and GDT for alignment and readability Graeme Russ
                       ` (7 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - None

 arch/x86/lib/board.c |   15 ++++++++++-----
 1 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 56acf35..a240d26 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -131,16 +131,11 @@ init_fnc_t *init_sequence_f[] = {
 	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[] = {
-	copy_gd_to_ram,
-	init_cache,
 	cpu_init_r,		/* basic cpu dependent setup */
 	board_early_init_r,	/* basic board dependent setup */
 	dram_init,		/* configure available RAM banks */
@@ -269,6 +264,16 @@ void board_init_f(ulong boot_flags)

 void board_init_f_r(void)
 {
+	if (copy_gd_to_ram() != 0)
+		hang();
+
+	if (init_cache() != 0)
+		hang();
+
+	copy_uboot_to_ram();
+	clear_bss();
+	do_elf_reloc_fixups();
+
 	/*
 	 * Transfer execution from Flash to RAM by calculating the address
 	 * of the in-RAM copy of board_init_r() and calling it
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 11/17] x86: Tweak IDT and GDT for alignment and readability
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (8 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 10/17] x86: Allow cache before copy to RAM Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-12  5:00       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 12/17] CHECKPATCH: arch/x86/lib/* Graeme Russ
                       ` (6 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - Renamed to better reflect nature of changes

 arch/x86/cpu/interrupts.c |    2 +-
 arch/x86/cpu/start16.S    |   57 +++++++++++++++++++++++++++++++++++---------
 2 files changed, 46 insertions(+), 13 deletions(-)

diff --git a/arch/x86/cpu/interrupts.c b/arch/x86/cpu/interrupts.c
index e0958eb..43ec3f8 100644
--- a/arch/x86/cpu/interrupts.c
+++ b/arch/x86/cpu/interrupts.c
@@ -174,7 +174,7 @@ struct desc_ptr {
 	unsigned short segment;
 } __packed;

-struct idt_entry idt[256] __attribute__((aligned(16)));
+struct idt_entry idt[256] __aligned(16);

 struct desc_ptr idt_ptr;

diff --git a/arch/x86/cpu/start16.S b/arch/x86/cpu/start16.S
index 33e53cd..cc393ff 100644
--- a/arch/x86/cpu/start16.S
+++ b/arch/x86/cpu/start16.S
@@ -86,7 +86,11 @@ gdt_ptr:
 	.word	0x20		/* limit (32 bytes = 4 GDT entries) */
 	.long	BOOT_SEG + gdt	/* base */

-	/* The GDT table ...
+/* Some CPUs are picky about GDT alignment... */
+.align 16
+gdt:
+	/*
+	 * The GDT table ...
 	 *
 	 *	 Selector	Type
 	 *	 0x00		NULL
@@ -94,17 +98,46 @@ gdt_ptr:
 	 *	 0x10		32bit code
 	 *	 0x18		32bit data/stack
 	 */
+	/* The NULL Desciptor - Mandatory */
+	.word	0x0000		/* limit_low */
+	.word	0x0000		/* base_low */
+	.byte	0x00		/* base_middle */
+	.byte	0x00		/* access */
+	.byte	0x00		/* flags + limit_high */
+	.byte	0x00		/* base_high */

-gdt:
-	.word	0, 0, 0, 0	/* NULL  */
-	.word	0, 0, 0, 0	/* unused */
+	/* Unused Desciptor - (matches Linux) */
+	.word	0x0000		/* limit_low */
+	.word	0x0000		/* base_low */
+	.byte	0x00		/* base_middle */
+	.byte	0x00		/* access */
+	.byte	0x00		/* flags + limit_high */
+	.byte	0x00		/* base_high */

-	.word	0xFFFF		/* 4Gb - (0x100000*0x1000 = 4Gb) */
-	.word	0		/* base address = 0 */
-	.word	0x9B00		/* code read/exec */
-	.word	0x00CF		/* granularity = 4096, 386 (+5th nibble of limit) */
+	/*
+	 * The Code Segment Descriptor:
+	 * - Base   = 0x00000000
+	 * - Size   = 4GB
+	 * - Access = Present, Ring 0, Exec (Code), Readable
+	 * - Flags  = 4kB Granularity, 32-bit
+	 */
+	.word	0xffff		/* limit_low */
+	.word	0x0000		/* base_low */
+	.byte	0x00		/* base_middle */
+	.byte	0x9b		/* access */
+	.byte	0xcf		/* flags + limit_high */
+	.byte	0x00		/* base_high */

-	.word	0xFFFF		/* 4Gb - (0x100000*0x1000 = 4Gb) */
-	.word	0x0		/* base address = 0 */
-	.word	0x9300		/* data read/write */
-	.word	0x00CF		/* granularity = 4096, 386 (+5th nibble of limit) */
+	/*
+	 * The Data Segment Descriptor:
+	 * - Base   = 0x00000000
+	 * - Size   = 4GB
+	 * - Access = Present, Ring 0, Non-Exec (Data), Writable
+	 * - Flags  = 4kB Granularity, 32-bit
+	 */
+	.word	0xffff		/* limit_low */
+	.word	0x0000		/* base_low */
+	.byte	0x00		/* base_middle */
+	.byte	0x93		/* access */
+	.byte	0xcf		/* flags + limit_high */
+	.byte	0x00		/* base_high */
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 12/17] CHECKPATCH: arch/x86/lib/*
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (9 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 11/17] x86: Tweak IDT and GDT for alignment and readability Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-12  5:01       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 13/17] x86: Move do_go_exec() out of board.c Graeme Russ
                       ` (5 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - None

 arch/x86/lib/bios.S            |  134 +++++++++++++++++++++++++--------------
 arch/x86/lib/realmode_switch.S |   61 +++++++++++--------
 2 files changed, 122 insertions(+), 73 deletions(-)

diff --git a/arch/x86/lib/bios.S b/arch/x86/lib/bios.S
index ce8deb5..239aaa9 100644
--- a/arch/x86/lib/bios.S
+++ b/arch/x86/lib/bios.S
@@ -246,11 +246,9 @@ rm_int1f:
 rm_def_int:
 	iret

-
 	/*
-	 * All interrupt jumptable entries jump to here
-	 * after pushing the interrupt vector number onto the
-	 * stack.
+	 * All interrupt jumptable entries jump to here after pushing the
+	 * interrupt vector number onto the stack.
 	 */
 any_interrupt16:
 	MAKE_BIOS_STACK
@@ -272,7 +270,8 @@ gs	movw	OFFS_VECTOR(%bp), %ax
 	je	Lint_1ah
 	movw	$0xffff, %ax
 	jmp	Lout
-Lint_10h:					/* VGA BIOS services */
+Lint_10h:
+	/* VGA BIOS services */
 	call	bios_10h
 	jmp	Lout
 Lint_11h:
@@ -281,35 +280,42 @@ Lint_11h:
 Lint_12h:
 	call	bios_12h
 	jmp	Lout
-Lint_13h:					/* BIOS disk services */
+Lint_13h:
+	/* BIOS disk services */
 	call	bios_13h
 	jmp	Lout
-Lint_15h:					/* Misc. BIOS services */
+Lint_15h:
+	/* Misc. BIOS services */
 	call	bios_15h
 	jmp	Lout
-Lint_16h:					/* keyboard services */
+Lint_16h:
+	/* keyboard services */
 	call	bios_16h
 	jmp	Lout
-Lint_1ah:					/* PCI bios */
+Lint_1ah:
+	/* PCI bios */
 	call	bios_1ah
 	jmp	Lout
 Lout:
 	cmpw	$0, %ax
 	je	Lhandeled

-	/* Insert code for unhandeled INTs here.
+	/*
+	 * Insert code for unhandeled INTs here.
 	 *
-	 * ROLO prints a message to the console
-	 * (we could do that but then we're in 16bit mode
-	 * so we'll have to get back into 32bit mode
-	 * to use the console I/O routines (if we do this
-	 * we shuls make int 0x10 and int 0x16 work as well))
+	 * ROLO prints a message to the console we could do that but then
+	 * we're in 16bit mode so we'll have to get back into 32bit mode
+	 * to use the console I/O routines (if we do this we should make
+	 * int 0x10 and int 0x16 work as well)
 	 */
 Lhandeled:
 	RESTORE_CALLERS_STACK
-	addw	$2,%sp				/* dump vector number */
-	iret					/* return from interrupt */

+	/* dump vector number */
+	addw	$2,%sp
+
+	/* return from interrupt */
+	iret

 /*
  ************************************************************
@@ -327,22 +333,24 @@ gs	movw	OFFS_AX(%bp), %ax
 	je	Lvid_cfg
 	movw	$0xffff, %ax
 	ret
-Lcur_pos:					/* Read Cursor Position and Size */
+Lcur_pos:
+	/* Read Cursor Position and Size */
 gs	movw	$0, OFFS_CX(%bp)
 gs	movw	$0, OFFS_DX(%bp)
 	xorw	%ax, %ax
 	ret
-Lvid_state:					/* Get Video State */
-gs	movw	$(80 << 8|0x03), OFFS_AX(%bp)	/* 80 columns, 80x25, 16 colors */
+Lvid_state:
+	/* Get Video State - 80 columns, 80x25, 16 colors */
+gs	movw	$(80 << 8|0x03), OFFS_AX(%bp)
 gs	movw	$0, OFFS_BX(%bp)
 	xorw	%ax, %ax
 	ret
-Lvid_cfg:	/* Video Subsystem Configuration (EGA/VGA) */
-gs	movw	$0x10, OFFS_BX(%bp)		/* indicate CGA/MDA/HGA */
+Lvid_cfg:
+	/* Video Subsystem Configuration (EGA/VGA) - indicate CGA/MDA/HGA */
+gs	movw	$0x10, OFFS_BX(%bp)
 	xorw	%ax, %ax
 	ret

-
 /*
  ************************************************************
  * BIOS interrupt 11h -- Equipment determination
@@ -355,7 +363,6 @@ gs	movw	%ax, OFFS_AX(%bp)
 	xorw	%ax, %ax
 	ret

-
 /*
  ************************************************************
  * BIOS	interrupt 12h -- Get Memory Size
@@ -370,16 +377,18 @@ cs	movw	ram_in_64kb_chunks, %ax
 b12_more_than_640k:
 	movw	$0x280, %ax
 b12_return:
-gs	movw	%ax, OFFS_AX(%bp)		/* return number of kilobytes in ax */
+	/* return number of kilobytes in ax */
+gs	movw	%ax, OFFS_AX(%bp)

 gs	movw	OFFS_FLAGS(%bp), %ax
-	andw	$0xfffe, %ax			/* clear carry -- function succeeded */
+
+	/* clear carry -- function succeeded */
+	andw	$0xfffe, %ax
 gs	movw	%ax, OFFS_FLAGS(%bp)

 	xorw	%ax, %ax
 	ret

-
 /*
  ************************************************************
  * BIOS interrupt 13h -- Disk services
@@ -394,12 +403,13 @@ gs	movw	OFFS_AX(%bp), %ax
 	ret
 Lfunc_15h:
 gs	movw	OFFS_AX(%bp), %ax
-	andw	$0xff, %ax			/* return AH=0->drive not present */
+
+	/* return AH=0->drive not present */
+	andw	$0x00ff, %ax
 gs	movw	%ax, OFFS_AX(%bp)
 	xorw	%ax, %ax
 	ret

-
 /*
  ***********************************************************
  * BIOS interrupt 15h -- Miscellaneous services
@@ -417,9 +427,12 @@ gs	movw	OFFS_AX(%bp), %ax
 	movw	$0xffff, %ax
 	ret

-Lfunc_c0h:					/* Return System Configuration Parameters (PS2 only) */
+Lfunc_c0h:
+	/* Return System Configuration Parameters (PS2 only) */
 gs	movw	OFFS_FLAGS(%bp), %ax
-	orw	$1, %ax				/* return carry -- function not supported */
+
+	/* return carry -- function not supported */
+	orw	$1, %ax
 gs	movw	%ax, OFFS_FLAGS(%bp)
 	xorw	%ax, %ax
 	ret
@@ -430,38 +443,56 @@ gs	movw	OFFS_AX(%bp), %ax
 	cmpw	$1, %ax
 	je	Lfunc_e801h
 gs	movw	OFFS_FLAGS(%bp), %ax
-	orw	$1, %ax				/* return carry -- function not supported */
+
+	/* return carry -- function not supported */
+	orw	$1, %ax
 gs	movw	%ax, OFFS_FLAGS(%bp)
 	xorw	%ax, %ax
 	ret

-Lfunc_e801h:					/* Get memory size for >64M Configurations */
+Lfunc_e801h:
+	/* Get memory size for >64M Configurations */
 cs	movw	ram_in_64kb_chunks, %ax
 	cmpw	$0x100, %ax
 	ja	e801_more_than_16mb
-	shlw	$6, %ax				/* multiply by 64 */
-	subw	$0x400, %ax			/* 1st meg does not count */

-gs	movw	%ax, OFFS_AX(%bp)		/* return memory size between 1M and 16M in 1kb chunks in AX and CX */
+	/* multiply by 64 */
+	shlw	$6, %ax
+
+	/* 1st meg does not count */
+	subw	$0x400, %ax
+
+	/* return memory size between 1M and 16M in 1kb chunks in AX and CX */
+gs	movw	%ax, OFFS_AX(%bp)
 gs	movw	%ax, OFFS_CX(%bp)
-gs	movw	$0, OFFS_BX(%bp)		/* set BX and DX to 0*/
+
+	/* set BX and DX to 0*/
+gs	movw	$0, OFFS_BX(%bp)
 gs	movw	$0, OFFS_DX(%bp)
 gs	movw	OFFS_FLAGS(%bp), %ax
-	andw	$0xfffe, %ax			/* clear carry -- function succeeded */
+
+	/* clear carry -- function succeeded */
+	andw	$0xfffe, %ax
 gs	movw	%ax, OFFS_FLAGS(%bp)
 	xorw	%ax, %ax
 	ret

 e801_more_than_16mb:
-	subw	$0x100, %ax			/* subtract 16MB */
+	/* subtract 16MB */
+	subw	$0x100, %ax

-gs	movw	$0x3c00, OFFS_AX(%bp)		/* return 0x3c00 (16MB-1MB) in AX and CX */
+	/* return 0x3c00 (16MB-1MB) in AX and CX */
+gs	movw	$0x3c00, OFFS_AX(%bp)
 gs	movw	$0x3c00, OFFS_CX(%bp)
-gs	movw	%ax, OFFS_BX(%bp)		/* set BX and DX to number of 64kb chunks above 16MB */
+
+	/* set BX and DX to number of 64kb chunks above 16MB */
+gs	movw	%ax, OFFS_BX(%bp)
 gs	movw	%ax, OFFS_DX(%bp)

 gs	movw	OFFS_FLAGS(%bp), %ax
-	andw	$0xfffe, %ax			/* clear carry -- function succeeded */
+
+	/* clear carry -- function succeeded */
+	andw	$0xfffe, %ax
 gs	movw	%ax, OFFS_FLAGS(%bp)
 	xorw	%ax, %ax
 	ret
@@ -473,18 +504,22 @@ cs	movw	ram_in_64kb_chunks, %ax
 	movw	$0x100, %ax
 b88_not_more_than16:
 	shlw	$6, %ax
-	subw	$0x400, %ax			/* 1st meg does not count */

-gs	movw	%ax, OFFS_AX(%bp)		/* return number of kilobytes between 16MB and 16MB in ax */
+	/* 1st meg does not count */
+	subw	$0x400, %ax
+
+	/* return number of kilobytes between 16MB and 16MB in ax */
+gs	movw	%ax, OFFS_AX(%bp)

 gs	movw	OFFS_FLAGS(%bp), %ax
-	andw	$0xfffe, %ax			/* clear carry -- function succeeded */
+
+	/* clear carry -- function succeeded */
+	andw	$0xfffe, %ax
 gs	movw	%ax, OFFS_FLAGS(%bp)

 	xorw	%ax, %ax
 	ret

-
 /*
  ************************************************************
  * BIOS interrupt 16h -- keyboard services
@@ -498,7 +533,8 @@ gs	movw	OFFS_AX(%bp), %ax
 	movw	$0xffff, %ax
 	ret
 Lfunc_03h:
-	xorw	%ax, %ax			/* do nothing -- function not supported */
+	/* do nothing -- function not supported */
+	xorw	%ax, %ax
 	ret

 /*
@@ -514,7 +550,9 @@ gs	movw	OFFS_AX(%bp), %ax
 	ret
 Lfunc_b1h:
 	call	realmode_pci_bios
-	xorw	%ax, %ax			/* do nothing -- function not supported */
+
+	/* do nothing -- function not supported */
+	xorw	%ax, %ax
 	ret


diff --git a/arch/x86/lib/realmode_switch.S b/arch/x86/lib/realmode_switch.S
index 7ee709a..c4c4c43 100644
--- a/arch/x86/lib/realmode_switch.S
+++ b/arch/x86/lib/realmode_switch.S
@@ -44,12 +44,13 @@
  *	e40 ss;
  */

-#define a32		.byte 0x67;		/* address size prefix 32 */
-#define o32		.byte 0x66;		/* operand size prefix 32 */
+#define a32		.byte 0x67;	/* address size prefix 32 */
+#define o32		.byte 0x66;	/* operand size prefix 32 */

 .section .realmode, "ax"
 .code16
-						/* 16bit protected mode code here */
+
+	/* 16bit protected mode code here */
 .globl realmode_enter
 realmode_enter:
 o32	pusha
@@ -69,20 +70,23 @@ o32	pushf
 	movw	%ax, %gs

 	lidt	realmode_idt_ptr
-	movl	%cr0, %eax			/* Go back into real mode by */
-	andl	$0x7ffffffe, %eax		/* clearing PE to 0 */
+	/* Go back into real mode by clearing PE to 0 */
+	movl	%cr0, %eax
+	andl	$0x7ffffffe, %eax
 	movl	%eax, %cr0
-	ljmp	$0x0,$do_realmode		/* switch to real mode */

-do_realmode:					/* realmode code from here */
+	/* switch to real mode */
+	ljmp	$0x0,$do_realmode
+
+do_realmode:
+	/* realmode code from here */
 	movw	%cs,%ax
 	movw	%ax,%ds
 	movw	%ax,%es
 	movw	%ax,%fs
 	movw	%ax,%gs

-						/* create a temporary stack */
-
+	/* create a temporary stack */
 	movw	$0xc0, %ax
 	movw	%ax, %ss
 	movw	$0x200, %ax
@@ -114,26 +118,29 @@ o32	popf
 	popw	%ss
 	movl	%eax, %esp
 cs	movl	temp_eax, %eax
-	wbinvd					/* self-modifying code,
-						 * better flush the cache */
+
+	/* self-modifying code, better flush the cache */
+	wbinvd

 	.byte	0x9a				/* lcall */
 temp_ip:
 	.word	0				/* new ip */
 temp_cs:
 	.word	0				/* new cs */
+
 realmode_ret:
-						/* save eax, esp and ss */
+	/* save eax, esp and ss */
 cs	movl	%eax, saved_eax
 	movl	%esp, %eax
 cs	movl	%eax, saved_esp
 	movw	%ss, %ax
 cs	movw	%ax, saved_ss

-	/* restore the stack, note that we set sp to 0x244;
+	/*
+	 * restore the stack, note that we set sp to 0x244;
 	 * pt_regs is 0x44 bytes long and we push the structure
-	 * backwards on to the stack, bottom first */
-
+	 * backwards on to the stack, bottom first
+	 */
 	movw	$0xc0, %ax
 	movw	%ax, %ss
 	movw	$0x244, %ax
@@ -169,12 +176,15 @@ cs	movw	temp_ip, %ax
 	pushl	%ebx

 o32 cs	lidt	saved_idt
-o32 cs	lgdt	saved_gdt			/* Set GDTR */
+o32 cs	lgdt	saved_gdt

-	movl	%cr0, %eax			/* Go back into protected mode */
-	orl	$1,%eax	/* reset PE to 1 */
+	/* Go back into protected mode reset PE to 1 */
+	movl	%cr0, %eax
+	orl	$1,%eax
 	movl	%eax, %cr0
-	jmp	next_line			/* flush prefetch queue */
+
+	/* flush prefetch queue */
+	jmp	next_line
 next_line:
 	movw	$return_ptr, %ax
 	movw	%ax,%bp
@@ -182,12 +192,13 @@ o32 cs	ljmp	*(%bp)

 .code32
 protected_mode:
-	movl	$0x18,%eax			/* reload GDT[3] */
-	movw	%ax,%fs				/* reset FS */
-	movw	%ax,%ds				/* reset DS */
-	movw	%ax,%gs				/* reset GS */
-	movw	%ax,%es				/* reset ES */
-	movw	%ax,%ss				/* reset SS */
+	/* Reload segment registers */
+	movl	$0x18, %eax
+	movw	%ax, %fs
+	movw	%ax, %ds
+	movw	%ax, %gs
+	movw	%ax, %es
+	movw	%ax, %ss
 	movl	saved_protected_mode_esp, %eax
 	movl	%eax, %esp
 	popf
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 13/17] x86: Move do_go_exec() out of board.c
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (10 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 12/17] CHECKPATCH: arch/x86/lib/* Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-12  5:01       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 14/17] x86: Move setup_pcat_compatibility() " Graeme Russ
                       ` (4 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - None

 arch/x86/lib/Makefile   |    1 +
 arch/x86/lib/board.c    |   27 -------------------
 arch/x86/lib/cmd_boot.c |   64 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 65 insertions(+), 27 deletions(-)
 create mode 100644 arch/x86/lib/cmd_boot.c

diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index d584aa4..7820895 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -32,6 +32,7 @@ SOBJS-$(CONFIG_SYS_X86_REALMODE)	+= realmode_switch.o
 COBJS-$(CONFIG_SYS_PC_BIOS)	+= bios_setup.o
 COBJS-y	+= board.o
 COBJS-y	+= bootm.o
+COBJS-y	+= cmd_boot.o
 COBJS-y	+= gcc.o
 COBJS-y	+= interrupts.o
 COBJS-$(CONFIG_SYS_PCAT_INTERRUPTS) += pcat_interrupts.o
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index a240d26..aaffd1b 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -487,33 +487,6 @@ void hang(void)
 		;
 }

-unsigned long do_go_exec(ulong (*entry)(int, char * const []),
-			 int argc, char * const argv[])
-{
-	unsigned long ret = 0;
-	char **argv_tmp;
-
-	/*
-	 * x86 does not use a dedicated register to pass the pointer to
-	 * the global_data, so it is instead passed as argv[-1]. By using
-	 * argv[-1], the called 'Application' can use the contents of
-	 * argv natively. However, to safely use argv[-1] a new copy of
-	 * argv is needed with the extra element
-	 */
-	argv_tmp = malloc(sizeof(char *) * (argc + 1));
-
-	if (argv_tmp) {
-		argv_tmp[0] = (char *)gd;
-
-		memcpy(&argv_tmp[1], argv, (size_t)(sizeof(char *) * argc));
-
-		ret = (entry) (argc, &argv_tmp[1]);
-		free(argv_tmp);
-	}
-
-	return ret;
-}
-
 void setup_pcat_compatibility(void)
 	__attribute__((weak, alias("__setup_pcat_compatibility")));

diff --git a/arch/x86/lib/cmd_boot.c b/arch/x86/lib/cmd_boot.c
new file mode 100644
index 0000000..a81a9a3
--- /dev/null
+++ b/arch/x86/lib/cmd_boot.c
@@ -0,0 +1,64 @@
+/*
+ * (C) Copyright 2008-2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * (C) Copyright 2002
+ * Daniel Engstr?m, Omicron Ceti AB, <daniel@omicron.se>
+ *
+ * (C) Copyright 2002
+ * Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <command.h>
+#include <malloc.h>
+#include <asm/u-boot-x86.h>
+
+unsigned long do_go_exec(ulong (*entry)(int, char * const []),
+			 int argc, char * const argv[])
+{
+	unsigned long ret = 0;
+	char **argv_tmp;
+
+	/*
+	 * x86 does not use a dedicated register to pass the pointer to
+	 * the global_data, so it is instead passed as argv[-1]. By using
+	 * argv[-1], the called 'Application' can use the contents of
+	 * argv natively. However, to safely use argv[-1] a new copy of
+	 * argv is needed with the extra element
+	 */
+	argv_tmp = malloc(sizeof(char *) * (argc + 1));
+
+	if (argv_tmp) {
+		argv_tmp[0] = (char *)gd;
+
+		memcpy(&argv_tmp[1], argv, (size_t)(sizeof(char *) * argc));
+
+		ret = (entry) (argc, &argv_tmp[1]);
+		free(argv_tmp);
+	}
+
+	return ret;
+}
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 14/17] x86: Move setup_pcat_compatibility() out of board.c
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (11 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 13/17] x86: Move do_go_exec() out of board.c Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-12  5:02       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 15/17] x86: Move relocation code " Graeme Russ
                       ` (3 subsequent siblings)
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

This function simply does not belong in board.c

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - Added commit message

 arch/x86/lib/board.c  |    7 -------
 arch/x86/lib/zimage.c |    7 +++++++
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index aaffd1b..416aa9e 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -486,10 +486,3 @@ void hang(void)
 	for (;;)
 		;
 }
-
-void setup_pcat_compatibility(void)
-	__attribute__((weak, alias("__setup_pcat_compatibility")));
-
-void __setup_pcat_compatibility(void)
-{
-}
diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
index bb40517..2214286 100644
--- a/arch/x86/lib/zimage.c
+++ b/arch/x86/lib/zimage.c
@@ -314,6 +314,13 @@ void boot_zimage(void *setup_base, void *load_address)
 #endif
 }

+void setup_pcat_compatibility(void)
+	__attribute__((weak, alias("__setup_pcat_compatibility")));
+
+void __setup_pcat_compatibility(void)
+{
+}
+
 int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 {
 	struct boot_params *base_ptr;
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 15/17] x86: Move relocation code out of board.c
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (12 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 14/17] x86: Move setup_pcat_compatibility() " Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-07 22:15       ` Simon Glass
  2012-01-12  5:03       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 16/17] x86: Split init functions " Graeme Russ
                       ` (2 subsequent siblings)
  16 siblings, 2 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - None

 arch/x86/lib/Makefile   |    1 +
 arch/x86/lib/board.c    |   69 +---------------------------
 arch/x86/lib/relocate.c |  115 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 118 insertions(+), 67 deletions(-)
 create mode 100644 arch/x86/lib/relocate.c

diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index 7820895..57b6896 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -40,6 +40,7 @@ COBJS-$(CONFIG_SYS_GENERIC_TIMER) += pcat_timer.o
 COBJS-$(CONFIG_PCI) += pci.o
 COBJS-$(CONFIG_PCI) += pci_type1.o
 COBJS-$(CONFIG_SYS_X86_REALMODE)	+= realmode.o
+COBJS-y	+= relocate.o
 COBJS-y	+= string.o
 COBJS-$(CONFIG_SYS_X86_ISR_TIMER)	+= timer.o
 COBJS-$(CONFIG_VIDEO)	+= video_bios.o
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 416aa9e..bebb347 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -41,7 +41,6 @@
 #include <ide.h>
 #include <serial.h>
 #include <asm/u-boot-x86.h>
-#include <elf.h>
 #include <asm/processor.h>

 #ifdef CONFIG_BITBANGMII
@@ -117,9 +116,6 @@ static void display_flash_config(ulong size)
 typedef int (init_fnc_t) (void);

 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);
 static int copy_gd_to_ram(void);

 init_fnc_t *init_sequence_f[] = {
@@ -183,59 +179,6 @@ static int calculate_relocation_address(void)
 	return 0;
 }

-static int copy_uboot_to_ram(void)
-{
-	size_t len = (size_t)&__data_end - (size_t)&__text_start;
-
-	memcpy((void *)gd->relocaddr, (void *)&__text_start, len);
-
-	return 0;
-}
-
-static int clear_bss(void)
-{
-	ulong dst_addr = (ulong)&__bss_start + gd->reloc_off;
-	size_t len = (size_t)&__bss_end - (size_t)&__bss_start;
-
-	memset((void *)dst_addr, 0x00, len);
-
-	return 0;
-}
-
-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);
-
-	Elf32_Addr *offset_ptr_rom;
-	Elf32_Addr *offset_ptr_ram;
-
-	/* The size of the region of u-boot that runs out of RAM. */
-	uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
-
-	do {
-		/* Get the location from the relocation entry */
-		offset_ptr_rom = (Elf32_Addr *)re_src->r_offset;
-
-		/* Check that the location of the relocation is in .text */
-		if (offset_ptr_rom >= (Elf32_Addr *)CONFIG_SYS_TEXT_BASE) {
-
-			/* Switch to the in-RAM version */
-			offset_ptr_ram = (Elf32_Addr *)((ulong)offset_ptr_rom +
-							gd->reloc_off);
-
-			/* Check that the target points into .text */
-			if (*offset_ptr_ram >= CONFIG_SYS_TEXT_BASE &&
-					*offset_ptr_ram <
-					(CONFIG_SYS_TEXT_BASE + size)) {
-				*offset_ptr_ram += 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)
 {
@@ -270,17 +213,9 @@ void board_init_f_r(void)
 	if (init_cache() != 0)
 		hang();

-	copy_uboot_to_ram();
-	clear_bss();
-	do_elf_reloc_fixups();
-
-	/*
-	 * Transfer execution from Flash to RAM by calculating the address
-	 * of the in-RAM copy of board_init_r() and calling it
-	 */
-	(board_init_r + gd->reloc_off)(gd, gd->relocaddr);
+	relocate_code(0, gd, 0);

-	/* NOTREACHED - board_init_r() does not return */
+	/* NOTREACHED - relocate_code() does not return */
 	while (1)
 		;
 }
diff --git a/arch/x86/lib/relocate.c b/arch/x86/lib/relocate.c
new file mode 100644
index 0000000..badb5f8
--- /dev/null
+++ b/arch/x86/lib/relocate.c
@@ -0,0 +1,115 @@
+/*
+ * (C) Copyright 2008-2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * (C) Copyright 2002
+ * Daniel Engstr?m, Omicron Ceti AB, <daniel@omicron.se>
+ *
+ * (C) Copyright 2002
+ * Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <malloc.h>
+#include <asm/u-boot-x86.h>
+#include <elf.h>
+
+static int copy_uboot_to_ram(void);
+static int clear_bss(void);
+static int do_elf_reloc_fixups(void);
+
+static int copy_uboot_to_ram(void)
+{
+	size_t len = (size_t)&__data_end - (size_t)&__text_start;
+
+	memcpy((void *)gd->relocaddr, (void *)&__text_start, len);
+
+	return 0;
+}
+
+static int clear_bss(void)
+{
+	ulong dst_addr = (ulong)&__bss_start + gd->reloc_off;
+	size_t len = (size_t)&__bss_end - (size_t)&__bss_start;
+
+	memset((void *)dst_addr, 0x00, len);
+
+	return 0;
+}
+
+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);
+
+	Elf32_Addr *offset_ptr_rom;
+	Elf32_Addr *offset_ptr_ram;
+
+	/* The size of the region of u-boot that runs out of RAM. */
+	uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
+
+	do {
+		/* Get the location from the relocation entry */
+		offset_ptr_rom = (Elf32_Addr *)re_src->r_offset;
+
+		/* Check that the location of the relocation is in .text */
+		if (offset_ptr_rom >= (Elf32_Addr *)CONFIG_SYS_TEXT_BASE) {
+
+			/* Switch to the in-RAM version */
+			offset_ptr_ram = (Elf32_Addr *)((ulong)offset_ptr_rom +
+							gd->reloc_off);
+
+			/* Check that the target points into .text */
+			if (*offset_ptr_ram >= CONFIG_SYS_TEXT_BASE &&
+					*offset_ptr_ram <
+					(CONFIG_SYS_TEXT_BASE + size)) {
+				*offset_ptr_ram += gd->reloc_off;
+			}
+		}
+	} while (re_src++ < re_end);
+
+	return 0;
+}
+
+void relocate_code(ulong dummy_1, gd_t *id, ulong dummy_2)
+{
+	/*
+	 * Copy U-Boot into RAM, clear the BSS and perform relocation
+	 * adjustments
+	 */
+	copy_uboot_to_ram();
+	clear_bss();
+	do_elf_reloc_fixups();
+
+	/*
+	 * Transfer execution from Flash to RAM by calculating the address
+	 * of the in-RAM copy of board_init_r() and calling it
+	 */
+	(board_init_r + gd->reloc_off)(gd, gd->relocaddr);
+
+	/* NOTREACHED - board_init_r() does not return */
+	while (1)
+		;
+}
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 16/17] x86: Split init functions out of board.c
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (13 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 15/17] x86: Move relocation code " Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-12  5:03       ` Simon Glass
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 17/17] x86: Convert board_init_f_r to a processing loop Graeme Russ
  2012-01-12  4:44     ` [U-Boot] [PATCH v2 01/17] x86: Import glibc memcpy implementation Simon Glass
  16 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

This patch moves towards reducing board.c to simply a set of init cores for
the three initialisation phases (Flash, Flash/RAM, and RAM), a set of three
init function arrays and a init function array processing function

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - Changes patch title
 - Tweak commit message

 arch/x86/include/asm/init_helpers.h  |   39 +++++
 arch/x86/include/asm/init_wrappers.h |   42 +++++
 arch/x86/lib/Makefile                |    2 +
 arch/x86/lib/board.c                 |  297 +++++++++-------------------------
 arch/x86/lib/init_helpers.c          |  142 ++++++++++++++++
 arch/x86/lib/init_wrappers.c         |  137 ++++++++++++++++
 6 files changed, 438 insertions(+), 221 deletions(-)
 create mode 100644 arch/x86/include/asm/init_helpers.h
 create mode 100644 arch/x86/include/asm/init_wrappers.h
 create mode 100644 arch/x86/lib/init_helpers.c
 create mode 100644 arch/x86/lib/init_wrappers.c

diff --git a/arch/x86/include/asm/init_helpers.h b/arch/x86/include/asm/init_helpers.h
new file mode 100644
index 0000000..14ef11a
--- /dev/null
+++ b/arch/x86/include/asm/init_helpers.h
@@ -0,0 +1,39 @@
+/*
+ * (C) Copyright 2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef _INIT_HELPERS_H_
+#define _INIT_HELPERS_H_
+
+int display_banner(void);
+int display_dram_config(void);
+int init_baudrate_f(void);
+
+int mem_malloc_init_r(void);
+int init_bd_struct_r(void);
+int flash_init_r(void);
+int init_ip_address_r(void);
+int status_led_set_r(void);
+int set_bootfile_r(void);
+int set_load_addr_r(void);
+
+#endif	/* !_INIT_HELPERS_H_ */
diff --git a/arch/x86/include/asm/init_wrappers.h b/arch/x86/include/asm/init_wrappers.h
new file mode 100644
index 0000000..899ffb1
--- /dev/null
+++ b/arch/x86/include/asm/init_wrappers.h
@@ -0,0 +1,42 @@
+/*
+ * (C) Copyright 2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef _INIT_WRAPPERS_H_
+#define _INIT_WRAPPERS_H_
+
+int serial_initialize_r(void);
+int env_relocate_r(void);
+int pci_init_r(void);
+int jumptable_init_r(void);
+int pcmcia_init_r(void);
+int kgdb_init_r(void);
+int enable_interrupts_r(void);
+int eth_initialize_r(void);
+int reset_phy_r(void);
+int ide_init_r(void);
+int scsi_init_r(void);
+int doc_init_r(void);
+int bb_miiphy_init_r(void);
+int post_run_r(void);
+
+#endif	/* !_INIT_WRAPPERS_H_ */
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index 57b6896..51836da 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -34,6 +34,8 @@ COBJS-y	+= board.o
 COBJS-y	+= bootm.o
 COBJS-y	+= cmd_boot.o
 COBJS-y	+= gcc.o
+COBJS-y	+= init_helpers.o
+COBJS-y	+= init_wrappers.o
 COBJS-y	+= interrupts.o
 COBJS-$(CONFIG_SYS_PCAT_INTERRUPTS) += pcat_interrupts.o
 COBJS-$(CONFIG_SYS_GENERIC_TIMER) += pcat_timer.o
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index bebb347..89721c7 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -33,62 +33,12 @@

 #include <common.h>
 #include <watchdog.h>
-#include <command.h>
 #include <stdio_dev.h>
-#include <version.h>
-#include <malloc.h>
-#include <net.h>
-#include <ide.h>
-#include <serial.h>
 #include <asm/u-boot-x86.h>
 #include <asm/processor.h>

-#ifdef CONFIG_BITBANGMII
-#include <miiphy.h>
-#endif
-
-/************************************************************************
- * Init Utilities							*
- ************************************************************************
- * Some of this code should be moved into the core functions,
- * or dropped completely,
- * but let's get it working (again) first...
- */
-static int init_baudrate(void)
-{
-	gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
-	return 0;
-}
-
-static int display_banner(void)
-{
-
-	printf("\n\n%s\n\n", version_string);
-
-	return 0;
-}
-
-static int display_dram_config(void)
-{
-	int i;
-
-	puts("DRAM Configuration:\n");
-
-	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
-		printf("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
-		print_size(gd->bd->bi_dram[i].size, "\n");
-	}
-
-	return 0;
-}
-
-#ifndef CONFIG_SYS_NO_FLASH
-static void display_flash_config(ulong size)
-{
-	puts("Flash: ");
-	print_size(size, "\n");
-}
-#endif
+#include <asm/init_helpers.h>
+#include <asm/init_wrappers.h>

 /*
  * Breath some life into the board...
@@ -122,7 +72,7 @@ init_fnc_t *init_sequence_f[] = {
 	cpu_init_f,
 	board_early_init_f,
 	env_init,
-	init_baudrate,
+	init_baudrate_f,
 	serial_init,
 	console_init_f,
 	dram_init_f,
@@ -132,17 +82,81 @@ init_fnc_t *init_sequence_f[] = {
 };

 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 */
-	interrupt_init,		/* set up exceptions */
+	init_bd_struct_r,
+	mem_malloc_init_r,
+	cpu_init_r,
+	board_early_init_r,
+	dram_init,
+	interrupt_init,
 	timer_init,
 	display_banner,
 	display_dram_config,
-
+#ifdef CONFIG_SERIAL_MULTI
+	serial_initialize_r,
+#endif
+#ifndef CONFIG_SYS_NO_FLASH
+	flash_init_r,
+#endif
+	env_relocate_r,
+#ifdef CONFIG_CMD_NET
+	init_ip_address_r,
+#endif
+#ifdef CONFIG_PCI
+	pci_init_r,
+#endif
+	stdio_init,
+	jumptable_init_r,
+	console_init_r,
+#ifdef CONFIG_MISC_INIT_R
+	misc_init_r,
+#endif
+#if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_CMD_IDE)
+	pci_init_r,
+#endif
+#if defined(CONFIG_CMD_KGDB)
+	kgdb_init_r,
+#endif
+	enable_interrupts_r,
+#ifdef CONFIG_STATUS_LED
+	status_led_set_r,
+#endif
+	set_load_addr_r,
+#if defined(CONFIG_CMD_NET)
+	set_bootfile_r,
+#endif
+#if defined(CONFIG_CMD_IDE)
+	ide_init_r,
+#endif
+#if defined(CONFIG_CMD_SCSI)
+	scsi_init_r,
+#endif
+#if defined(CONFIG_CMD_DOC)
+	doc_init_r,
+#endif
+#ifdef CONFIG_BITBANGMII
+	bb_miiphy_init_r,
+#endif
+#if defined(CONFIG_CMD_NET)
+	eth_initialize_r,
+#ifdef CONFIG_RESET_PHY_R
+	reset_phy_r,
+#endif
+#endif
+#ifdef CONFIG_LAST_STAGE_INIT
+	last_stage_init,
+#endif
 	NULL,
 };

+static void do_init_loop(init_fnc_t **init_fnc_ptr)
+{
+	for (; *init_fnc_ptr; ++init_fnc_ptr) {
+		WATCHDOG_RESET();
+		if ((*init_fnc_ptr)() != 0)
+			hang();
+	}
+}
+
 static int calculate_relocation_address(void)
 {
 	ulong text_start = (ulong)&__text_start;
@@ -179,17 +193,12 @@ static int calculate_relocation_address(void)
 	return 0;
 }

-/* Load U-Boot into RAM, initialize BSS, perform relocation adjustments */
+/* Perform all steps necessary to get RAM initialised ready for relocation */
 void board_init_f(ulong boot_flags)
 {
-	init_fnc_t **init_fnc_ptr;
-
 	gd->flags = boot_flags;

-	for (init_fnc_ptr = init_sequence_f; *init_fnc_ptr; ++init_fnc_ptr) {
-		if ((*init_fnc_ptr)() != 0)
-			hang();
-	}
+	do_init_loop(init_sequence_f);

 	/*
 	 * SDRAM is now initialised, U-Boot has been copied into SDRAM,
@@ -247,166 +256,12 @@ static int copy_gd_to_ram(void)

 void board_init_r(gd_t *id, ulong dest_addr)
 {
-#if defined(CONFIG_CMD_NET)
-	char *s;
-#endif
-#ifndef CONFIG_SYS_NO_FLASH
-	ulong size;
-#endif
-	static bd_t bd_data;
-	init_fnc_t **init_fnc_ptr;
-
-	show_boot_progress(0x21);
+	gd->flags |= GD_FLG_RELOC;

 	/* compiler optimization barrier needed for GCC >= 3.4 */
 	__asm__ __volatile__("" : : : "memory");

-	gd->flags |= GD_FLG_RELOC;
-
-	gd->bd = &bd_data;
-	memset(gd->bd, 0, sizeof(bd_t));
-	show_boot_progress(0x22);
-
-	gd->baudrate =  CONFIG_BAUDRATE;
-
-	mem_malloc_init((((ulong)dest_addr - CONFIG_SYS_MALLOC_LEN)+3)&~3,
-			CONFIG_SYS_MALLOC_LEN);
-
-	for (init_fnc_ptr = init_sequence_r; *init_fnc_ptr; ++init_fnc_ptr) {
-		if ((*init_fnc_ptr)() != 0)
-			hang();
-	}
-	show_boot_progress(0x23);
-
-#ifdef CONFIG_SERIAL_MULTI
-	serial_initialize();
-#endif
-
-#ifndef CONFIG_SYS_NO_FLASH
-	/* configure available FLASH banks */
-	size = flash_init();
-	display_flash_config(size);
-	show_boot_progress(0x24);
-#endif
-
-	show_boot_progress(0x25);
-
-	/* initialize environment */
-	env_relocate();
-	show_boot_progress(0x26);
-
-
-#ifdef CONFIG_CMD_NET
-	/* IP Address */
-	bd_data.bi_ip_addr = getenv_IPaddr("ipaddr");
-#endif
-
-#if defined(CONFIG_PCI)
-	/*
-	 * Do pci configuration
-	 */
-	pci_init();
-#endif
-
-	show_boot_progress(0x27);
-
-
-	stdio_init();
-
-	jumptable_init();
-
-	/* Initialize the console (after the relocation and devices init) */
-	console_init_r();
-
-#ifdef CONFIG_MISC_INIT_R
-	/* miscellaneous platform dependent initialisations */
-	misc_init_r();
-#endif
-
-#if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_CMD_IDE)
-	WATCHDOG_RESET();
-	puts("PCMCIA:");
-	pcmcia_init();
-#endif
-
-#if defined(CONFIG_CMD_KGDB)
-	WATCHDOG_RESET();
-	puts("KGDB:  ");
-	kgdb_init();
-#endif
-
-	/* enable exceptions */
-	enable_interrupts();
-	show_boot_progress(0x28);
-
-#ifdef CONFIG_STATUS_LED
-	status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
-#endif
-
-	udelay(20);
-
-	/* Initialize from environment */
-	load_addr = getenv_ulong("loadaddr", 16, load_addr);
-#if defined(CONFIG_CMD_NET)
-	s = getenv("bootfile");
-
-	if (s != NULL)
-		copy_filename(BootFile, s, sizeof(BootFile));
-#endif
-
-	WATCHDOG_RESET();
-
-#if defined(CONFIG_CMD_IDE)
-	WATCHDOG_RESET();
-	puts("IDE:   ");
-	ide_init();
-#endif
-
-#if defined(CONFIG_CMD_SCSI)
-	WATCHDOG_RESET();
-	puts("SCSI:  ");
-	scsi_init();
-#endif
-
-#if defined(CONFIG_CMD_DOC)
-	WATCHDOG_RESET();
-	puts("DOC:   ");
-	doc_init();
-#endif
-
-#ifdef CONFIG_BITBANGMII
-	bb_miiphy_init();
-#endif
-#if defined(CONFIG_CMD_NET)
-	WATCHDOG_RESET();
-	puts("Net:   ");
-	eth_initialize(gd->bd);
-#endif
-
-#if (defined(CONFIG_CMD_NET)) && (0)
-	WATCHDOG_RESET();
-# ifdef DEBUG
-	puts("Reset Ethernet PHY\n");
-# endif
-	reset_phy();
-#endif
-
-#ifdef CONFIG_LAST_STAGE_INIT
-	WATCHDOG_RESET();
-	/*
-	 * Some parts can be only initialized if all others (like
-	 * Interrupts) are up and running (i.e. the PC-style ISA
-	 * keyboard).
-	 */
-	last_stage_init();
-#endif
-
-
-#ifdef CONFIG_POST
-	post_run(NULL, POST_RAM | post_bootmode_get(0));
-#endif
-
-	show_boot_progress(0x29);
+	do_init_loop(init_sequence_r);

 	/* main_loop() can return to retry autoboot, if so just run it again. */
 	for (;;)
diff --git a/arch/x86/lib/init_helpers.c b/arch/x86/lib/init_helpers.c
new file mode 100644
index 0000000..547b180
--- /dev/null
+++ b/arch/x86/lib/init_helpers.c
@@ -0,0 +1,142 @@
+/*
+ * (C) Copyright 2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#include <common.h>
+#include <command.h>
+#include <stdio_dev.h>
+#include <version.h>
+#include <malloc.h>
+#include <net.h>
+#include <ide.h>
+#include <serial.h>
+#include <status_led.h>
+#include <asm/u-boot-x86.h>
+
+#include <asm/init_helpers.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/************************************************************************
+ * Init Utilities							*
+ ************************************************************************
+ * Some of this code should be moved into the core functions,
+ * or dropped completely,
+ * but let's get it working (again) first...
+ */
+
+int display_banner(void)
+{
+	printf("\n\n%s\n\n", version_string);
+
+	return 0;
+}
+
+int display_dram_config(void)
+{
+	int i;
+
+	puts("DRAM Configuration:\n");
+
+	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+		printf("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
+		print_size(gd->bd->bi_dram[i].size, "\n");
+	}
+
+	return 0;
+}
+
+int init_baudrate_f(void)
+{
+	gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
+	return 0;
+}
+
+int mem_malloc_init_r(void)
+{
+	mem_malloc_init(((gd->relocaddr - CONFIG_SYS_MALLOC_LEN)+3)&~3,
+			CONFIG_SYS_MALLOC_LEN);
+
+	return 0;
+}
+
+bd_t bd_data;
+
+int init_bd_struct_r(void)
+{
+	gd->bd = &bd_data;
+	memset(gd->bd, 0, sizeof(bd_t));
+
+	return 0;
+}
+
+#ifndef CONFIG_SYS_NO_FLASH
+int flash_init_r(void)
+{
+	ulong size;
+
+	puts("Flash: ");
+
+	/* configure available FLASH banks */
+	size = flash_init();
+
+	print_size(size, "\n");
+
+	return 0;
+}
+#endif
+
+int init_ip_address_r(void)
+{
+	/* IP Address */
+	bd_data.bi_ip_addr = getenv_IPaddr("ipaddr");
+
+	return 0;
+}
+
+#ifdef CONFIG_STATUS_LED
+int status_led_set_r(void)
+{
+	status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
+
+	return 0;
+}
+#endif
+
+int set_bootfile_r(void)
+{
+	char *s;
+
+	s = getenv("bootfile");
+
+	if (s != NULL)
+		copy_filename(BootFile, s, sizeof(BootFile));
+
+	return 0;
+}
+
+int set_load_addr_r(void)
+{
+	/* Initialize from environment */
+	load_addr = getenv_ulong("loadaddr", 16, load_addr);
+
+	return 0;
+}
diff --git a/arch/x86/lib/init_wrappers.c b/arch/x86/lib/init_wrappers.c
new file mode 100644
index 0000000..71449fe
--- /dev/null
+++ b/arch/x86/lib/init_wrappers.c
@@ -0,0 +1,137 @@
+/*
+ * (C) Copyright 2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#include <common.h>
+#include <serial.h>
+#include <kgdb.h>
+#include <scsi.h>
+#include <post.h>
+#include <miiphy.h>
+
+#include <asm/init_wrappers.h>
+
+int serial_initialize_r(void)
+{
+	serial_initialize();
+
+	return 0;
+}
+
+int env_relocate_r(void)
+{
+	/* initialize environment */
+	env_relocate();
+
+	return 0;
+}
+
+
+int pci_init_r(void)
+{
+	/* Do pci configuration */
+	pci_init();
+
+	return 0;
+}
+
+int jumptable_init_r(void)
+{
+	jumptable_init();
+
+	return 0;
+}
+
+int pcmcia_init_r(void)
+{
+	puts("PCMCIA:");
+	pcmcia_init();
+
+	return 0;
+}
+
+int kgdb_init_r(void)
+{
+	puts("KGDB:  ");
+	kgdb_init();
+
+	return 0;
+}
+
+int enable_interrupts_r(void)
+{
+	/* enable exceptions */
+	enable_interrupts();
+
+	return 0;
+}
+
+int eth_initialize_r(void)
+{
+	puts("Net:   ");
+	eth_initialize(gd->bd);
+
+	return 0;
+}
+
+int reset_phy_r(void)
+{
+#ifdef DEBUG
+	puts("Reset Ethernet PHY\n");
+#endif
+	reset_phy();
+
+	return 0;
+}
+
+int ide_init_r(void)
+{
+	puts("IDE:   ");
+	ide_init();
+
+	return 0;
+}
+
+int scsi_init_r(void)
+{
+	puts("SCSI:  ");
+	scsi_init();
+
+	return 0;
+}
+
+#ifdef CONFIG_BITBANGMII
+int bb_miiphy_init_r(void)
+{
+	bb_miiphy_init();
+
+	return 0;
+}
+#endif
+
+#ifdef CONFIG_POST
+int post_run_r(void)
+{
+	post_run(NULL, POST_RAM | post_bootmode_get(0));
+
+	return 0;
+}
+#endif
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 17/17] x86: Convert board_init_f_r to a processing loop
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (14 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 16/17] x86: Split init functions " Graeme Russ
@ 2012-01-04 19:59     ` Graeme Russ
  2012-01-07 22:21       ` Simon Glass
  2012-01-12  5:04       ` Simon Glass
  2012-01-12  4:44     ` [U-Boot] [PATCH v2 01/17] x86: Import glibc memcpy implementation Simon Glass
  16 siblings, 2 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 19:59 UTC (permalink / raw)
  To: u-boot

Create an init function array for board_init_f_r - This finalises the
migration to a purely array based initialisation mechanism

Also tweak a few comments while we are at it so everything is 'correct'

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v2:
 - Renamed to a more apt name
 - Fix bug in set_reloc_flag_r
 - Re-instate gd->flags = boot_flags; in board_init_f
 - Added commit message

 arch/x86/include/asm/init_helpers.h |    5 +
 arch/x86/include/asm/relocate.h     |   33 ++++++
 arch/x86/lib/board.c                |  186 +++++++++++++++++------------------
 arch/x86/lib/init_helpers.c         |   75 ++++++++++++++
 arch/x86/lib/relocate.c             |   32 +-----
 5 files changed, 206 insertions(+), 125 deletions(-)
 create mode 100644 arch/x86/include/asm/relocate.h

diff --git a/arch/x86/include/asm/init_helpers.h b/arch/x86/include/asm/init_helpers.h
index 14ef11a..192f18e 100644
--- a/arch/x86/include/asm/init_helpers.h
+++ b/arch/x86/include/asm/init_helpers.h
@@ -27,7 +27,12 @@
 int display_banner(void);
 int display_dram_config(void);
 int init_baudrate_f(void);
+int calculate_relocation_address(void);

+int copy_gd_to_ram_f_r(void);
+int init_cache_f_r(void);
+
+int set_reloc_flag_r(void);
 int mem_malloc_init_r(void);
 int init_bd_struct_r(void);
 int flash_init_r(void);
diff --git a/arch/x86/include/asm/relocate.h b/arch/x86/include/asm/relocate.h
new file mode 100644
index 0000000..33129ef
--- /dev/null
+++ b/arch/x86/include/asm/relocate.h
@@ -0,0 +1,33 @@
+/*
+ * (C) Copyright 2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef _RELOCATE_H_
+#define _RELOCATE_H_
+
+#include <common.h>
+
+int copy_uboot_to_ram(void);
+int clear_bss(void);
+int do_elf_reloc_fixups(void);
+
+#endif	/* !_RELOCATE_H_ */
diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index 89721c7..5f0b62c 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -35,7 +35,7 @@
 #include <watchdog.h>
 #include <stdio_dev.h>
 #include <asm/u-boot-x86.h>
-#include <asm/processor.h>
+#include <asm/relocate.h>

 #include <asm/init_helpers.h>
 #include <asm/init_wrappers.h>
@@ -43,31 +43,58 @@
 /*
  * Breath some life into the board...
  *
- * Initialize an SMC for serial comms, and carry out some hardware
- * tests.
+ * Getting the board up and running is a three-stage process:
+ *  1) Execute from Flash, SDRAM Uninitialised
+ *     At this point, there is a limited amount of non-SDRAM memory
+ *     (typically the CPU cache, but can also be SRAM or even a buffer of
+ *     of some peripheral). This limited memory is used to hold:
+ *      - The initial copy of the Global Data Structure
+ *      - A temporary stack
+ *      - A temporary x86 Global Descriptor Table
+ *      - The pre-console buffer (if enabled)
  *
- * The first part of initialization is running from Flash memory;
- * its main purpose is to initialize the RAM so that we
- * can relocate the monitor code to RAM.
+ *     The following is performed during this phase of execution:
+ *      - Core low-level CPU initialisation
+ *      - Console initialisation
+ *      - SDRAM initialisation
+ *
+ *  2) Execute from Flash, SDRAM Initialised
+ *     At this point we copy Global Data from the initial non-SDRAM
+ *     memory and set up the permanent stack in SDRAM. The CPU cache is no
+ *     longer being used as temporary memory, so we can now fully enable
+ *     it.
+ *
+ *     The following is performed during this phase of execution:
+ *      - Create final stack in SDRAM
+ *      - Copy Global Data from temporary memory to SDRAM
+ *      - Enabling of CPU cache(s),
+ *      - Copying of U-Boot code and data from Flash to RAM
+ *      - Clearing of the BSS
+ *      - ELF relocation adjustments
+ *
+ *  3) Execute from SDRAM
+ *     The following is performed during this phase of execution:
+ *      - All remaining initialisation
  */

 /*
- * All attempts to come up with a "common" initialization sequence
- * that works for all boards and architectures failed: some of the
- * requirements are just _too_ different. To get rid of the resulting
- * mess of board dependend #ifdef'ed code we now make the whole
- * initialization sequence configurable to the user.
- *
- * The requirements for any new initalization function is simple: it
- * receives a pointer to the "global data" structure as it's only
- * argument, and returns an integer return code, where 0 means
- * "continue" and != 0 means "fatal error, hang the system".
+ * The requirements for any new initalization function is simple: it is
+ * a function with no parameters which returns an integer return code,
+ * where 0 means "continue" and != 0 means "fatal error, hang the system"
  */
 typedef int (init_fnc_t) (void);

-static int calculate_relocation_address(void);
-static int copy_gd_to_ram(void);
-
+/*
+ * init_sequence_f is the list of init functions which are run when U-Boot
+ * is executing from Flash with a limited 'C' environment. The following
+ * limitations must be considered when implementing an '_f' function:
+ *  - 'static' variables are read-only
+ *  - Global Data (gd->xxx) is read/write
+ *  - Stack space is limited
+ *
+ * The '_f' sequence must, as a minimum, initialise SDRAM. It _should_
+ * also initialise the console (to provide early debug output)
+ */
 init_fnc_t *init_sequence_f[] = {
 	cpu_init_f,
 	board_early_init_f,
@@ -81,7 +108,39 @@ init_fnc_t *init_sequence_f[] = {
 	NULL,
 };

+/*
+ * init_sequence_f_r is the list of init functions which are run when
+ * U-Boot is executing from Flash with a semi-limited 'C' environment.
+ * The following limitations must be considered when implementing an
+ * '_f_r' function:
+ *  - 'static' variables are read-only
+ *  - Global Data (gd->xxx) is read/write
+ *
+ * The '_f_r' sequence must, as a minimum, copy U-Boot to RAM (if
+ * supported).  It _should_, if possible, copy global data to RAM and
+ * initialise the CPU caches (to speed up the relocation process)
+ */
+init_fnc_t *init_sequence_f_r[] = {
+	copy_gd_to_ram_f_r,
+	init_cache_f_r,
+	copy_uboot_to_ram,
+	clear_bss,
+	do_elf_reloc_fixups,
+
+	NULL,
+};
+
+/*
+ * init_sequence_r is the list of init functions which are run when U-Boot
+ * is executing from RAM with a full 'C' environment. There are no longer
+ * any limitations which must be considered when implementing an '_r'
+ * function, (i.e.'static' variables are read/write)
+ *
+ * If not already done, the '_r' sequence must copy global data to RAM and
+ * (should) initialise the CPU caches.
+ */
 init_fnc_t *init_sequence_r[] = {
+	set_reloc_flag_r,
 	init_bd_struct_r,
 	mem_malloc_init_r,
 	cpu_init_r,
@@ -157,43 +216,6 @@ static void do_init_loop(init_fnc_t **init_fnc_ptr)
 	}
 }

-static int calculate_relocation_address(void)
-{
-	ulong text_start = (ulong)&__text_start;
-	ulong bss_end = (ulong)&__bss_end;
-	ulong dest_addr;
-
-	/*
-	 * NOTE: All destination address are rounded down to 16-byte
-	 *       boundary to satisfy various worst-case alignment
-	 *       requirements
-	 */
-
-	/* Global Data is at top of available memory */
-	dest_addr = gd->ram_size;
-	dest_addr -= GENERATED_GBL_DATA_SIZE;
-	dest_addr &= ~15;
-	gd->new_gd_addr = dest_addr;
-
-	/* GDT is below Global Data */
-	dest_addr -= X86_GDT_SIZE;
-	dest_addr &= ~15;
-	gd->gdt_addr = dest_addr;
-
-	/* Stack is below GDT */
-	gd->start_addr_sp = dest_addr;
-
-	/* U-Boot is below the stack */
-	dest_addr -= CONFIG_SYS_STACK_SIZE;
-	dest_addr -= (bss_end - text_start);
-	dest_addr &= ~15;
-	gd->relocaddr = dest_addr;
-	gd->reloc_off = (dest_addr - text_start);
-
-	return 0;
-}
-
-/* Perform all steps necessary to get RAM initialised ready for relocation */
 void board_init_f(ulong boot_flags)
 {
 	gd->flags = boot_flags;
@@ -201,10 +223,9 @@ void board_init_f(ulong boot_flags)
 	do_init_loop(init_sequence_f);

 	/*
-	 * SDRAM is now initialised, U-Boot has been copied into SDRAM,
-	 * the BSS has been cleared etc. The final stack can now be setup
-	 * in SDRAM. Code execution will continue (momentarily) in Flash,
-	 * but with the stack in SDRAM and Global Data in temporary memory
+	 * SDRAM and console are now initialised. The final stack can now
+	 * be setup in SDRAM. Code execution will continue in Flash, but
+	 * with the stack in SDRAM and Global Data in temporary memory
 	 * (CPU cache)
 	 */
 	board_init_f_r_trampoline(gd->start_addr_sp);
@@ -216,51 +237,22 @@ void board_init_f(ulong boot_flags)

 void board_init_f_r(void)
 {
-	if (copy_gd_to_ram() != 0)
-		hang();
-
-	if (init_cache() != 0)
-		hang();
-
-	relocate_code(0, gd, 0);
-
-	/* NOTREACHED - relocate_code() does not return */
-	while (1)
-		;
-}
-
-static int copy_gd_to_ram(void)
-{
-	gd_t *ram_gd;
+	do_init_loop(init_sequence_f_r);

 	/*
-	 * Global data is still in temporary memory (the CPU cache).
-	 * calculate_relocation_address() has set gd->new_gd_addr to
-	 * where the global data lives in RAM but getting it there
-	 * safely is a bit tricky due to the 'F-Segment Hack' that
-	 * we need to use for x86
+	 * U-Boot has been copied into SDRAM, the BSS has been cleared etc.
+	 * Transfer execution from Flash to RAM by calculating the address
+	 * of the in-RAM copy of board_init_r() and calling it
 	 */
-	ram_gd = (gd_t *)gd->new_gd_addr;
-	memcpy((void *)ram_gd, gd, sizeof(gd_t));
+	(board_init_r + gd->reloc_off)(gd, gd->relocaddr);

-	/*
-	 * Reload the Global Descriptor Table so FS points to the
-	 * in-RAM copy of Global Data (calculate_relocation_address()
-	 * has already calculated the in-RAM location of the GDT)
-	 */
-	ram_gd->gd_addr = (ulong)ram_gd;
-	init_gd(ram_gd, (u64 *)gd->gdt_addr);
-
-	return 0;
+	/* NOTREACHED - board_init_r() does not return */
+	while (1)
+		;
 }

 void board_init_r(gd_t *id, ulong dest_addr)
 {
-	gd->flags |= GD_FLG_RELOC;
-
-	/* compiler optimization barrier needed for GCC >= 3.4 */
-	__asm__ __volatile__("" : : : "memory");
-
 	do_init_loop(init_sequence_r);

 	/* main_loop() can return to retry autoboot, if so just run it again. */
diff --git a/arch/x86/lib/init_helpers.c b/arch/x86/lib/init_helpers.c
index 547b180..9f4dee0 100644
--- a/arch/x86/lib/init_helpers.c
+++ b/arch/x86/lib/init_helpers.c
@@ -29,6 +29,7 @@
 #include <ide.h>
 #include <serial.h>
 #include <status_led.h>
+#include <asm/processor.h>
 #include <asm/u-boot-x86.h>

 #include <asm/init_helpers.h>
@@ -70,6 +71,80 @@ int init_baudrate_f(void)
 	return 0;
 }

+int calculate_relocation_address(void)
+{
+	ulong text_start = (ulong)&__text_start;
+	ulong bss_end = (ulong)&__bss_end;
+	ulong dest_addr;
+
+	/*
+	 * NOTE: All destination address are rounded down to 16-byte
+	 *       boundary to satisfy various worst-case alignment
+	 *       requirements
+	 */
+
+	/* Global Data is at top of available memory */
+	dest_addr = gd->ram_size;
+	dest_addr -= GENERATED_GBL_DATA_SIZE;
+	dest_addr &= ~15;
+	gd->new_gd_addr = dest_addr;
+
+	/* GDT is below Global Data */
+	dest_addr -= X86_GDT_SIZE;
+	dest_addr &= ~15;
+	gd->gdt_addr = dest_addr;
+
+	/* Stack is below GDT */
+	gd->start_addr_sp = dest_addr;
+
+	/* U-Boot is below the stack */
+	dest_addr -= CONFIG_SYS_STACK_SIZE;
+	dest_addr -= (bss_end - text_start);
+	dest_addr &= ~15;
+	gd->relocaddr = dest_addr;
+	gd->reloc_off = (dest_addr - text_start);
+
+	return 0;
+}
+
+int copy_gd_to_ram_f_r(void)
+{
+	gd_t *ram_gd;
+
+	/*
+	 * Global data is still in temporary memory (the CPU cache).
+	 * calculate_relocation_address() has set gd->new_gd_addr to
+	 * where the global data lives in RAM but getting it there
+	 * safely is a bit tricky due to the 'F-Segment Hack' that
+	 * we need to use for x86
+	 */
+	ram_gd = (gd_t *)gd->new_gd_addr;
+	memcpy((void *)ram_gd, gd, sizeof(gd_t));
+
+	/*
+	 * Reload the Global Descriptor Table so FS points to the
+	 * in-RAM copy of Global Data (calculate_relocation_address()
+	 * has already calculated the in-RAM location of the GDT)
+	 */
+	ram_gd->gd_addr = (ulong)ram_gd;
+	init_gd(ram_gd, (u64 *)gd->gdt_addr);
+
+	return 0;
+}
+
+int init_cache_f_r(void)
+{
+	/* Initialise the CPU cache(s) */
+	return init_cache();
+}
+
+int set_reloc_flag_r(void)
+{
+	gd->flags = GD_FLG_RELOC;
+
+	return 0;
+}
+
 int mem_malloc_init_r(void)
 {
 	mem_malloc_init(((gd->relocaddr - CONFIG_SYS_MALLOC_LEN)+3)&~3,
diff --git a/arch/x86/lib/relocate.c b/arch/x86/lib/relocate.c
index badb5f8..200baab 100644
--- a/arch/x86/lib/relocate.c
+++ b/arch/x86/lib/relocate.c
@@ -34,13 +34,10 @@
 #include <common.h>
 #include <malloc.h>
 #include <asm/u-boot-x86.h>
+#include <asm/relocate.h>
 #include <elf.h>

-static int copy_uboot_to_ram(void);
-static int clear_bss(void);
-static int do_elf_reloc_fixups(void);
-
-static int copy_uboot_to_ram(void)
+int copy_uboot_to_ram(void)
 {
 	size_t len = (size_t)&__data_end - (size_t)&__text_start;

@@ -49,7 +46,7 @@ static int copy_uboot_to_ram(void)
 	return 0;
 }

-static int clear_bss(void)
+int clear_bss(void)
 {
 	ulong dst_addr = (ulong)&__bss_start + gd->reloc_off;
 	size_t len = (size_t)&__bss_end - (size_t)&__bss_start;
@@ -59,7 +56,7 @@ static int clear_bss(void)
 	return 0;
 }

-static int do_elf_reloc_fixups(void)
+int do_elf_reloc_fixups(void)
 {
 	Elf32_Rel *re_src = (Elf32_Rel *)(&__rel_dyn_start);
 	Elf32_Rel *re_end = (Elf32_Rel *)(&__rel_dyn_end);
@@ -92,24 +89,3 @@ static int do_elf_reloc_fixups(void)

 	return 0;
 }
-
-void relocate_code(ulong dummy_1, gd_t *id, ulong dummy_2)
-{
-	/*
-	 * Copy U-Boot into RAM, clear the BSS and perform relocation
-	 * adjustments
-	 */
-	copy_uboot_to_ram();
-	clear_bss();
-	do_elf_reloc_fixups();
-
-	/*
-	 * Transfer execution from Flash to RAM by calculating the address
-	 * of the in-RAM copy of board_init_r() and calling it
-	 */
-	(board_init_r + gd->reloc_off)(gd, gd->relocaddr);
-
-	/* NOTREACHED - board_init_r() does not return */
-	while (1)
-		;
-}
--
1.7.5.2.317.g391b14

^ permalink raw reply related	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 02/17] x86: Speed up copy-to-RAM and clear BSS operations
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 02/17] x86: Speed up copy-to-RAM and clear BSS operations Graeme Russ
@ 2012-01-04 20:04       ` Graeme Russ
  2012-01-12  4:45       ` Simon Glass
  1 sibling, 0 replies; 87+ messages in thread
From: Graeme Russ @ 2012-01-04 20:04 UTC (permalink / raw)
  To: u-boot

Oops, after painstakingly setting In-Reply-To: I've gone and left
git-send-email chain-reply on :(

Sorry 'bout that

Regards,

Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 03/17] x86: Remove GDR related magic numbers
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 03/17] x86: Remove GDR related magic numbers Graeme Russ
@ 2012-01-07 22:05       ` Simon Glass
  2012-01-12  4:46       ` Simon Glass
  1 sibling, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-07 22:05 UTC (permalink / raw)
  To: u-boot

HI Graeme,

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> Changes for v2:
> ?- Use an enum
> ?- Add defined for GDT size (previously added in patch 7)
> ?- Use X86_ namespace (as per Linux headers)
>
> ?arch/x86/cpu/cpu.c ? ? ? ? ? ? ? | ? ?8 ++++----
> ?arch/x86/cpu/start.S ? ? ? ? ? ? | ? ?3 ++-
> ?arch/x86/include/asm/processor.h | ? 23 +++++++++++++++++++----
> ?3 files changed, 25 insertions(+), 9 deletions(-)
>
> diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
> index 61d0b69..209ff29 100644
> --- a/arch/x86/cpu/cpu.c
> +++ b/arch/x86/cpu/cpu.c
> @@ -63,13 +63,13 @@ static void reload_gdt(void)
> ? ? ? ? */
> ? ? ? ?static const u64 boot_gdt[] __attribute__((aligned(16))) = {
> ? ? ? ? ? ? ? ?/* CS: code, read/execute, 4 GB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
> + ? ? ? ? ? ? ? [X86_GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
> ? ? ? ? ? ? ? ?/* DS: data, read/write, 4 GB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
> + ? ? ? ? ? ? ? [X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
> ? ? ? ? ? ? ? ?/* 16-bit CS: code, read/execute, 64 kB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
> + ? ? ? ? ? ? ? [X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
> ? ? ? ? ? ? ? ?/* 16-bit DS: data, read/write, 64 kB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
> + ? ? ? ? ? ? ? [X86_GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
> ? ? ? ?};
> ? ? ? ?static struct gdt_ptr gdt;
>
> diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
> index f87633b..6027f54 100644
> --- a/arch/x86/cpu/start.S
> +++ b/arch/x86/cpu/start.S
> @@ -29,6 +29,7 @@
> ?#include <config.h>
> ?#include <version.h>
> ?#include <asm/global_data.h>
> +#include <asm/processor.h>
> ?#include <asm/processor-flags.h>
> ?#include <generated/asm-offsets.h>
>
> @@ -58,7 +59,7 @@ _start:
> ? ? ? ?/* This is the 32-bit cold-reset entry point */
>
> ? ? ? ?/* Load the segement registes to match the gdt loaded in start16.S */
> - ? ? ? movl ? ?$0x18, %eax
> + ? ? ? movl ? ?$(X86_GDT_ENTRY_32BIT_DS * X86_GDT_ENTRY_SIZE), %eax
> ? ? ? ?movw ? ?%ax, %fs
> ? ? ? ?movw ? ?%ax, %ds
> ? ? ? ?movw ? ?%ax, %gs
> diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
> index 1e5dccd..aa8188e 100644
> --- a/arch/x86/include/asm/processor.h
> +++ b/arch/x86/include/asm/processor.h
> @@ -24,9 +24,24 @@
> ?#ifndef __ASM_PROCESSOR_H_
> ?#define __ASM_PROCESSOR_H_ 1
>
> -#define GDT_ENTRY_32BIT_CS ? ? 2
> -#define GDT_ENTRY_32BIT_DS ? ? (GDT_ENTRY_32BIT_CS + 1)
> -#define GDT_ENTRY_16BIT_CS ? ? (GDT_ENTRY_32BIT_DS + 1)
> -#define GDT_ENTRY_16BIT_DS ? ? (GDT_ENTRY_16BIT_CS + 1)
> +#define X86_GDT_ENTRY_SIZE ? ? 8
> +
> +#ifndef __ASSEMBLY__
> +
> +enum {
> + ? ? ? X86_GDT_ENTRY_NULL = 0,
> + ? ? ? X86_GDT_ENTRY_UNUSED,
> + ? ? ? X86_GDT_ENTRY_32BIT_CS,
> + ? ? ? X86_GDT_ENTRY_32BIT_DS,
> + ? ? ? X86_GDT_ENTRY_16BIT_CS,
> + ? ? ? X86_GDT_ENTRY_16BIT_DS,
> + ? ? ? X86_GDT_NUM_ENTRIES
> +};
> +#else
> +/* NOTE: If the above enum is modified, this define must be checked */
> +#define X86_GDT_ENTRY_32BIT_DS 3

Well then I suppose you could put an _ASM prefix on the #define
version, put it above the #ifdef and then add something like

#if X86_GDT_ENTRY_32BIT_DS != X86_GDT_ENTRY_32BIT_DS_ASM
#error "..."
#endif

but that it probably overkill since I suspect you are unlikely to change it.

Regards,
Simon

> +#endif
> +
> +#define X86_GDT_SIZE ? ? ? ? ? (X86_GDT_NUM_ENTRIES * X86_GDT_ENTRY_SIZE)
>
> ?#endif
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 15/17] x86: Move relocation code out of board.c
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 15/17] x86: Move relocation code " Graeme Russ
@ 2012-01-07 22:15       ` Simon Glass
  2012-01-08  9:04         ` Graeme Russ
  2012-01-12  5:03       ` Simon Glass
  1 sibling, 1 reply; 87+ messages in thread
From: Simon Glass @ 2012-01-07 22:15 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> Changes for v2:
> ?- None
>
> ?arch/x86/lib/Makefile ? | ? ?1 +
> ?arch/x86/lib/board.c ? ?| ? 69 +---------------------------
> ?arch/x86/lib/relocate.c | ?115 +++++++++++++++++++++++++++++++++++++++++++++++
> ?3 files changed, 118 insertions(+), 67 deletions(-)
> ?create mode 100644 arch/x86/lib/relocate.c

Sorry - these comments are for future reference, since all you are
doing here is moving code. But I might as well send them here.

>
> diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
> index 7820895..57b6896 100644
> --- a/arch/x86/lib/Makefile
> +++ b/arch/x86/lib/Makefile
> @@ -40,6 +40,7 @@ COBJS-$(CONFIG_SYS_GENERIC_TIMER) += pcat_timer.o
> ?COBJS-$(CONFIG_PCI) += pci.o
> ?COBJS-$(CONFIG_PCI) += pci_type1.o
> ?COBJS-$(CONFIG_SYS_X86_REALMODE) ? ? ? += realmode.o
> +COBJS-y ? ? ? ?+= relocate.o
> ?COBJS-y ? ? ? ?+= string.o
> ?COBJS-$(CONFIG_SYS_X86_ISR_TIMER) ? ? ?+= timer.o
> ?COBJS-$(CONFIG_VIDEO) ?+= video_bios.o
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index 416aa9e..bebb347 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -41,7 +41,6 @@
> ?#include <ide.h>
> ?#include <serial.h>
> ?#include <asm/u-boot-x86.h>
> -#include <elf.h>
> ?#include <asm/processor.h>
>
> ?#ifdef CONFIG_BITBANGMII
> @@ -117,9 +116,6 @@ static void display_flash_config(ulong size)
> ?typedef int (init_fnc_t) (void);
>
> ?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);
> ?static int copy_gd_to_ram(void);
>
> ?init_fnc_t *init_sequence_f[] = {
> @@ -183,59 +179,6 @@ static int calculate_relocation_address(void)
> ? ? ? ?return 0;
> ?}
>
> -static int copy_uboot_to_ram(void)
> -{
> - ? ? ? size_t len = (size_t)&__data_end - (size_t)&__text_start;
> -
> - ? ? ? memcpy((void *)gd->relocaddr, (void *)&__text_start, len);
> -
> - ? ? ? return 0;
> -}
> -
> -static int clear_bss(void)
> -{
> - ? ? ? ulong dst_addr = (ulong)&__bss_start + gd->reloc_off;
> - ? ? ? size_t len = (size_t)&__bss_end - (size_t)&__bss_start;
> -
> - ? ? ? memset((void *)dst_addr, 0x00, len);
> -
> - ? ? ? return 0;
> -}
> -
> -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);
> -
> - ? ? ? Elf32_Addr *offset_ptr_rom;
> - ? ? ? Elf32_Addr *offset_ptr_ram;
> -
> - ? ? ? /* The size of the region of u-boot that runs out of RAM. */
> - ? ? ? uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
> -
> - ? ? ? do {
> - ? ? ? ? ? ? ? /* Get the location from the relocation entry */
> - ? ? ? ? ? ? ? offset_ptr_rom = (Elf32_Addr *)re_src->r_offset;
> -
> - ? ? ? ? ? ? ? /* Check that the location of the relocation is in .text */
> - ? ? ? ? ? ? ? if (offset_ptr_rom >= (Elf32_Addr *)CONFIG_SYS_TEXT_BASE) {

perhaps:

if (re_src->r_offset >= CONFIG_SYS_TEXT_BASE) {

> -
> - ? ? ? ? ? ? ? ? ? ? ? /* Switch to the in-RAM version */
> - ? ? ? ? ? ? ? ? ? ? ? offset_ptr_ram = (Elf32_Addr *)((ulong)offset_ptr_rom +
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gd->reloc_off);
> -
> - ? ? ? ? ? ? ? ? ? ? ? /* Check that the target points into .text */
> - ? ? ? ? ? ? ? ? ? ? ? if (*offset_ptr_ram >= CONFIG_SYS_TEXT_BASE &&
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *offset_ptr_ram <
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (CONFIG_SYS_TEXT_BASE + size)) {
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *offset_ptr_ram += gd->reloc_off;

Can the target not pointer into data? I think you are allowing this
anyway with your test, but are you sure this comment is right?

> - ? ? ? ? ? ? ? ? ? ? ? }
> - ? ? ? ? ? ? ? }
> - ? ? ? } while (re_src++ < re_end);

Should this while() condition go@the top? What if the table has no entries?

Regards,
Simon

> -
> - ? ? ? return 0;
> -}
> -
> ?/* Load U-Boot into RAM, initialize BSS, perform relocation adjustments */
> ?void board_init_f(ulong boot_flags)
> ?{
> @@ -270,17 +213,9 @@ void board_init_f_r(void)
> ? ? ? ?if (init_cache() != 0)
> ? ? ? ? ? ? ? ?hang();
>
> - ? ? ? copy_uboot_to_ram();
> - ? ? ? clear_bss();
> - ? ? ? do_elf_reloc_fixups();
> -
> - ? ? ? /*
> - ? ? ? ?* Transfer execution from Flash to RAM by calculating the address
> - ? ? ? ?* of the in-RAM copy of board_init_r() and calling it
> - ? ? ? ?*/
> - ? ? ? (board_init_r + gd->reloc_off)(gd, gd->relocaddr);
> + ? ? ? relocate_code(0, gd, 0);
>
> - ? ? ? /* NOTREACHED - board_init_r() does not return */
> + ? ? ? /* NOTREACHED - relocate_code() does not return */
> ? ? ? ?while (1)
> ? ? ? ? ? ? ? ?;
> ?}
> diff --git a/arch/x86/lib/relocate.c b/arch/x86/lib/relocate.c
> new file mode 100644
> index 0000000..badb5f8
> --- /dev/null
> +++ b/arch/x86/lib/relocate.c
> @@ -0,0 +1,115 @@
> +/*
> + * (C) Copyright 2008-2011
> + * Graeme Russ, <graeme.russ@gmail.com>
> + *
> + * (C) Copyright 2002
> + * Daniel Engstr?m, Omicron Ceti AB, <daniel@omicron.se>
> + *
> + * (C) Copyright 2002
> + * Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
> + *
> + * (C) Copyright 2002
> + * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
> + * Marius Groeger <mgroeger@sysgo.de>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ?See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <common.h>
> +#include <malloc.h>
> +#include <asm/u-boot-x86.h>
> +#include <elf.h>
> +
> +static int copy_uboot_to_ram(void);
> +static int clear_bss(void);
> +static int do_elf_reloc_fixups(void);
> +
> +static int copy_uboot_to_ram(void)
> +{
> + ? ? ? size_t len = (size_t)&__data_end - (size_t)&__text_start;
> +
> + ? ? ? memcpy((void *)gd->relocaddr, (void *)&__text_start, len);
> +
> + ? ? ? return 0;
> +}
> +
> +static int clear_bss(void)
> +{
> + ? ? ? ulong dst_addr = (ulong)&__bss_start + gd->reloc_off;
> + ? ? ? size_t len = (size_t)&__bss_end - (size_t)&__bss_start;
> +
> + ? ? ? memset((void *)dst_addr, 0x00, len);
> +
> + ? ? ? return 0;
> +}
> +
> +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);
> +
> + ? ? ? Elf32_Addr *offset_ptr_rom;
> + ? ? ? Elf32_Addr *offset_ptr_ram;
> +
> + ? ? ? /* The size of the region of u-boot that runs out of RAM. */
> + ? ? ? uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
> +
> + ? ? ? do {
> + ? ? ? ? ? ? ? /* Get the location from the relocation entry */
> + ? ? ? ? ? ? ? offset_ptr_rom = (Elf32_Addr *)re_src->r_offset;
> +
> + ? ? ? ? ? ? ? /* Check that the location of the relocation is in .text */
> + ? ? ? ? ? ? ? if (offset_ptr_rom >= (Elf32_Addr *)CONFIG_SYS_TEXT_BASE) {
> +
> + ? ? ? ? ? ? ? ? ? ? ? /* Switch to the in-RAM version */
> + ? ? ? ? ? ? ? ? ? ? ? offset_ptr_ram = (Elf32_Addr *)((ulong)offset_ptr_rom +
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gd->reloc_off);
> +
> + ? ? ? ? ? ? ? ? ? ? ? /* Check that the target points into .text */
> + ? ? ? ? ? ? ? ? ? ? ? if (*offset_ptr_ram >= CONFIG_SYS_TEXT_BASE &&
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *offset_ptr_ram <
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (CONFIG_SYS_TEXT_BASE + size)) {
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *offset_ptr_ram += gd->reloc_off;
> + ? ? ? ? ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? }
> + ? ? ? } while (re_src++ < re_end);
> +
> + ? ? ? return 0;
> +}
> +
> +void relocate_code(ulong dummy_1, gd_t *id, ulong dummy_2)
> +{
> + ? ? ? /*
> + ? ? ? ?* Copy U-Boot into RAM, clear the BSS and perform relocation
> + ? ? ? ?* adjustments
> + ? ? ? ?*/
> + ? ? ? copy_uboot_to_ram();
> + ? ? ? clear_bss();
> + ? ? ? do_elf_reloc_fixups();
> +
> + ? ? ? /*
> + ? ? ? ?* Transfer execution from Flash to RAM by calculating the address
> + ? ? ? ?* of the in-RAM copy of board_init_r() and calling it
> + ? ? ? ?*/
> + ? ? ? (board_init_r + gd->reloc_off)(gd, gd->relocaddr);
> +
> + ? ? ? /* NOTREACHED - board_init_r() does not return */
> + ? ? ? while (1)
> + ? ? ? ? ? ? ? ;
> +}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 17/17] x86: Convert board_init_f_r to a processing loop
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 17/17] x86: Convert board_init_f_r to a processing loop Graeme Russ
@ 2012-01-07 22:21       ` Simon Glass
  2012-01-08  9:10         ` Graeme Russ
  2012-01-12  5:04       ` Simon Glass
  1 sibling, 1 reply; 87+ messages in thread
From: Simon Glass @ 2012-01-07 22:21 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Create an init function array for board_init_f_r - This finalises the
> migration to a purely array based initialisation mechanism
>
> Also tweak a few comments while we are at it so everything is 'correct'
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

I have been through this series again and it looks good to me. I don't
suppose an Acked-by from me is much use since you are the x86
maintainer and I admit to no knowledge of the subject, but let me know
if so.

There may be some conflict between your series and the generic board
one that I just sent out yesterday but I have not tried it. But now
that series is opt-in on a board-by-board basis, we might be ok, and
in any case x86 can just opt out until everything works.

Regards,
Simon

> ---
> Changes for v2:
> ?- Renamed to a more apt name
> ?- Fix bug in set_reloc_flag_r
> ?- Re-instate gd->flags = boot_flags; in board_init_f
> ?- Added commit message
>
> ?arch/x86/include/asm/init_helpers.h | ? ?5 +
> ?arch/x86/include/asm/relocate.h ? ? | ? 33 ++++++
> ?arch/x86/lib/board.c ? ? ? ? ? ? ? ?| ?186 +++++++++++++++++------------------
> ?arch/x86/lib/init_helpers.c ? ? ? ? | ? 75 ++++++++++++++
> ?arch/x86/lib/relocate.c ? ? ? ? ? ? | ? 32 +-----
> ?5 files changed, 206 insertions(+), 125 deletions(-)
> ?create mode 100644 arch/x86/include/asm/relocate.h
>
> diff --git a/arch/x86/include/asm/init_helpers.h b/arch/x86/include/asm/init_helpers.h
> index 14ef11a..192f18e 100644
> --- a/arch/x86/include/asm/init_helpers.h
> +++ b/arch/x86/include/asm/init_helpers.h
> @@ -27,7 +27,12 @@
> ?int display_banner(void);
> ?int display_dram_config(void);
> ?int init_baudrate_f(void);
> +int calculate_relocation_address(void);
>
> +int copy_gd_to_ram_f_r(void);
> +int init_cache_f_r(void);
> +
> +int set_reloc_flag_r(void);
> ?int mem_malloc_init_r(void);
> ?int init_bd_struct_r(void);
> ?int flash_init_r(void);
> diff --git a/arch/x86/include/asm/relocate.h b/arch/x86/include/asm/relocate.h
> new file mode 100644
> index 0000000..33129ef
> --- /dev/null
> +++ b/arch/x86/include/asm/relocate.h
> @@ -0,0 +1,33 @@
> +/*
> + * (C) Copyright 2011
> + * Graeme Russ, <graeme.russ@gmail.com>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ?See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#ifndef _RELOCATE_H_
> +#define _RELOCATE_H_
> +
> +#include <common.h>
> +
> +int copy_uboot_to_ram(void);
> +int clear_bss(void);
> +int do_elf_reloc_fixups(void);
> +
> +#endif /* !_RELOCATE_H_ */
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index 89721c7..5f0b62c 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -35,7 +35,7 @@
> ?#include <watchdog.h>
> ?#include <stdio_dev.h>
> ?#include <asm/u-boot-x86.h>
> -#include <asm/processor.h>
> +#include <asm/relocate.h>
>
> ?#include <asm/init_helpers.h>
> ?#include <asm/init_wrappers.h>
> @@ -43,31 +43,58 @@
> ?/*
> ?* Breath some life into the board...
> ?*
> - * Initialize an SMC for serial comms, and carry out some hardware
> - * tests.
> + * Getting the board up and running is a three-stage process:
> + * ?1) Execute from Flash, SDRAM Uninitialised
> + * ? ? At this point, there is a limited amount of non-SDRAM memory
> + * ? ? (typically the CPU cache, but can also be SRAM or even a buffer of
> + * ? ? of some peripheral). This limited memory is used to hold:
> + * ? ? ?- The initial copy of the Global Data Structure
> + * ? ? ?- A temporary stack
> + * ? ? ?- A temporary x86 Global Descriptor Table
> + * ? ? ?- The pre-console buffer (if enabled)
> ?*
> - * The first part of initialization is running from Flash memory;
> - * its main purpose is to initialize the RAM so that we
> - * can relocate the monitor code to RAM.
> + * ? ? The following is performed during this phase of execution:
> + * ? ? ?- Core low-level CPU initialisation
> + * ? ? ?- Console initialisation
> + * ? ? ?- SDRAM initialisation
> + *
> + * ?2) Execute from Flash, SDRAM Initialised
> + * ? ? At this point we copy Global Data from the initial non-SDRAM
> + * ? ? memory and set up the permanent stack in SDRAM. The CPU cache is no
> + * ? ? longer being used as temporary memory, so we can now fully enable
> + * ? ? it.
> + *
> + * ? ? The following is performed during this phase of execution:
> + * ? ? ?- Create final stack in SDRAM
> + * ? ? ?- Copy Global Data from temporary memory to SDRAM
> + * ? ? ?- Enabling of CPU cache(s),
> + * ? ? ?- Copying of U-Boot code and data from Flash to RAM
> + * ? ? ?- Clearing of the BSS
> + * ? ? ?- ELF relocation adjustments
> + *
> + * ?3) Execute from SDRAM
> + * ? ? The following is performed during this phase of execution:
> + * ? ? ?- All remaining initialisation
> ?*/
>
> ?/*
> - * All attempts to come up with a "common" initialization sequence
> - * that works for all boards and architectures failed: some of the
> - * requirements are just _too_ different. To get rid of the resulting
> - * mess of board dependend #ifdef'ed code we now make the whole
> - * initialization sequence configurable to the user.
> - *
> - * The requirements for any new initalization function is simple: it
> - * receives a pointer to the "global data" structure as it's only
> - * argument, and returns an integer return code, where 0 means
> - * "continue" and != 0 means "fatal error, hang the system".
> + * The requirements for any new initalization function is simple: it is
> + * a function with no parameters which returns an integer return code,
> + * where 0 means "continue" and != 0 means "fatal error, hang the system"
> ?*/
> ?typedef int (init_fnc_t) (void);
>
> -static int calculate_relocation_address(void);
> -static int copy_gd_to_ram(void);
> -
> +/*
> + * init_sequence_f is the list of init functions which are run when U-Boot
> + * is executing from Flash with a limited 'C' environment. The following
> + * limitations must be considered when implementing an '_f' function:
> + * ?- 'static' variables are read-only
> + * ?- Global Data (gd->xxx) is read/write
> + * ?- Stack space is limited
> + *
> + * The '_f' sequence must, as a minimum, initialise SDRAM. It _should_
> + * also initialise the console (to provide early debug output)
> + */
> ?init_fnc_t *init_sequence_f[] = {
> ? ? ? ?cpu_init_f,
> ? ? ? ?board_early_init_f,
> @@ -81,7 +108,39 @@ init_fnc_t *init_sequence_f[] = {
> ? ? ? ?NULL,
> ?};
>
> +/*
> + * init_sequence_f_r is the list of init functions which are run when
> + * U-Boot is executing from Flash with a semi-limited 'C' environment.
> + * The following limitations must be considered when implementing an
> + * '_f_r' function:
> + * ?- 'static' variables are read-only
> + * ?- Global Data (gd->xxx) is read/write
> + *
> + * The '_f_r' sequence must, as a minimum, copy U-Boot to RAM (if
> + * supported). ?It _should_, if possible, copy global data to RAM and
> + * initialise the CPU caches (to speed up the relocation process)
> + */
> +init_fnc_t *init_sequence_f_r[] = {
> + ? ? ? copy_gd_to_ram_f_r,
> + ? ? ? init_cache_f_r,
> + ? ? ? copy_uboot_to_ram,
> + ? ? ? clear_bss,
> + ? ? ? do_elf_reloc_fixups,
> +
> + ? ? ? NULL,
> +};
> +
> +/*
> + * init_sequence_r is the list of init functions which are run when U-Boot
> + * is executing from RAM with a full 'C' environment. There are no longer
> + * any limitations which must be considered when implementing an '_r'
> + * function, (i.e.'static' variables are read/write)
> + *
> + * If not already done, the '_r' sequence must copy global data to RAM and
> + * (should) initialise the CPU caches.
> + */
> ?init_fnc_t *init_sequence_r[] = {
> + ? ? ? set_reloc_flag_r,
> ? ? ? ?init_bd_struct_r,
> ? ? ? ?mem_malloc_init_r,
> ? ? ? ?cpu_init_r,
> @@ -157,43 +216,6 @@ static void do_init_loop(init_fnc_t **init_fnc_ptr)
> ? ? ? ?}
> ?}
>
> -static int calculate_relocation_address(void)
> -{
> - ? ? ? ulong text_start = (ulong)&__text_start;
> - ? ? ? ulong bss_end = (ulong)&__bss_end;
> - ? ? ? ulong dest_addr;
> -
> - ? ? ? /*
> - ? ? ? ?* NOTE: All destination address are rounded down to 16-byte
> - ? ? ? ?* ? ? ? boundary to satisfy various worst-case alignment
> - ? ? ? ?* ? ? ? requirements
> - ? ? ? ?*/
> -
> - ? ? ? /* Global Data is at top of available memory */
> - ? ? ? dest_addr = gd->ram_size;
> - ? ? ? dest_addr -= GENERATED_GBL_DATA_SIZE;
> - ? ? ? dest_addr &= ~15;
> - ? ? ? gd->new_gd_addr = dest_addr;
> -
> - ? ? ? /* GDT is below Global Data */
> - ? ? ? dest_addr -= X86_GDT_SIZE;
> - ? ? ? dest_addr &= ~15;
> - ? ? ? gd->gdt_addr = dest_addr;
> -
> - ? ? ? /* Stack is below GDT */
> - ? ? ? gd->start_addr_sp = dest_addr;
> -
> - ? ? ? /* U-Boot is below the stack */
> - ? ? ? dest_addr -= CONFIG_SYS_STACK_SIZE;
> - ? ? ? dest_addr -= (bss_end - text_start);
> - ? ? ? dest_addr &= ~15;
> - ? ? ? gd->relocaddr = dest_addr;
> - ? ? ? gd->reloc_off = (dest_addr - text_start);
> -
> - ? ? ? return 0;
> -}
> -
> -/* Perform all steps necessary to get RAM initialised ready for relocation */
> ?void board_init_f(ulong boot_flags)
> ?{
> ? ? ? ?gd->flags = boot_flags;
> @@ -201,10 +223,9 @@ void board_init_f(ulong boot_flags)
> ? ? ? ?do_init_loop(init_sequence_f);
>
> ? ? ? ?/*
> - ? ? ? ?* SDRAM is now initialised, U-Boot has been copied into SDRAM,
> - ? ? ? ?* the BSS has been cleared etc. The final stack can now be setup
> - ? ? ? ?* in SDRAM. Code execution will continue (momentarily) in Flash,
> - ? ? ? ?* but with the stack in SDRAM and Global Data in temporary memory
> + ? ? ? ?* SDRAM and console are now initialised. The final stack can now
> + ? ? ? ?* be setup in SDRAM. Code execution will continue in Flash, but
> + ? ? ? ?* with the stack in SDRAM and Global Data in temporary memory
> ? ? ? ? * (CPU cache)
> ? ? ? ? */
> ? ? ? ?board_init_f_r_trampoline(gd->start_addr_sp);
> @@ -216,51 +237,22 @@ void board_init_f(ulong boot_flags)
>
> ?void board_init_f_r(void)
> ?{
> - ? ? ? if (copy_gd_to_ram() != 0)
> - ? ? ? ? ? ? ? hang();
> -
> - ? ? ? if (init_cache() != 0)
> - ? ? ? ? ? ? ? hang();
> -
> - ? ? ? relocate_code(0, gd, 0);
> -
> - ? ? ? /* NOTREACHED - relocate_code() does not return */
> - ? ? ? while (1)
> - ? ? ? ? ? ? ? ;
> -}
> -
> -static int copy_gd_to_ram(void)
> -{
> - ? ? ? gd_t *ram_gd;
> + ? ? ? do_init_loop(init_sequence_f_r);
>
> ? ? ? ?/*
> - ? ? ? ?* Global data is still in temporary memory (the CPU cache).
> - ? ? ? ?* calculate_relocation_address() has set gd->new_gd_addr to
> - ? ? ? ?* where the global data lives in RAM but getting it there
> - ? ? ? ?* safely is a bit tricky due to the 'F-Segment Hack' that
> - ? ? ? ?* we need to use for x86
> + ? ? ? ?* U-Boot has been copied into SDRAM, the BSS has been cleared etc.
> + ? ? ? ?* Transfer execution from Flash to RAM by calculating the address
> + ? ? ? ?* of the in-RAM copy of board_init_r() and calling it
> ? ? ? ? */
> - ? ? ? ram_gd = (gd_t *)gd->new_gd_addr;
> - ? ? ? memcpy((void *)ram_gd, gd, sizeof(gd_t));
> + ? ? ? (board_init_r + gd->reloc_off)(gd, gd->relocaddr);
>
> - ? ? ? /*
> - ? ? ? ?* Reload the Global Descriptor Table so FS points to the
> - ? ? ? ?* in-RAM copy of Global Data (calculate_relocation_address()
> - ? ? ? ?* has already calculated the in-RAM location of the GDT)
> - ? ? ? ?*/
> - ? ? ? ram_gd->gd_addr = (ulong)ram_gd;
> - ? ? ? init_gd(ram_gd, (u64 *)gd->gdt_addr);
> -
> - ? ? ? return 0;
> + ? ? ? /* NOTREACHED - board_init_r() does not return */
> + ? ? ? while (1)
> + ? ? ? ? ? ? ? ;
> ?}
>
> ?void board_init_r(gd_t *id, ulong dest_addr)
> ?{
> - ? ? ? gd->flags |= GD_FLG_RELOC;
> -
> - ? ? ? /* compiler optimization barrier needed for GCC >= 3.4 */
> - ? ? ? __asm__ __volatile__("" : : : "memory");
> -
> ? ? ? ?do_init_loop(init_sequence_r);
>
> ? ? ? ?/* main_loop() can return to retry autoboot, if so just run it again. */
> diff --git a/arch/x86/lib/init_helpers.c b/arch/x86/lib/init_helpers.c
> index 547b180..9f4dee0 100644
> --- a/arch/x86/lib/init_helpers.c
> +++ b/arch/x86/lib/init_helpers.c
> @@ -29,6 +29,7 @@
> ?#include <ide.h>
> ?#include <serial.h>
> ?#include <status_led.h>
> +#include <asm/processor.h>
> ?#include <asm/u-boot-x86.h>
>
> ?#include <asm/init_helpers.h>
> @@ -70,6 +71,80 @@ int init_baudrate_f(void)
> ? ? ? ?return 0;
> ?}
>
> +int calculate_relocation_address(void)
> +{
> + ? ? ? ulong text_start = (ulong)&__text_start;
> + ? ? ? ulong bss_end = (ulong)&__bss_end;
> + ? ? ? ulong dest_addr;
> +
> + ? ? ? /*
> + ? ? ? ?* NOTE: All destination address are rounded down to 16-byte
> + ? ? ? ?* ? ? ? boundary to satisfy various worst-case alignment
> + ? ? ? ?* ? ? ? requirements
> + ? ? ? ?*/
> +
> + ? ? ? /* Global Data is at top of available memory */
> + ? ? ? dest_addr = gd->ram_size;
> + ? ? ? dest_addr -= GENERATED_GBL_DATA_SIZE;
> + ? ? ? dest_addr &= ~15;
> + ? ? ? gd->new_gd_addr = dest_addr;
> +
> + ? ? ? /* GDT is below Global Data */
> + ? ? ? dest_addr -= X86_GDT_SIZE;
> + ? ? ? dest_addr &= ~15;
> + ? ? ? gd->gdt_addr = dest_addr;
> +
> + ? ? ? /* Stack is below GDT */
> + ? ? ? gd->start_addr_sp = dest_addr;
> +
> + ? ? ? /* U-Boot is below the stack */
> + ? ? ? dest_addr -= CONFIG_SYS_STACK_SIZE;
> + ? ? ? dest_addr -= (bss_end - text_start);
> + ? ? ? dest_addr &= ~15;
> + ? ? ? gd->relocaddr = dest_addr;
> + ? ? ? gd->reloc_off = (dest_addr - text_start);
> +
> + ? ? ? return 0;
> +}
> +
> +int copy_gd_to_ram_f_r(void)
> +{
> + ? ? ? gd_t *ram_gd;
> +
> + ? ? ? /*
> + ? ? ? ?* Global data is still in temporary memory (the CPU cache).
> + ? ? ? ?* calculate_relocation_address() has set gd->new_gd_addr to
> + ? ? ? ?* where the global data lives in RAM but getting it there
> + ? ? ? ?* safely is a bit tricky due to the 'F-Segment Hack' that
> + ? ? ? ?* we need to use for x86
> + ? ? ? ?*/
> + ? ? ? ram_gd = (gd_t *)gd->new_gd_addr;
> + ? ? ? memcpy((void *)ram_gd, gd, sizeof(gd_t));
> +
> + ? ? ? /*
> + ? ? ? ?* Reload the Global Descriptor Table so FS points to the
> + ? ? ? ?* in-RAM copy of Global Data (calculate_relocation_address()
> + ? ? ? ?* has already calculated the in-RAM location of the GDT)
> + ? ? ? ?*/
> + ? ? ? ram_gd->gd_addr = (ulong)ram_gd;
> + ? ? ? init_gd(ram_gd, (u64 *)gd->gdt_addr);
> +
> + ? ? ? return 0;
> +}
> +
> +int init_cache_f_r(void)
> +{
> + ? ? ? /* Initialise the CPU cache(s) */
> + ? ? ? return init_cache();
> +}
> +
> +int set_reloc_flag_r(void)
> +{
> + ? ? ? gd->flags = GD_FLG_RELOC;
> +
> + ? ? ? return 0;
> +}
> +
> ?int mem_malloc_init_r(void)
> ?{
> ? ? ? ?mem_malloc_init(((gd->relocaddr - CONFIG_SYS_MALLOC_LEN)+3)&~3,
> diff --git a/arch/x86/lib/relocate.c b/arch/x86/lib/relocate.c
> index badb5f8..200baab 100644
> --- a/arch/x86/lib/relocate.c
> +++ b/arch/x86/lib/relocate.c
> @@ -34,13 +34,10 @@
> ?#include <common.h>
> ?#include <malloc.h>
> ?#include <asm/u-boot-x86.h>
> +#include <asm/relocate.h>
> ?#include <elf.h>
>
> -static int copy_uboot_to_ram(void);
> -static int clear_bss(void);
> -static int do_elf_reloc_fixups(void);
> -
> -static int copy_uboot_to_ram(void)
> +int copy_uboot_to_ram(void)
> ?{
> ? ? ? ?size_t len = (size_t)&__data_end - (size_t)&__text_start;
>
> @@ -49,7 +46,7 @@ static int copy_uboot_to_ram(void)
> ? ? ? ?return 0;
> ?}
>
> -static int clear_bss(void)
> +int clear_bss(void)
> ?{
> ? ? ? ?ulong dst_addr = (ulong)&__bss_start + gd->reloc_off;
> ? ? ? ?size_t len = (size_t)&__bss_end - (size_t)&__bss_start;
> @@ -59,7 +56,7 @@ static int clear_bss(void)
> ? ? ? ?return 0;
> ?}
>
> -static int do_elf_reloc_fixups(void)
> +int do_elf_reloc_fixups(void)
> ?{
> ? ? ? ?Elf32_Rel *re_src = (Elf32_Rel *)(&__rel_dyn_start);
> ? ? ? ?Elf32_Rel *re_end = (Elf32_Rel *)(&__rel_dyn_end);
> @@ -92,24 +89,3 @@ static int do_elf_reloc_fixups(void)
>
> ? ? ? ?return 0;
> ?}
> -
> -void relocate_code(ulong dummy_1, gd_t *id, ulong dummy_2)
> -{
> - ? ? ? /*
> - ? ? ? ?* Copy U-Boot into RAM, clear the BSS and perform relocation
> - ? ? ? ?* adjustments
> - ? ? ? ?*/
> - ? ? ? copy_uboot_to_ram();
> - ? ? ? clear_bss();
> - ? ? ? do_elf_reloc_fixups();
> -
> - ? ? ? /*
> - ? ? ? ?* Transfer execution from Flash to RAM by calculating the address
> - ? ? ? ?* of the in-RAM copy of board_init_r() and calling it
> - ? ? ? ?*/
> - ? ? ? (board_init_r + gd->reloc_off)(gd, gd->relocaddr);
> -
> - ? ? ? /* NOTREACHED - board_init_r() does not return */
> - ? ? ? while (1)
> - ? ? ? ? ? ? ? ;
> -}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 15/17] x86: Move relocation code out of board.c
  2012-01-07 22:15       ` Simon Glass
@ 2012-01-08  9:04         ` Graeme Russ
  2012-01-08 17:59           ` Simon Glass
  0 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-08  9:04 UTC (permalink / raw)
  To: u-boot

Hi Simon,

On 08/01/12 09:15, Simon Glass wrote:
> Hi Graeme,
> 
> On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
>> ---
>> Changes for v2:
>>  - None
>>
>>  arch/x86/lib/Makefile   |    1 +
>>  arch/x86/lib/board.c    |   69 +---------------------------
>>  arch/x86/lib/relocate.c |  115 +++++++++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 118 insertions(+), 67 deletions(-)
>>  create mode 100644 arch/x86/lib/relocate.c
> 
> Sorry - these comments are for future reference, since all you are
> doing here is moving code. But I might as well send them here.

Yes, your comments are good for future reference when the relocation code
becomes common

[snip]

>> -               /* Check that the location of the relocation is in .text */
>> -               if (offset_ptr_rom >= (Elf32_Addr *)CONFIG_SYS_TEXT_BASE) {
> 
> perhaps:
> 
> if (re_src->r_offset >= CONFIG_SYS_TEXT_BASE) {

Yep

> 
>> -
>> -                       /* Switch to the in-RAM version */
>> -                       offset_ptr_ram = (Elf32_Addr *)((ulong)offset_ptr_rom +
>> -                                                       gd->reloc_off);
>> -
>> -                       /* Check that the target points into .text */
>> -                       if (*offset_ptr_ram >= CONFIG_SYS_TEXT_BASE &&
>> -                                       *offset_ptr_ram <
>> -                                       (CONFIG_SYS_TEXT_BASE + size)) {
>> -                               *offset_ptr_ram += gd->reloc_off;
> 
> Can the target not pointer into data? I think you are allowing this
> anyway with your test, but are you sure this comment is right?

You are correct, target is not necessarily .text

> 
>> -                       }
>> -               }
>> -       } while (re_src++ < re_end);
> 
> Should this while() condition go at the top? What if the table has no entries?

An absurdly unlikely scenario, but worth changing for strict correctness

Regards,

Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 17/17] x86: Convert board_init_f_r to a processing loop
  2012-01-07 22:21       ` Simon Glass
@ 2012-01-08  9:10         ` Graeme Russ
  2012-01-08 18:01           ` Simon Glass
  0 siblings, 1 reply; 87+ messages in thread
From: Graeme Russ @ 2012-01-08  9:10 UTC (permalink / raw)
  To: u-boot

On 08/01/12 09:21, Simon Glass wrote:
> Hi Graeme,
> 
> On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
>> Create an init function array for board_init_f_r - This finalises the
>> migration to a purely array based initialisation mechanism
>>
>> Also tweak a few comments while we are at it so everything is 'correct'
>>
>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> 
> I have been through this series again and it looks good to me. I don't
> suppose an Acked-by from me is much use since you are the x86
> maintainer and I admit to no knowledge of the subject, but let me know
> if so.

Being a maintainer does not mean I'm infallible ;) - A formal Acked-by
would be appreciated

> There may be some conflict between your series and the generic board
> one that I just sent out yesterday but I have not tried it. But now
> that series is opt-in on a board-by-board basis, we might be ok, and
> in any case x86 can just opt out until everything works.

Plus this series is not RFC and pending no objections (particularly from
Wolfgang) I plan to put it in x86/master 'very soon (tm)' and send a pull
request.

Regards,

Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 15/17] x86: Move relocation code out of board.c
  2012-01-08  9:04         ` Graeme Russ
@ 2012-01-08 17:59           ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-08 17:59 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 8, 2012 at 1:04 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Hi Simon,
>
> On 08/01/12 09:15, Simon Glass wrote:
>> Hi Graeme,
>>
>> On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
>>> ---
>>> Changes for v2:
>>> ?- None
>>>
>>> ?arch/x86/lib/Makefile ? | ? ?1 +
>>> ?arch/x86/lib/board.c ? ?| ? 69 +---------------------------
>>> ?arch/x86/lib/relocate.c | ?115 +++++++++++++++++++++++++++++++++++++++++++++++
>>> ?3 files changed, 118 insertions(+), 67 deletions(-)
>>> ?create mode 100644 arch/x86/lib/relocate.c
>>
>> Sorry - these comments are for future reference, since all you are
>> doing here is moving code. But I might as well send them here.
>
> Yes, your comments are good for future reference when the relocation code
> becomes common
>
> [snip]
>
>>> - ? ? ? ? ? ? ? /* Check that the location of the relocation is in .text */
>>> - ? ? ? ? ? ? ? if (offset_ptr_rom >= (Elf32_Addr *)CONFIG_SYS_TEXT_BASE) {
>>
>> perhaps:
>>
>> if (re_src->r_offset >= CONFIG_SYS_TEXT_BASE) {
>
> Yep
>
>>
>>> -
>>> - ? ? ? ? ? ? ? ? ? ? ? /* Switch to the in-RAM version */
>>> - ? ? ? ? ? ? ? ? ? ? ? offset_ptr_ram = (Elf32_Addr *)((ulong)offset_ptr_rom +
>>> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gd->reloc_off);
>>> -
>>> - ? ? ? ? ? ? ? ? ? ? ? /* Check that the target points into .text */
>>> - ? ? ? ? ? ? ? ? ? ? ? if (*offset_ptr_ram >= CONFIG_SYS_TEXT_BASE &&
>>> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *offset_ptr_ram <
>>> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (CONFIG_SYS_TEXT_BASE + size)) {
>>> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *offset_ptr_ram += gd->reloc_off;
>>
>> Can the target not pointer into data? I think you are allowing this
>> anyway with your test, but are you sure this comment is right?
>
> You are correct, target is not necessarily .text
>
>>
>>> - ? ? ? ? ? ? ? ? ? ? ? }
>>> - ? ? ? ? ? ? ? }
>>> - ? ? ? } while (re_src++ < re_end);
>>
>> Should this while() condition go at the top? What if the table has no entries?
>
> An absurdly unlikely scenario, but worth changing for strict correctness

Hoping we can one day support relocating to an address known at link time...

Regards,
Simon

>
> Regards,
>
> Graeme

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 17/17] x86: Convert board_init_f_r to a processing loop
  2012-01-08  9:10         ` Graeme Russ
@ 2012-01-08 18:01           ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-08 18:01 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Sun, Jan 8, 2012 at 1:10 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> On 08/01/12 09:21, Simon Glass wrote:
>> Hi Graeme,
>>
>> On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
>>> Create an init function array for board_init_f_r - This finalises the
>>> migration to a purely array based initialisation mechanism
>>>
>>> Also tweak a few comments while we are at it so everything is 'correct'
>>>
>>> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
>>
>> I have been through this series again and it looks good to me. I don't
>> suppose an Acked-by from me is much use since you are the x86
>> maintainer and I admit to no knowledge of the subject, but let me know
>> if so.
>
> Being a maintainer does not mean I'm infallible ;) - A formal Acked-by
> would be appreciated

OK will do.

>
>> There may be some conflict between your series and the generic board
>> one that I just sent out yesterday but I have not tried it. But now
>> that series is opt-in on a board-by-board basis, we might be ok, and
>> in any case x86 can just opt out until everything works.
>
> Plus this series is not RFC and pending no objections (particularly from
> Wolfgang) I plan to put it in x86/master 'very soon (tm)' and send a pull
> request.

OK

Regards,
Simon

>
> Regards,
>
> Graeme
>

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 01/17] x86: Import glibc memcpy implementation
  2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
                       ` (15 preceding siblings ...)
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 17/17] x86: Convert board_init_f_r to a processing loop Graeme Russ
@ 2012-01-12  4:44     ` Simon Glass
  16 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  4:44 UTC (permalink / raw)
  To: u-boot

Hi,

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Taken from glibc version 2.14.90
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> Changes for v2:
> ?- None

It feels a bit odd acking x86 patches but I have been through these
and much of the series is generally useful for other archs...

Acked-by: Simon Glass <sjg@chromium.org>

>
> ?arch/x86/include/asm/string.h | ? ?2 +-
> ?arch/x86/lib/string.c ? ? ? ? | ? 61 +++++++++++++++++++++++++++++++++++++++++
> ?2 files changed, 62 insertions(+), 1 deletions(-)
>
> diff --git a/arch/x86/include/asm/string.h b/arch/x86/include/asm/string.h
> index 3aa6c11..0ad612f 100644
> --- a/arch/x86/include/asm/string.h
> +++ b/arch/x86/include/asm/string.h
> @@ -14,7 +14,7 @@ extern char * strrchr(const char * s, int c);
> ?#undef __HAVE_ARCH_STRCHR
> ?extern char * strchr(const char * s, int c);
>
> -#undef __HAVE_ARCH_MEMCPY
> +#define __HAVE_ARCH_MEMCPY
> ?extern void * memcpy(void *, const void *, __kernel_size_t);
>
> ?#undef __HAVE_ARCH_MEMMOVE
> diff --git a/arch/x86/lib/string.c b/arch/x86/lib/string.c
> index f2ea7e4..1fde81b 100644
> --- a/arch/x86/lib/string.c
> +++ b/arch/x86/lib/string.c
> @@ -85,3 +85,64 @@ void *memset(void *dstpp, int c, size_t len)
>
> ? ? ? ?return dstpp;
> ?}
> +
> +#define ? ? ? ?OP_T_THRES ? ? ?8
> +#define OPSIZ ?(sizeof(op_t))
> +
> +#define BYTE_COPY_FWD(dst_bp, src_bp, nbytes) ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> +do { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? int __d0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? asm volatile( ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? /* Clear the direction flag, so copying goes forward. ?*/ \
> + ? ? ? ? ? ? ? "cld\n" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? /* Copy bytes. ?*/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? ? ? ? ? "rep\n" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? "movsb" : ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? "=D" (dst_bp), "=S" (src_bp), "=c" (__d0) : ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? "0" (dst_bp), "1" (src_bp), "2" (nbytes) : ? ? ? ? ? ? ? ?\
> + ? ? ? ? ? ? ? "memory"); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> +} while (0)
> +
> +#define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes) ? ? ? ? ? ? ? \
> +do { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? int __d0; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? asm volatile( ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? /* Clear the direction flag, so copying goes forward. ?*/ \
> + ? ? ? ? ? ? ? "cld\n" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? /* Copy longwords. ?*/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? ? ? ? ? "rep\n" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? "movsl" : ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? "=D" (dst_bp), "=S" (src_bp), "=c" (__d0) : ? ? ? ? ? ? ? \
> + ? ? ? ? ? ? ? "0" (dst_bp), "1" (src_bp), "2" ((nbytes) / 4) : ? ? ? ? ?\
> + ? ? ? ? ? ? ? "memory"); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
> + ? ? ? (nbytes_left) = (nbytes) % 4; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
> +} while (0)
> +
> +void *memcpy(void *dstpp, const void *srcpp, size_t len)
> +{
> + ? ? ? unsigned long int dstp = (long int)dstpp;
> + ? ? ? unsigned long int srcp = (long int)srcpp;
> +
> + ? ? ? /* Copy from the beginning to the end. ?*/
> +
> + ? ? ? /* If there not too few bytes to copy, use word copy. ?*/
> + ? ? ? if (len >= OP_T_THRES) {
> + ? ? ? ? ? ? ? /* Copy just a few bytes to make DSTP aligned. ?*/
> + ? ? ? ? ? ? ? len -= (-dstp) % OPSIZ;
> + ? ? ? ? ? ? ? BYTE_COPY_FWD(dstp, srcp, (-dstp) % OPSIZ);
> +
> + ? ? ? ? ? ? ? /* Copy from SRCP to DSTP taking advantage of the known
> + ? ? ? ? ? ? ? ?* alignment of DSTP. ?Number of bytes remaining is put
> + ? ? ? ? ? ? ? ?* in the third argument, i.e. in LEN. ?This number may
> + ? ? ? ? ? ? ? ?* vary from machine to machine.
> + ? ? ? ? ? ? ? ?*/
> + ? ? ? ? ? ? ? WORD_COPY_FWD(dstp, srcp, len, len);
> +
> + ? ? ? ? ? ? ? /* Fall out and copy the tail. ?*/
> + ? ? ? }
> +
> + ? ? ? /* There are just a few bytes to copy. Use byte memory operations. */
> + ? ? ? BYTE_COPY_FWD(dstp, srcp, len);
> +
> + ? ? ? return dstpp;
> +}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 02/17] x86: Speed up copy-to-RAM and clear BSS operations
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 02/17] x86: Speed up copy-to-RAM and clear BSS operations Graeme Russ
  2012-01-04 20:04       ` Graeme Russ
@ 2012-01-12  4:45       ` Simon Glass
  1 sibling, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  4:45 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> The implementations of memcpy and memset are now the optimised versions
> from glibc, so use them instead of simple copy loops
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- Removed unneeded brackets
>
> ?arch/x86/lib/board.c | ? 17 +++++------------
> ?1 files changed, 5 insertions(+), 12 deletions(-)
>
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index d742fec..f9eb15b 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -188,26 +188,19 @@ static int calculate_relocation_address(void)
>
> ?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;
> + ? ? ? size_t len = (size_t)&__data_end - (size_t)&__text_start;
>
> - ? ? ? while (src_addr < end_addr)
> - ? ? ? ? ? ? ? *dst_addr++ = *src_addr++;
> + ? ? ? memcpy((void *)gd->relocaddr, (void *)&__text_start, len);
>
> ? ? ? ?return 0;
> ?}
>
> ?static int clear_bss(void)
> ?{
> - ? ? ? void *bss_start = &__bss_start;
> - ? ? ? void *bss_end = &__bss_end;
> + ? ? ? ulong dst_addr = (ulong)&__bss_start + gd->reloc_off;
> + ? ? ? size_t len = (size_t)&__bss_end - (size_t)&__bss_start;
>
> - ? ? ? ulong *dst_addr = (ulong *)(bss_start + gd->reloc_off);
> - ? ? ? ulong *end_addr = (ulong *)(bss_end + gd->reloc_off);
> -
> - ? ? ? while (dst_addr < end_addr)
> - ? ? ? ? ? ? ? *dst_addr++ = 0x00000000;
> + ? ? ? memset((void *)dst_addr, 0x00, len);
>
> ? ? ? ?return 0;
> ?}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 03/17] x86: Remove GDR related magic numbers
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 03/17] x86: Remove GDR related magic numbers Graeme Russ
  2012-01-07 22:05       ` Simon Glass
@ 2012-01-12  4:46       ` Simon Glass
  1 sibling, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  4:46 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- Use an enum
> ?- Add defined for GDT size (previously added in patch 7)
> ?- Use X86_ namespace (as per Linux headers)
>
> ?arch/x86/cpu/cpu.c ? ? ? ? ? ? ? | ? ?8 ++++----
> ?arch/x86/cpu/start.S ? ? ? ? ? ? | ? ?3 ++-
> ?arch/x86/include/asm/processor.h | ? 23 +++++++++++++++++++----
> ?3 files changed, 25 insertions(+), 9 deletions(-)
>
> diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
> index 61d0b69..209ff29 100644
> --- a/arch/x86/cpu/cpu.c
> +++ b/arch/x86/cpu/cpu.c
> @@ -63,13 +63,13 @@ static void reload_gdt(void)
> ? ? ? ? */
> ? ? ? ?static const u64 boot_gdt[] __attribute__((aligned(16))) = {
> ? ? ? ? ? ? ? ?/* CS: code, read/execute, 4 GB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
> + ? ? ? ? ? ? ? [X86_GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
> ? ? ? ? ? ? ? ?/* DS: data, read/write, 4 GB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
> + ? ? ? ? ? ? ? [X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
> ? ? ? ? ? ? ? ?/* 16-bit CS: code, read/execute, 64 kB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
> + ? ? ? ? ? ? ? [X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
> ? ? ? ? ? ? ? ?/* 16-bit DS: data, read/write, 64 kB, base 0 */
> - ? ? ? ? ? ? ? [GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
> + ? ? ? ? ? ? ? [X86_GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
> ? ? ? ?};
> ? ? ? ?static struct gdt_ptr gdt;
>
> diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
> index f87633b..6027f54 100644
> --- a/arch/x86/cpu/start.S
> +++ b/arch/x86/cpu/start.S
> @@ -29,6 +29,7 @@
> ?#include <config.h>
> ?#include <version.h>
> ?#include <asm/global_data.h>
> +#include <asm/processor.h>
> ?#include <asm/processor-flags.h>
> ?#include <generated/asm-offsets.h>
>
> @@ -58,7 +59,7 @@ _start:
> ? ? ? ?/* This is the 32-bit cold-reset entry point */
>
> ? ? ? ?/* Load the segement registes to match the gdt loaded in start16.S */
> - ? ? ? movl ? ?$0x18, %eax
> + ? ? ? movl ? ?$(X86_GDT_ENTRY_32BIT_DS * X86_GDT_ENTRY_SIZE), %eax
> ? ? ? ?movw ? ?%ax, %fs
> ? ? ? ?movw ? ?%ax, %ds
> ? ? ? ?movw ? ?%ax, %gs
> diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
> index 1e5dccd..aa8188e 100644
> --- a/arch/x86/include/asm/processor.h
> +++ b/arch/x86/include/asm/processor.h
> @@ -24,9 +24,24 @@
> ?#ifndef __ASM_PROCESSOR_H_
> ?#define __ASM_PROCESSOR_H_ 1
>
> -#define GDT_ENTRY_32BIT_CS ? ? 2
> -#define GDT_ENTRY_32BIT_DS ? ? (GDT_ENTRY_32BIT_CS + 1)
> -#define GDT_ENTRY_16BIT_CS ? ? (GDT_ENTRY_32BIT_DS + 1)
> -#define GDT_ENTRY_16BIT_DS ? ? (GDT_ENTRY_16BIT_CS + 1)
> +#define X86_GDT_ENTRY_SIZE ? ? 8
> +
> +#ifndef __ASSEMBLY__
> +
> +enum {
> + ? ? ? X86_GDT_ENTRY_NULL = 0,
> + ? ? ? X86_GDT_ENTRY_UNUSED,
> + ? ? ? X86_GDT_ENTRY_32BIT_CS,
> + ? ? ? X86_GDT_ENTRY_32BIT_DS,
> + ? ? ? X86_GDT_ENTRY_16BIT_CS,
> + ? ? ? X86_GDT_ENTRY_16BIT_DS,
> + ? ? ? X86_GDT_NUM_ENTRIES
> +};
> +#else
> +/* NOTE: If the above enum is modified, this define must be checked */
> +#define X86_GDT_ENTRY_32BIT_DS 3
> +#endif
> +
> +#define X86_GDT_SIZE ? ? ? ? ? (X86_GDT_NUM_ENTRIES * X86_GDT_ENTRY_SIZE)
>
> ?#endif
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 04/17] x86: Rework Global Descriptor Table loading
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 04/17] x86: Rework Global Descriptor Table loading Graeme Russ
@ 2012-01-12  4:47       ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  4:47 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> The inline assembler is ugly and uses hard coded magic numbers. Make it more
> elegant to allow cleaner implementation of future GDT related patches. The
> compiler seems smart enough to generate the same code anyway
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- Rebased against revised patch #3
> ?- Use GDT size define instead of magic number
> ?- Added commit message
>
> ?arch/x86/cpu/cpu.c | ? 82 +++++++++++++++++++++++++++++++++------------------
> ?1 files changed, 53 insertions(+), 29 deletions(-)
>
> diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
> index 209ff29..8102fb9 100644
> --- a/arch/x86/cpu/cpu.c
> +++ b/arch/x86/cpu/cpu.c
> @@ -55,35 +55,39 @@ struct gdt_ptr {
> ? ? ? ?u32 ptr;
> ?} __packed;
>
> -static void reload_gdt(void)
> +static void load_ds(u32 segment)
> ?{
> - ? ? ? /*
> - ? ? ? ?* There are machines which are known to not boot with the GDT
> - ? ? ? ?* being 8-byte unaligned. ?Intel recommends 16 byte alignment
> - ? ? ? ?*/
> - ? ? ? static const u64 boot_gdt[] __attribute__((aligned(16))) = {
> - ? ? ? ? ? ? ? /* CS: code, read/execute, 4 GB, base 0 */
> - ? ? ? ? ? ? ? [X86_GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
> - ? ? ? ? ? ? ? /* DS: data, read/write, 4 GB, base 0 */
> - ? ? ? ? ? ? ? [X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
> - ? ? ? ? ? ? ? /* 16-bit CS: code, read/execute, 64 kB, base 0 */
> - ? ? ? ? ? ? ? [X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
> - ? ? ? ? ? ? ? /* 16-bit DS: data, read/write, 64 kB, base 0 */
> - ? ? ? ? ? ? ? [X86_GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
> - ? ? ? };
> - ? ? ? static struct gdt_ptr gdt;
> -
> - ? ? ? gdt.len = sizeof(boot_gdt)-1;
> - ? ? ? gdt.ptr = (u32)&boot_gdt;
> -
> - ? ? ? asm volatile("lgdtl %0\n" \
> - ? ? ? ? ? ? ? ? ? ?"movl $((2+1)*8), %%ecx\n" \
> - ? ? ? ? ? ? ? ? ? ?"movl %%ecx, %%ds\n" \
> - ? ? ? ? ? ? ? ? ? ?"movl %%ecx, %%es\n" \
> - ? ? ? ? ? ? ? ? ? ?"movl %%ecx, %%fs\n" \
> - ? ? ? ? ? ? ? ? ? ?"movl %%ecx, %%gs\n" \
> - ? ? ? ? ? ? ? ? ? ?"movl %%ecx, %%ss" \
> - ? ? ? ? ? ? ? ? ? ?: : "m" (gdt) : "ecx");
> + ? ? ? asm volatile("movl %0, %%ds" : : "r" (segment * X86_GDT_ENTRY_SIZE));
> +}
> +
> +static void load_es(u32 segment)
> +{
> + ? ? ? asm volatile("movl %0, %%es" : : "r" (segment * X86_GDT_ENTRY_SIZE));
> +}
> +
> +static void load_fs(u32 segment)
> +{
> + ? ? ? asm volatile("movl %0, %%fs" : : "r" (segment * X86_GDT_ENTRY_SIZE));
> +}
> +
> +static void load_gs(u32 segment)
> +{
> + ? ? ? asm volatile("movl %0, %%gs" : : "r" (segment * X86_GDT_ENTRY_SIZE));
> +}
> +
> +static void load_ss(u32 segment)
> +{
> + ? ? ? asm volatile("movl %0, %%ss" : : "r" (segment * X86_GDT_ENTRY_SIZE));
> +}
> +
> +static void load_gdt(const u64 *boot_gdt, u16 num_entries)
> +{
> + ? ? ? struct gdt_ptr gdt;
> +
> + ? ? ? gdt.len = (num_entries * 8) - 1;
> + ? ? ? gdt.ptr = (u32)boot_gdt;
> +
> + ? ? ? asm volatile("lgdtl %0\n" : : "m" (gdt));
> ?}
>
> ?int x86_cpu_init_f(void)
> @@ -113,7 +117,27 @@ int x86_cpu_init_r(void)
> ? ? ? ? ? ?"movl ? ? ? %%eax, %%cr0\n"
> ? ? ? ? ? ?"wbinvd\n" : : "i" (nw_cd_rst) : "eax");
>
> - ? ? ? reload_gdt();
> + ? ? ? /*
> + ? ? ? ?* There are machines which are known to not boot with the GDT
> + ? ? ? ?* being 8-byte unaligned. Intel recommends 16 byte alignment
> + ? ? ? ?*/
> + ? ? ? static const u64 boot_gdt[] __aligned(16) = {
> + ? ? ? ? ? ? ? /* CS: code, read/execute, 4 GB, base 0 */
> + ? ? ? ? ? ? ? [X86_GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
> + ? ? ? ? ? ? ? /* DS: data, read/write, 4 GB, base 0 */
> + ? ? ? ? ? ? ? [X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
> + ? ? ? ? ? ? ? /* 16-bit CS: code, read/execute, 64 kB, base 0 */
> + ? ? ? ? ? ? ? [X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
> + ? ? ? ? ? ? ? /* 16-bit DS: data, read/write, 64 kB, base 0 */
> + ? ? ? ? ? ? ? [X86_GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
> + ? ? ? };
> +
> + ? ? ? load_gdt(boot_gdt, X86_GDT_NUM_ENTRIES);
> + ? ? ? load_ds(X86_GDT_ENTRY_32BIT_DS);
> + ? ? ? load_es(X86_GDT_ENTRY_32BIT_DS);
> + ? ? ? load_fs(X86_GDT_ENTRY_32BIT_DS);
> + ? ? ? load_gs(X86_GDT_ENTRY_32BIT_DS);
> + ? ? ? load_ss(X86_GDT_ENTRY_32BIT_DS);
>
> ? ? ? ?/* Initialize core interrupt and exception functionality of CPU */
> ? ? ? ?cpu_init_interrupts();
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 05/17] x86: Simplify Flash-to-RAM code execution transition
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 05/17] x86: Simplify Flash-to-RAM code execution transition Graeme Russ
@ 2012-01-12  4:48       ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  4:48 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Move the relocation offset calculation out of assembler and into C. This
> also paves the way for the upcoming init sequence simplification by adding
> the board_init_f_r flash to RAM transitional function
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Still not thrilled with the name but it's not important.

Acked-by: Simon Glass <sjg@chromium.org>

Regards,
Simon

> ---
> Changes for v2:
> ?- Added commit message
> ?- Minor adjustment to new stack address comment
>
> ?arch/x86/cpu/start.S ? ? ? ? ? ? ?| ? 22 ++++++----------------
> ?arch/x86/include/asm/u-boot-x86.h | ? ?2 ++
> ?arch/x86/lib/board.c ? ? ? ? ? ? ?| ? 25 ++++++++++++++++++++++---
> ?3 files changed, 30 insertions(+), 19 deletions(-)
>
> diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
> index 6027f54..69a9b2c 100644
> --- a/arch/x86/cpu/start.S
> +++ b/arch/x86/cpu/start.S
> @@ -96,32 +96,22 @@ car_init_ret:
> ? ? ? ?movw ? ?$0x85, %ax
> ? ? ? ?jmp ? ? die
>
> -.globl relocate_code
> -.type relocate_code, @function
> -relocate_code:
> +.globl board_init_f_r_trampoline
> +.type board_init_f_r_trampoline, @function
> +board_init_f_r_trampoline:
> ? ? ? ?/*
> ? ? ? ? * SDRAM has been initialised, U-Boot code has been copied into
> ? ? ? ? * RAM, BSS has been cleared and relocation adjustments have been
> ? ? ? ? * made. It is now time to jump into the in-RAM copy of U-Boot
> ? ? ? ? *
> - ? ? ? ?* %eax = Address of top of stack
> - ? ? ? ?* %edx = Address of Global Data
> - ? ? ? ?* %ecx = Base address of in-RAM copy of U-Boot
> + ? ? ? ?* %eax = Address of top of new stack
> ? ? ? ? */
>
> ? ? ? ?/* Setup stack in RAM */
> ? ? ? ?movl ? ?%eax, %esp
>
> - ? ? ? /* Setup call address of in-RAM copy of board_init_r() */
> - ? ? ? movl ? ?$board_init_r, %ebp
> - ? ? ? addl ? ?(GENERATED_GD_RELOC_OFF)(%edx), %ebp
> -
> - ? ? ? /* Setup parameters to board_init_r() */
> - ? ? ? movl ? ?%edx, %eax
> - ? ? ? movl ? ?%ecx, %edx
> -
> - ? ? ? /* Jump to in-RAM copy of board_init_r() */
> - ? ? ? call ? ?*%ebp
> + ? ? ? /* Re-enter U-Boot by calling board_init_f_r */
> + ? ? ? call ? ?board_init_f_r
>
> ?die:
> ? ? ? ?hlt
> diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
> index 755f88a..c3d2277 100644
> --- a/arch/x86/include/asm/u-boot-x86.h
> +++ b/arch/x86/include/asm/u-boot-x86.h
> @@ -61,5 +61,7 @@ u32 isa_map_rom(u32 bus_addr, int size);
> ?int video_bios_init(void);
> ?int video_init(void);
>
> +void ? board_init_f_r_trampoline(ulong) __attribute__ ((noreturn));
> +void ? board_init_f_r(void) __attribute__ ((noreturn));
>
> ?#endif /* _U_BOOT_I386_H_ */
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index f9eb15b..382ada7 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -253,10 +253,29 @@ void board_init_f(ulong boot_flags)
>
> ? ? ? ?gd->flags |= GD_FLG_RELOC;
>
> - ? ? ? /* Enter the relocated U-Boot! */
> - ? ? ? relocate_code(gd->start_addr_sp, gd, gd->relocaddr);
> + ? ? ? /*
> + ? ? ? ?* SDRAM is now initialised, U-Boot has been copied into SDRAM,
> + ? ? ? ?* the BSS has been cleared etc. The final stack can now be setup
> + ? ? ? ?* in SDRAM. Code execution will continue (momentarily) in Flash,
> + ? ? ? ?* but with the stack in SDRAM and Global Data in temporary memory
> + ? ? ? ?* (CPU cache)
> + ? ? ? ?*/
> + ? ? ? board_init_f_r_trampoline(gd->start_addr_sp);
> +
> + ? ? ? /* NOTREACHED - board_init_f_r_trampoline() does not return */
> + ? ? ? while (1)
> + ? ? ? ? ? ? ? ;
> +}
> +
> +void board_init_f_r(void)
> +{
> + ? ? ? /*
> + ? ? ? ?* Transfer execution from Flash to RAM by calculating the address
> + ? ? ? ?* of the in-RAM copy of board_init_r() and calling it
> + ? ? ? ?*/
> + ? ? ? (board_init_r + gd->reloc_off)(gd, gd->relocaddr);
>
> - ? ? ? /* NOTREACHED - relocate_code() does not return */
> + ? ? ? /* NOTREACHED - board_init_r() does not return */
> ? ? ? ?while (1)
> ? ? ? ? ? ? ? ?;
> ?}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 06/17] x86: Rework relocation calculations
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 06/17] x86: Rework relocation calculations Graeme Russ
@ 2012-01-12  4:49       ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  4:49 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> This commit introduces no functional changes - It simply re-arranges the
> calculations so that adding to them in future commits will be cleaner
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- Fixed typo in title
> ?- Added commit message
>
> ?arch/x86/lib/board.c | ? 23 +++++++++++------------
> ?1 files changed, 11 insertions(+), 12 deletions(-)
>
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index 382ada7..6f075b7 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -164,24 +164,23 @@ static int calculate_relocation_address(void)
> ? ? ? ?ulong text_start = (ulong)&__text_start;
> ? ? ? ?ulong bss_end = (ulong)&__bss_end;
> ? ? ? ?ulong dest_addr;
> - ? ? ? ulong rel_offset;
> -
> - ? ? ? /* Calculate destination RAM Address and relocation offset */
> - ? ? ? dest_addr = gd->ram_size;
> - ? ? ? dest_addr -= CONFIG_SYS_STACK_SIZE;
> - ? ? ? dest_addr -= (bss_end - text_start);
>
> ? ? ? ?/*
> - ? ? ? ?* Round destination address down to 16-byte boundary to keep
> - ? ? ? ?* IDT and GDT 16-byte aligned
> + ? ? ? ?* NOTE: All destination address are rounded down to 16-byte
> + ? ? ? ?* ? ? ? boundary to satisfy various worst-case alignment
> + ? ? ? ?* ? ? ? requirements
> ? ? ? ? */
> - ? ? ? dest_addr &= ~15;
>
> - ? ? ? rel_offset = dest_addr - text_start;
> + ? ? ? /* Stack is at top of available memory */
> + ? ? ? dest_addr = gd->ram_size;
> + ? ? ? gd->start_addr_sp = dest_addr;
>
> - ? ? ? gd->start_addr_sp = gd->ram_size;
> + ? ? ? /* U-Boot is below the stack */
> + ? ? ? dest_addr -= CONFIG_SYS_STACK_SIZE;
> + ? ? ? dest_addr -= (bss_end - text_start);
> + ? ? ? dest_addr &= ~15;
> ? ? ? ?gd->relocaddr = dest_addr;
> - ? ? ? gd->reloc_off = rel_offset;
> + ? ? ? gd->reloc_off = (dest_addr - text_start);
>
> ? ? ? ?return 0;
> ?}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 07/17] x86: Use fs for global data
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 07/17] x86: Use fs for global data Graeme Russ
@ 2012-01-12  4:51       ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  4:51 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Use the base address of the 'F' segment as a pointer to the global data
> structure. By adding the linear address (i.e. the 'D' segment address) as
> the first word of the global data structure, the address of the global data
> relative to the 'D' segment can be found simply, for example, by:
>
> ? ? ? ?fs movl 0, %eax
>
> This makes the gd 'pointer' writable prior to relocation (by reloading the
> Global Descriptor Table) which brings x86 into line with all other arches
>
> NOTE: Writing to the gd 'pointer' is expensive (but we only do it
> twice) but using it to access global data members (read and write) is
> still fairly cheap
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- Rebased against changes made to patch #3
> ?- Removed extra indent
> ?- Tweaked commit message
>
> ?arch/x86/cpu/cpu.c ? ? ? ? ? ? ? ? | ? 53 ++++++++++++++++++++--------------
> ?arch/x86/cpu/start.S ? ? ? ? ? ? ? | ? ?8 ++++-
> ?arch/x86/include/asm/global_data.h | ? 21 +++++++++----
> ?arch/x86/include/asm/processor.h ? | ? ?1 +
> ?arch/x86/include/asm/u-boot-x86.h ?| ? ?2 +
> ?arch/x86/lib/board.c ? ? ? ? ? ? ? | ? 56 +++++++++++++++++++++++++-----------
> ?6 files changed, 94 insertions(+), 47 deletions(-)
>
> diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
> index 8102fb9..8c3b92c 100644
> --- a/arch/x86/cpu/cpu.c
> +++ b/arch/x86/cpu/cpu.c
> @@ -90,6 +90,37 @@ static void load_gdt(const u64 *boot_gdt, u16 num_entries)
> ? ? ? ?asm volatile("lgdtl %0\n" : : "m" (gdt));
> ?}
>
> +void init_gd(gd_t *id, u64 *gdt_addr)
> +{
> + ? ? ? id->gd_addr = (ulong)id;
> + ? ? ? setup_gdt(id, gdt_addr);
> +}
> +
> +void setup_gdt(gd_t *id, u64 *gdt_addr)
> +{
> + ? ? ? /* CS: code, read/execute, 4 GB, base 0 */
> + ? ? ? gdt_addr[X86_GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff);
> +
> + ? ? ? /* DS: data, read/write, 4 GB, base 0 */
> + ? ? ? gdt_addr[X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff);
> +
> + ? ? ? /* FS: data, read/write, 4 GB, base (Global Data Pointer) */
> + ? ? ? gdt_addr[X86_GDT_ENTRY_32BIT_FS] = GDT_ENTRY(0xc093, (ulong)id, 0xfffff);
> +
> + ? ? ? /* 16-bit CS: code, read/execute, 64 kB, base 0 */
> + ? ? ? gdt_addr[X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff);
> +
> + ? ? ? /* 16-bit DS: data, read/write, 64 kB, base 0 */
> + ? ? ? gdt_addr[X86_GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff);
> +
> + ? ? ? load_gdt(gdt_addr, X86_GDT_NUM_ENTRIES);
> + ? ? ? load_ds(X86_GDT_ENTRY_32BIT_DS);
> + ? ? ? load_es(X86_GDT_ENTRY_32BIT_DS);
> + ? ? ? load_gs(X86_GDT_ENTRY_32BIT_DS);
> + ? ? ? load_ss(X86_GDT_ENTRY_32BIT_DS);
> + ? ? ? load_fs(X86_GDT_ENTRY_32BIT_FS);
> +}
> +
> ?int x86_cpu_init_f(void)
> ?{
> ? ? ? ?const u32 em_rst = ~X86_CR0_EM;
> @@ -117,28 +148,6 @@ int x86_cpu_init_r(void)
> ? ? ? ? ? ?"movl ? ? ? %%eax, %%cr0\n"
> ? ? ? ? ? ?"wbinvd\n" : : "i" (nw_cd_rst) : "eax");
>
> - ? ? ? /*
> - ? ? ? ?* There are machines which are known to not boot with the GDT
> - ? ? ? ?* being 8-byte unaligned. Intel recommends 16 byte alignment
> - ? ? ? ?*/
> - ? ? ? static const u64 boot_gdt[] __aligned(16) = {
> - ? ? ? ? ? ? ? /* CS: code, read/execute, 4 GB, base 0 */
> - ? ? ? ? ? ? ? [X86_GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
> - ? ? ? ? ? ? ? /* DS: data, read/write, 4 GB, base 0 */
> - ? ? ? ? ? ? ? [X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
> - ? ? ? ? ? ? ? /* 16-bit CS: code, read/execute, 64 kB, base 0 */
> - ? ? ? ? ? ? ? [X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
> - ? ? ? ? ? ? ? /* 16-bit DS: data, read/write, 64 kB, base 0 */
> - ? ? ? ? ? ? ? [X86_GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
> - ? ? ? };
> -
> - ? ? ? load_gdt(boot_gdt, X86_GDT_NUM_ENTRIES);
> - ? ? ? load_ds(X86_GDT_ENTRY_32BIT_DS);
> - ? ? ? load_es(X86_GDT_ENTRY_32BIT_DS);
> - ? ? ? load_fs(X86_GDT_ENTRY_32BIT_DS);
> - ? ? ? load_gs(X86_GDT_ENTRY_32BIT_DS);
> - ? ? ? load_ss(X86_GDT_ENTRY_32BIT_DS);
> -
> ? ? ? ?/* Initialize core interrupt and exception functionality of CPU */
> ? ? ? ?cpu_init_interrupts();
> ? ? ? ?return 0;
> diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
> index 69a9b2c..ee0dabe 100644
> --- a/arch/x86/cpu/start.S
> +++ b/arch/x86/cpu/start.S
> @@ -31,7 +31,7 @@
> ?#include <asm/global_data.h>
> ?#include <asm/processor.h>
> ?#include <asm/processor-flags.h>
> -#include <generated/asm-offsets.h>
> +#include <generated/generic-asm-offsets.h>
>
> ?.section .text
> ?.code32
> @@ -85,6 +85,12 @@ car_init_ret:
> ? ? ? ? */
> ? ? ? ?movl ? ?$CONFIG_SYS_INIT_SP_ADDR, %esp
>
> + ? ? ? /* Initialise the Global Data Pointer */
> + ? ? ? movl ? ?$CONFIG_SYS_INIT_GD_ADDR, %eax
> + ? ? ? movl ? ?%eax, %edx
> + ? ? ? addl ? ?$GENERATED_GBL_DATA_SIZE, %edx
> + ? ? ? call ? ?init_gd;
> +
> ? ? ? ?/* Set parameter to board_init_f() to boot flags */
> ? ? ? ?xorl ? ?%eax, %eax
> ? ? ? ?movw ? ?%bx, %ax
> diff --git a/arch/x86/include/asm/global_data.h b/arch/x86/include/asm/global_data.h
> index 05a2139..908a02c 100644
> --- a/arch/x86/include/asm/global_data.h
> +++ b/arch/x86/include/asm/global_data.h
> @@ -36,6 +36,8 @@
> ?#ifndef __ASSEMBLY__
>
> ?typedef ? ? ? ?struct global_data {
> + ? ? ? /* NOTE: gd_addr MUST be first member of struct global_data! */
> + ? ? ? unsigned long ? gd_addr; ? ? ? ?/* Location of Global Data */
> ? ? ? ?bd_t ? ? ? ? ? ?*bd;
> ? ? ? ?unsigned long ? flags;
> ? ? ? ?unsigned long ? baudrate;
> @@ -51,13 +53,24 @@ typedef ? ? struct global_data {
> ? ? ? ?unsigned long ? bus_clk;
> ? ? ? ?unsigned long ? relocaddr; ? ? ?/* Start address of U-Boot in RAM */
> ? ? ? ?unsigned long ? start_addr_sp; ?/* start_addr_stackpointer */
> + ? ? ? unsigned long ? gdt_addr; ? ? ? /* Location of GDT */
> + ? ? ? unsigned long ? new_gd_addr; ? ?/* New location of Global Data */
> ? ? ? ?phys_size_t ? ? ram_size; ? ? ? /* RAM size */
> ? ? ? ?unsigned long ? reset_status; ? /* reset status register at boot */
> ? ? ? ?void ? ? ? ? ? ?**jt; ? ? ? ? ? /* jump table */
> ? ? ? ?char ? ? ? ? ? ?env_buf[32]; ? ?/* buffer for getenv() before reloc. */
> ?} gd_t;
>
> -extern gd_t *gd;
> +static inline gd_t *get_fs_gd_ptr(void)
> +{
> + ? ? ? gd_t *gd_ptr;
> +
> + ? ? ? asm volatile("fs movl 0, %0\n" : "=r" (gd_ptr));
> +
> + ? ? ? return gd_ptr;
> +}
> +
> +#define gd ? ? get_fs_gd_ptr()
>
> ?#endif
>
> @@ -73,12 +86,6 @@ extern gd_t *gd;
> ?#define GD_FLG_DISABLE_CONSOLE 0x00040 /* Disable console (in & out) ? ? ? ? ? */
> ?#define GD_FLG_ENV_READY ? ? ? 0x00080 /* Environment imported into hash table */
>
> -#if 0
> ?#define DECLARE_GLOBAL_DATA_PTR
> -#else
> -#define XTRN_DECLARE_GLOBAL_DATA_PTR ? ?extern
> -#define DECLARE_GLOBAL_DATA_PTR ? ? XTRN_DECLARE_GLOBAL_DATA_PTR \
> -gd_t *gd
> -#endif
>
> ?#endif /* __ASM_GBL_DATA_H */
> diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
> index aa8188e..6eb5180 100644
> --- a/arch/x86/include/asm/processor.h
> +++ b/arch/x86/include/asm/processor.h
> @@ -33,6 +33,7 @@ enum {
> ? ? ? ?X86_GDT_ENTRY_UNUSED,
> ? ? ? ?X86_GDT_ENTRY_32BIT_CS,
> ? ? ? ?X86_GDT_ENTRY_32BIT_DS,
> + ? ? ? X86_GDT_ENTRY_32BIT_FS,
> ? ? ? ?X86_GDT_ENTRY_16BIT_CS,
> ? ? ? ?X86_GDT_ENTRY_16BIT_DS,
> ? ? ? ?X86_GDT_NUM_ENTRIES
> diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
> index c3d2277..5540d51 100644
> --- a/arch/x86/include/asm/u-boot-x86.h
> +++ b/arch/x86/include/asm/u-boot-x86.h
> @@ -37,6 +37,8 @@ int x86_cpu_init_r(void);
> ?int cpu_init_r(void);
> ?int x86_cpu_init_f(void);
> ?int cpu_init_f(void);
> +void init_gd(gd_t *id, u64 *gdt_addr);
> +void setup_gdt(gd_t *id, u64 *gdt_addr);
>
> ?/* cpu/.../timer.c */
> ?void timer_isr(void *);
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index 6f075b7..b64c2d3 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -42,20 +42,12 @@
> ?#include <serial.h>
> ?#include <asm/u-boot-x86.h>
> ?#include <elf.h>
> +#include <asm/processor.h>
>
> ?#ifdef CONFIG_BITBANGMII
> ?#include <miiphy.h>
> ?#endif
>
> -/*
> - * 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);
> -
> ?/************************************************************************
> ?* Init Utilities ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*
> ?************************************************************************
> @@ -128,6 +120,7 @@ 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);
> +static int copy_gd_to_ram(void);
>
> ?init_fnc_t *init_sequence_f[] = {
> ? ? ? ?cpu_init_f,
> @@ -146,6 +139,7 @@ init_fnc_t *init_sequence_f[] = {
> ?};
>
> ?init_fnc_t *init_sequence_r[] = {
> + ? ? ? copy_gd_to_ram,
> ? ? ? ?cpu_init_r, ? ? ? ? ? ? /* basic cpu dependent setup */
> ? ? ? ?board_early_init_r, ? ? /* basic board dependent setup */
> ? ? ? ?dram_init, ? ? ? ? ? ? ?/* configure available RAM banks */
> @@ -157,8 +151,6 @@ init_fnc_t *init_sequence_r[] = {
> ? ? ? ?NULL,
> ?};
>
> -gd_t *gd;
> -
> ?static int calculate_relocation_address(void)
> ?{
> ? ? ? ?ulong text_start = (ulong)&__text_start;
> @@ -171,8 +163,18 @@ static int calculate_relocation_address(void)
> ? ? ? ? * ? ? ? requirements
> ? ? ? ? */
>
> - ? ? ? /* Stack is at top of available memory */
> + ? ? ? /* Global Data is at top of available memory */
> ? ? ? ?dest_addr = gd->ram_size;
> + ? ? ? dest_addr -= GENERATED_GBL_DATA_SIZE;
> + ? ? ? dest_addr &= ~15;
> + ? ? ? gd->new_gd_addr = dest_addr;
> +
> + ? ? ? /* GDT is below Global Data */
> + ? ? ? dest_addr -= X86_GDT_SIZE;
> + ? ? ? dest_addr &= ~15;
> + ? ? ? gd->gdt_addr = dest_addr;
> +
> + ? ? ? /* Stack is below GDT */
> ? ? ? ?gd->start_addr_sp = dest_addr;
>
> ? ? ? ?/* U-Boot is below the stack */
> @@ -279,6 +281,31 @@ void board_init_f_r(void)
> ? ? ? ? ? ? ? ?;
> ?}
>
> +static int copy_gd_to_ram(void)
> +{
> + ? ? ? gd_t *ram_gd;
> +
> + ? ? ? /*
> + ? ? ? ?* Global data is still in temporary memory (the CPU cache).
> + ? ? ? ?* calculate_relocation_address() has set gd->new_gd_addr to
> + ? ? ? ?* where the global data lives in RAM but getting it there
> + ? ? ? ?* safely is a bit tricky due to the 'F-Segment Hack' that
> + ? ? ? ?* we need to use for x86
> + ? ? ? ?*/
> + ? ? ? ram_gd = (gd_t *)gd->new_gd_addr;
> + ? ? ? memcpy((void *)ram_gd, gd, sizeof(gd_t));
> +
> + ? ? ? /*
> + ? ? ? ?* Reload the Global Descriptor Table so FS points to the
> + ? ? ? ?* in-RAM copy of Global Data (calculate_relocation_address()
> + ? ? ? ?* has already calculated the in-RAM location of the GDT)
> + ? ? ? ?*/
> + ? ? ? ram_gd->gd_addr = (ulong)ram_gd;
> + ? ? ? init_gd(ram_gd, (u64 *)gd->gdt_addr);
> +
> + ? ? ? return 0;
> +}
> +
> ?void board_init_r(gd_t *id, ulong dest_addr)
> ?{
> ?#if defined(CONFIG_CMD_NET)
> @@ -288,15 +315,10 @@ void board_init_r(gd_t *id, ulong dest_addr)
> ? ? ? ?ulong size;
> ?#endif
> ? ? ? ?static bd_t bd_data;
> - ? ? ? static gd_t gd_data;
> ? ? ? ?init_fnc_t **init_fnc_ptr;
>
> ? ? ? ?show_boot_progress(0x21);
>
> - ? ? ? /* 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");
>
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot Graeme Russ
@ 2012-01-12  4:51       ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  4:51 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- None
>
> ?arch/x86/lib/board.c | ? ?4 ++--
> ?1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index b64c2d3..3d82165 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -252,8 +252,6 @@ void board_init_f(ulong boot_flags)
> ? ? ? ? ? ? ? ? ? ? ? ?hang();
> ? ? ? ?}
>
> - ? ? ? gd->flags |= GD_FLG_RELOC;
> -
> ? ? ? ?/*
> ? ? ? ? * SDRAM is now initialised, U-Boot has been copied into SDRAM,
> ? ? ? ? * the BSS has been cleared etc. The final stack can now be setup
> @@ -322,6 +320,8 @@ void board_init_r(gd_t *id, ulong dest_addr)
> ? ? ? ?/* compiler optimization barrier needed for GCC >= 3.4 */
> ? ? ? ?__asm__ __volatile__("" : : : "memory");
>
> + ? ? ? gd->flags |= GD_FLG_RELOC;
> +
> ? ? ? ?gd->bd = &bd_data;
> ? ? ? ?memset(gd->bd, 0, sizeof(bd_t));
> ? ? ? ?show_boot_progress(0x22);
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 09/17] x86: Create weak init_cache() and default enable_caches() functions
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 09/17] x86: Create weak init_cache() and default enable_caches() functions Graeme Russ
@ 2012-01-12  4:55       ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  4:55 UTC (permalink / raw)
  To: u-boot

Hi Graeme,

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> Changes for v2:
> ?- Tweaked commit title
>
> ?arch/x86/cpu/cpu.c ? ? ? ? ? ? ? ?| ? 18 +++++++++++++++---
> ?arch/x86/include/asm/u-boot-x86.h | ? ?1 +
> ?arch/x86/lib/board.c ? ? ? ? ? ? ?| ? ?1 +
> ?3 files changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
> index 8c3b92c..e9bb0d7 100644
> --- a/arch/x86/cpu/cpu.c
> +++ b/arch/x86/cpu/cpu.c
> @@ -140,6 +140,14 @@ int cpu_init_f(void) __attribute__((weak, alias("x86_cpu_init_f")));
>
> ?int x86_cpu_init_r(void)
> ?{
> + ? ? ? /* Initialize core interrupt and exception functionality of CPU */
> + ? ? ? cpu_init_interrupts();
> + ? ? ? return 0;
> +}
> +int cpu_init_r(void) __attribute__((weak, alias("x86_cpu_init_r")));
> +
> +void x86_enable_caches(void)
> +{
> ? ? ? ?const u32 nw_cd_rst = ~(X86_CR0_NW | X86_CR0_CD);
>
> ? ? ? ?/* turn on the cache and disable write through */
> @@ -147,12 +155,16 @@ int x86_cpu_init_r(void)
> ? ? ? ? ? ?"andl ? ? ? %0, %%eax\n"
> ? ? ? ? ? ?"movl ? ? ? %%eax, %%cr0\n"
> ? ? ? ? ? ?"wbinvd\n" : : "i" (nw_cd_rst) : "eax");
> +}
> +void enable_caches(void) __attribute__((weak, alias("x86_enable_caches")));
> +
> +int x86_init_cache(void)
> +{
> + ? ? ? enable_caches();

One question on this patch - it looks like init_cache() just called
enable_caches(). Both are weak functions. Is there any reason for
having two?

Is it possible to have init_cache() just be the weak function which
defaults to what you have here for x86_enable_caches()?

Regards,
Simon

>
> - ? ? ? /* Initialize core interrupt and exception functionality of CPU */
> - ? ? ? cpu_init_interrupts();
> ? ? ? ?return 0;
> ?}
> -int cpu_init_r(void) __attribute__((weak, alias("x86_cpu_init_r")));
> +int init_cache(void) __attribute__((weak, alias("x86_init_cache")));
>
> ?int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> ?{
> diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
> index 5540d51..878a1ee 100644
> --- a/arch/x86/include/asm/u-boot-x86.h
> +++ b/arch/x86/include/asm/u-boot-x86.h
> @@ -39,6 +39,7 @@ int x86_cpu_init_f(void);
> ?int cpu_init_f(void);
> ?void init_gd(gd_t *id, u64 *gdt_addr);
> ?void setup_gdt(gd_t *id, u64 *gdt_addr);
> +int init_cache(void);
>
> ?/* cpu/.../timer.c */
> ?void timer_isr(void *);
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index 3d82165..56acf35 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -140,6 +140,7 @@ init_fnc_t *init_sequence_f[] = {
>
> ?init_fnc_t *init_sequence_r[] = {
> ? ? ? ?copy_gd_to_ram,
> + ? ? ? init_cache,
> ? ? ? ?cpu_init_r, ? ? ? ? ? ? /* basic cpu dependent setup */
> ? ? ? ?board_early_init_r, ? ? /* basic board dependent setup */
> ? ? ? ?dram_init, ? ? ? ? ? ? ?/* configure available RAM banks */
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 10/17] x86: Allow cache before copy to RAM
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 10/17] x86: Allow cache before copy to RAM Graeme Russ
@ 2012-01-12  4:56       ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  4:56 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- None
>
> ?arch/x86/lib/board.c | ? 15 ++++++++++-----
> ?1 files changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index 56acf35..a240d26 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -131,16 +131,11 @@ init_fnc_t *init_sequence_f[] = {
> ? ? ? ?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[] = {
> - ? ? ? copy_gd_to_ram,
> - ? ? ? init_cache,
> ? ? ? ?cpu_init_r, ? ? ? ? ? ? /* basic cpu dependent setup */
> ? ? ? ?board_early_init_r, ? ? /* basic board dependent setup */
> ? ? ? ?dram_init, ? ? ? ? ? ? ?/* configure available RAM banks */
> @@ -269,6 +264,16 @@ void board_init_f(ulong boot_flags)
>
> ?void board_init_f_r(void)
> ?{
> + ? ? ? if (copy_gd_to_ram() != 0)
> + ? ? ? ? ? ? ? hang();
> +
> + ? ? ? if (init_cache() != 0)
> + ? ? ? ? ? ? ? hang();
> +
> + ? ? ? copy_uboot_to_ram();
> + ? ? ? clear_bss();
> + ? ? ? do_elf_reloc_fixups();
> +
> ? ? ? ?/*
> ? ? ? ? * Transfer execution from Flash to RAM by calculating the address
> ? ? ? ? * of the in-RAM copy of board_init_r() and calling it
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 11/17] x86: Tweak IDT and GDT for alignment and readability
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 11/17] x86: Tweak IDT and GDT for alignment and readability Graeme Russ
@ 2012-01-12  5:00       ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  5:00 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- Renamed to better reflect nature of changes
>
> ?arch/x86/cpu/interrupts.c | ? ?2 +-
> ?arch/x86/cpu/start16.S ? ?| ? 57 +++++++++++++++++++++++++++++++++++---------
> ?2 files changed, 46 insertions(+), 13 deletions(-)
>
> diff --git a/arch/x86/cpu/interrupts.c b/arch/x86/cpu/interrupts.c
> index e0958eb..43ec3f8 100644
> --- a/arch/x86/cpu/interrupts.c
> +++ b/arch/x86/cpu/interrupts.c
> @@ -174,7 +174,7 @@ struct desc_ptr {
> ? ? ? ?unsigned short segment;
> ?} __packed;
>
> -struct idt_entry idt[256] __attribute__((aligned(16)));
> +struct idt_entry idt[256] __aligned(16);
>
> ?struct desc_ptr idt_ptr;
>
> diff --git a/arch/x86/cpu/start16.S b/arch/x86/cpu/start16.S
> index 33e53cd..cc393ff 100644
> --- a/arch/x86/cpu/start16.S
> +++ b/arch/x86/cpu/start16.S
> @@ -86,7 +86,11 @@ gdt_ptr:
> ? ? ? ?.word ? 0x20 ? ? ? ? ? ?/* limit (32 bytes = 4 GDT entries) */
> ? ? ? ?.long ? BOOT_SEG + gdt ?/* base */
>
> - ? ? ? /* The GDT table ...
> +/* Some CPUs are picky about GDT alignment... */
> +.align 16
> +gdt:
> + ? ? ? /*
> + ? ? ? ?* The GDT table ...
> ? ? ? ? *
> ? ? ? ? * ? ? ? Selector ? ? ? Type
> ? ? ? ? * ? ? ? 0x00 ? ? ? ? ? NULL
> @@ -94,17 +98,46 @@ gdt_ptr:
> ? ? ? ? * ? ? ? 0x10 ? ? ? ? ? 32bit code
> ? ? ? ? * ? ? ? 0x18 ? ? ? ? ? 32bit data/stack
> ? ? ? ? */
> + ? ? ? /* The NULL Desciptor - Mandatory */
> + ? ? ? .word ? 0x0000 ? ? ? ? ?/* limit_low */
> + ? ? ? .word ? 0x0000 ? ? ? ? ?/* base_low */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_middle */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* access */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* flags + limit_high */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_high */
>
> -gdt:
> - ? ? ? .word ? 0, 0, 0, 0 ? ? ?/* NULL ?*/
> - ? ? ? .word ? 0, 0, 0, 0 ? ? ?/* unused */
> + ? ? ? /* Unused Desciptor - (matches Linux) */
> + ? ? ? .word ? 0x0000 ? ? ? ? ?/* limit_low */
> + ? ? ? .word ? 0x0000 ? ? ? ? ?/* base_low */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_middle */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* access */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* flags + limit_high */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_high */
>
> - ? ? ? .word ? 0xFFFF ? ? ? ? ?/* 4Gb - (0x100000*0x1000 = 4Gb) */
> - ? ? ? .word ? 0 ? ? ? ? ? ? ? /* base address = 0 */
> - ? ? ? .word ? 0x9B00 ? ? ? ? ?/* code read/exec */
> - ? ? ? .word ? 0x00CF ? ? ? ? ?/* granularity = 4096, 386 (+5th nibble of limit) */
> + ? ? ? /*
> + ? ? ? ?* The Code Segment Descriptor:
> + ? ? ? ?* - Base ? = 0x00000000
> + ? ? ? ?* - Size ? = 4GB
> + ? ? ? ?* - Access = Present, Ring 0, Exec (Code), Readable
> + ? ? ? ?* - Flags ?= 4kB Granularity, 32-bit
> + ? ? ? ?*/
> + ? ? ? .word ? 0xffff ? ? ? ? ?/* limit_low */
> + ? ? ? .word ? 0x0000 ? ? ? ? ?/* base_low */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_middle */
> + ? ? ? .byte ? 0x9b ? ? ? ? ? ?/* access */
> + ? ? ? .byte ? 0xcf ? ? ? ? ? ?/* flags + limit_high */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_high */
>
> - ? ? ? .word ? 0xFFFF ? ? ? ? ?/* 4Gb - (0x100000*0x1000 = 4Gb) */
> - ? ? ? .word ? 0x0 ? ? ? ? ? ? /* base address = 0 */
> - ? ? ? .word ? 0x9300 ? ? ? ? ?/* data read/write */
> - ? ? ? .word ? 0x00CF ? ? ? ? ?/* granularity = 4096, 386 (+5th nibble of limit) */
> + ? ? ? /*
> + ? ? ? ?* The Data Segment Descriptor:
> + ? ? ? ?* - Base ? = 0x00000000
> + ? ? ? ?* - Size ? = 4GB
> + ? ? ? ?* - Access = Present, Ring 0, Non-Exec (Data), Writable
> + ? ? ? ?* - Flags ?= 4kB Granularity, 32-bit
> + ? ? ? ?*/
> + ? ? ? .word ? 0xffff ? ? ? ? ?/* limit_low */
> + ? ? ? .word ? 0x0000 ? ? ? ? ?/* base_low */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_middle */
> + ? ? ? .byte ? 0x93 ? ? ? ? ? ?/* access */
> + ? ? ? .byte ? 0xcf ? ? ? ? ? ?/* flags + limit_high */
> + ? ? ? .byte ? 0x00 ? ? ? ? ? ?/* base_high */
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 12/17] CHECKPATCH: arch/x86/lib/*
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 12/17] CHECKPATCH: arch/x86/lib/* Graeme Russ
@ 2012-01-12  5:01       ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  5:01 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- None
>
> ?arch/x86/lib/bios.S ? ? ? ? ? ?| ?134 +++++++++++++++++++++++++--------------
> ?arch/x86/lib/realmode_switch.S | ? 61 +++++++++++--------
> ?2 files changed, 122 insertions(+), 73 deletions(-)
>
> diff --git a/arch/x86/lib/bios.S b/arch/x86/lib/bios.S
> index ce8deb5..239aaa9 100644
> --- a/arch/x86/lib/bios.S
> +++ b/arch/x86/lib/bios.S
> @@ -246,11 +246,9 @@ rm_int1f:
> ?rm_def_int:
> ? ? ? ?iret
>
> -
> ? ? ? ?/*
> - ? ? ? ?* All interrupt jumptable entries jump to here
> - ? ? ? ?* after pushing the interrupt vector number onto the
> - ? ? ? ?* stack.
> + ? ? ? ?* All interrupt jumptable entries jump to here after pushing the
> + ? ? ? ?* interrupt vector number onto the stack.
> ? ? ? ? */
> ?any_interrupt16:
> ? ? ? ?MAKE_BIOS_STACK
> @@ -272,7 +270,8 @@ gs ?movw ? ?OFFS_VECTOR(%bp), %ax
> ? ? ? ?je ? ? ?Lint_1ah
> ? ? ? ?movw ? ?$0xffff, %ax
> ? ? ? ?jmp ? ? Lout
> -Lint_10h: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* VGA BIOS services */
> +Lint_10h:
> + ? ? ? /* VGA BIOS services */
> ? ? ? ?call ? ?bios_10h
> ? ? ? ?jmp ? ? Lout
> ?Lint_11h:
> @@ -281,35 +280,42 @@ Lint_11h:
> ?Lint_12h:
> ? ? ? ?call ? ?bios_12h
> ? ? ? ?jmp ? ? Lout
> -Lint_13h: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* BIOS disk services */
> +Lint_13h:
> + ? ? ? /* BIOS disk services */
> ? ? ? ?call ? ?bios_13h
> ? ? ? ?jmp ? ? Lout
> -Lint_15h: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* Misc. BIOS services */
> +Lint_15h:
> + ? ? ? /* Misc. BIOS services */
> ? ? ? ?call ? ?bios_15h
> ? ? ? ?jmp ? ? Lout
> -Lint_16h: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* keyboard services */
> +Lint_16h:
> + ? ? ? /* keyboard services */
> ? ? ? ?call ? ?bios_16h
> ? ? ? ?jmp ? ? Lout
> -Lint_1ah: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* PCI bios */
> +Lint_1ah:
> + ? ? ? /* PCI bios */
> ? ? ? ?call ? ?bios_1ah
> ? ? ? ?jmp ? ? Lout
> ?Lout:
> ? ? ? ?cmpw ? ?$0, %ax
> ? ? ? ?je ? ? ?Lhandeled
>
> - ? ? ? /* Insert code for unhandeled INTs here.
> + ? ? ? /*
> + ? ? ? ?* Insert code for unhandeled INTs here.
> ? ? ? ? *
> - ? ? ? ?* ROLO prints a message to the console
> - ? ? ? ?* (we could do that but then we're in 16bit mode
> - ? ? ? ?* so we'll have to get back into 32bit mode
> - ? ? ? ?* to use the console I/O routines (if we do this
> - ? ? ? ?* we shuls make int 0x10 and int 0x16 work as well))
> + ? ? ? ?* ROLO prints a message to the console we could do that but then
> + ? ? ? ?* we're in 16bit mode so we'll have to get back into 32bit mode
> + ? ? ? ?* to use the console I/O routines (if we do this we should make
> + ? ? ? ?* int 0x10 and int 0x16 work as well)
> ? ? ? ? */
> ?Lhandeled:
> ? ? ? ?RESTORE_CALLERS_STACK
> - ? ? ? addw ? ?$2,%sp ? ? ? ? ? ? ? ? ? ? ? ? ?/* dump vector number */
> - ? ? ? iret ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* return from interrupt */
>
> + ? ? ? /* dump vector number */
> + ? ? ? addw ? ?$2,%sp
> +
> + ? ? ? /* return from interrupt */
> + ? ? ? iret
>
> ?/*
> ?************************************************************
> @@ -327,22 +333,24 @@ gs ? ? ? ?movw ? ?OFFS_AX(%bp), %ax
> ? ? ? ?je ? ? ?Lvid_cfg
> ? ? ? ?movw ? ?$0xffff, %ax
> ? ? ? ?ret
> -Lcur_pos: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* Read Cursor Position and Size */
> +Lcur_pos:
> + ? ? ? /* Read Cursor Position and Size */
> ?gs ? ? movw ? ?$0, OFFS_CX(%bp)
> ?gs ? ? movw ? ?$0, OFFS_DX(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
> -Lvid_state: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* Get Video State */
> -gs ? ? movw ? ?$(80 << 8|0x03), OFFS_AX(%bp) ? /* 80 columns, 80x25, 16 colors */
> +Lvid_state:
> + ? ? ? /* Get Video State - 80 columns, 80x25, 16 colors */
> +gs ? ? movw ? ?$(80 << 8|0x03), OFFS_AX(%bp)
> ?gs ? ? movw ? ?$0, OFFS_BX(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
> -Lvid_cfg: ? ? ?/* Video Subsystem Configuration (EGA/VGA) */
> -gs ? ? movw ? ?$0x10, OFFS_BX(%bp) ? ? ? ? ? ? /* indicate CGA/MDA/HGA */
> +Lvid_cfg:
> + ? ? ? /* Video Subsystem Configuration (EGA/VGA) - indicate CGA/MDA/HGA */
> +gs ? ? movw ? ?$0x10, OFFS_BX(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> -
> ?/*
> ?************************************************************
> ?* BIOS interrupt 11h -- Equipment determination
> @@ -355,7 +363,6 @@ gs ?movw ? ?%ax, OFFS_AX(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> -
> ?/*
> ?************************************************************
> ?* BIOS ? ? ? ?interrupt 12h -- Get Memory Size
> @@ -370,16 +377,18 @@ cs ? ? ? ?movw ? ?ram_in_64kb_chunks, %ax
> ?b12_more_than_640k:
> ? ? ? ?movw ? ?$0x280, %ax
> ?b12_return:
> -gs ? ? movw ? ?%ax, OFFS_AX(%bp) ? ? ? ? ? ? ? /* return number of kilobytes in ax */
> + ? ? ? /* return number of kilobytes in ax */
> +gs ? ? movw ? ?%ax, OFFS_AX(%bp)
>
> ?gs ? ? movw ? ?OFFS_FLAGS(%bp), %ax
> - ? ? ? andw ? ?$0xfffe, %ax ? ? ? ? ? ? ? ? ? ?/* clear carry -- function succeeded */
> +
> + ? ? ? /* clear carry -- function succeeded */
> + ? ? ? andw ? ?$0xfffe, %ax
> ?gs ? ? movw ? ?%ax, OFFS_FLAGS(%bp)
>
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> -
> ?/*
> ?************************************************************
> ?* BIOS interrupt 13h -- Disk services
> @@ -394,12 +403,13 @@ gs ? ? ? ?movw ? ?OFFS_AX(%bp), %ax
> ? ? ? ?ret
> ?Lfunc_15h:
> ?gs ? ? movw ? ?OFFS_AX(%bp), %ax
> - ? ? ? andw ? ?$0xff, %ax ? ? ? ? ? ? ? ? ? ? ?/* return AH=0->drive not present */
> +
> + ? ? ? /* return AH=0->drive not present */
> + ? ? ? andw ? ?$0x00ff, %ax
> ?gs ? ? movw ? ?%ax, OFFS_AX(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> -
> ?/*
> ?***********************************************************
> ?* BIOS interrupt 15h -- Miscellaneous services
> @@ -417,9 +427,12 @@ gs movw ? ?OFFS_AX(%bp), %ax
> ? ? ? ?movw ? ?$0xffff, %ax
> ? ? ? ?ret
>
> -Lfunc_c0h: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Return System Configuration Parameters (PS2 only) */
> +Lfunc_c0h:
> + ? ? ? /* Return System Configuration Parameters (PS2 only) */
> ?gs ? ? movw ? ?OFFS_FLAGS(%bp), %ax
> - ? ? ? orw ? ? $1, %ax ? ? ? ? ? ? ? ? ? ? ? ? /* return carry -- function not supported */
> +
> + ? ? ? /* return carry -- function not supported */
> + ? ? ? orw ? ? $1, %ax
> ?gs ? ? movw ? ?%ax, OFFS_FLAGS(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
> @@ -430,38 +443,56 @@ gs ? ? ? ?movw ? ?OFFS_AX(%bp), %ax
> ? ? ? ?cmpw ? ?$1, %ax
> ? ? ? ?je ? ? ?Lfunc_e801h
> ?gs ? ? movw ? ?OFFS_FLAGS(%bp), %ax
> - ? ? ? orw ? ? $1, %ax ? ? ? ? ? ? ? ? ? ? ? ? /* return carry -- function not supported */
> +
> + ? ? ? /* return carry -- function not supported */
> + ? ? ? orw ? ? $1, %ax
> ?gs ? ? movw ? ?%ax, OFFS_FLAGS(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> -Lfunc_e801h: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* Get memory size for >64M Configurations */
> +Lfunc_e801h:
> + ? ? ? /* Get memory size for >64M Configurations */
> ?cs ? ? movw ? ?ram_in_64kb_chunks, %ax
> ? ? ? ?cmpw ? ?$0x100, %ax
> ? ? ? ?ja ? ? ?e801_more_than_16mb
> - ? ? ? shlw ? ?$6, %ax ? ? ? ? ? ? ? ? ? ? ? ? /* multiply by 64 */
> - ? ? ? subw ? ?$0x400, %ax ? ? ? ? ? ? ? ? ? ? /* 1st meg does not count */
>
> -gs ? ? movw ? ?%ax, OFFS_AX(%bp) ? ? ? ? ? ? ? /* return memory size between 1M and 16M in 1kb chunks in AX and CX */
> + ? ? ? /* multiply by 64 */
> + ? ? ? shlw ? ?$6, %ax
> +
> + ? ? ? /* 1st meg does not count */
> + ? ? ? subw ? ?$0x400, %ax
> +
> + ? ? ? /* return memory size between 1M and 16M in 1kb chunks in AX and CX */
> +gs ? ? movw ? ?%ax, OFFS_AX(%bp)
> ?gs ? ? movw ? ?%ax, OFFS_CX(%bp)
> -gs ? ? movw ? ?$0, OFFS_BX(%bp) ? ? ? ? ? ? ? ?/* set BX and DX to 0*/
> +
> + ? ? ? /* set BX and DX to 0*/
> +gs ? ? movw ? ?$0, OFFS_BX(%bp)
> ?gs ? ? movw ? ?$0, OFFS_DX(%bp)
> ?gs ? ? movw ? ?OFFS_FLAGS(%bp), %ax
> - ? ? ? andw ? ?$0xfffe, %ax ? ? ? ? ? ? ? ? ? ?/* clear carry -- function succeeded */
> +
> + ? ? ? /* clear carry -- function succeeded */
> + ? ? ? andw ? ?$0xfffe, %ax
> ?gs ? ? movw ? ?%ax, OFFS_FLAGS(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> ?e801_more_than_16mb:
> - ? ? ? subw ? ?$0x100, %ax ? ? ? ? ? ? ? ? ? ? /* subtract 16MB */
> + ? ? ? /* subtract 16MB */
> + ? ? ? subw ? ?$0x100, %ax
>
> -gs ? ? movw ? ?$0x3c00, OFFS_AX(%bp) ? ? ? ? ? /* return 0x3c00 (16MB-1MB) in AX and CX */
> + ? ? ? /* return 0x3c00 (16MB-1MB) in AX and CX */
> +gs ? ? movw ? ?$0x3c00, OFFS_AX(%bp)
> ?gs ? ? movw ? ?$0x3c00, OFFS_CX(%bp)
> -gs ? ? movw ? ?%ax, OFFS_BX(%bp) ? ? ? ? ? ? ? /* set BX and DX to number of 64kb chunks above 16MB */
> +
> + ? ? ? /* set BX and DX to number of 64kb chunks above 16MB */
> +gs ? ? movw ? ?%ax, OFFS_BX(%bp)
> ?gs ? ? movw ? ?%ax, OFFS_DX(%bp)
>
> ?gs ? ? movw ? ?OFFS_FLAGS(%bp), %ax
> - ? ? ? andw ? ?$0xfffe, %ax ? ? ? ? ? ? ? ? ? ?/* clear carry -- function succeeded */
> +
> + ? ? ? /* clear carry -- function succeeded */
> + ? ? ? andw ? ?$0xfffe, %ax
> ?gs ? ? movw ? ?%ax, OFFS_FLAGS(%bp)
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
> @@ -473,18 +504,22 @@ cs ? ? ? ?movw ? ?ram_in_64kb_chunks, %ax
> ? ? ? ?movw ? ?$0x100, %ax
> ?b88_not_more_than16:
> ? ? ? ?shlw ? ?$6, %ax
> - ? ? ? subw ? ?$0x400, %ax ? ? ? ? ? ? ? ? ? ? /* 1st meg does not count */
>
> -gs ? ? movw ? ?%ax, OFFS_AX(%bp) ? ? ? ? ? ? ? /* return number of kilobytes between 16MB and 16MB in ax */
> + ? ? ? /* 1st meg does not count */
> + ? ? ? subw ? ?$0x400, %ax
> +
> + ? ? ? /* return number of kilobytes between 16MB and 16MB in ax */
> +gs ? ? movw ? ?%ax, OFFS_AX(%bp)
>
> ?gs ? ? movw ? ?OFFS_FLAGS(%bp), %ax
> - ? ? ? andw ? ?$0xfffe, %ax ? ? ? ? ? ? ? ? ? ?/* clear carry -- function succeeded */
> +
> + ? ? ? /* clear carry -- function succeeded */
> + ? ? ? andw ? ?$0xfffe, %ax
> ?gs ? ? movw ? ?%ax, OFFS_FLAGS(%bp)
>
> ? ? ? ?xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> -
> ?/*
> ?************************************************************
> ?* BIOS interrupt 16h -- keyboard services
> @@ -498,7 +533,8 @@ gs ?movw ? ?OFFS_AX(%bp), %ax
> ? ? ? ?movw ? ?$0xffff, %ax
> ? ? ? ?ret
> ?Lfunc_03h:
> - ? ? ? xorw ? ?%ax, %ax ? ? ? ? ? ? ? ? ? ? ? ?/* do nothing -- function not supported */
> + ? ? ? /* do nothing -- function not supported */
> + ? ? ? xorw ? ?%ax, %ax
> ? ? ? ?ret
>
> ?/*
> @@ -514,7 +550,9 @@ gs ?movw ? ?OFFS_AX(%bp), %ax
> ? ? ? ?ret
> ?Lfunc_b1h:
> ? ? ? ?call ? ?realmode_pci_bios
> - ? ? ? xorw ? ?%ax, %ax ? ? ? ? ? ? ? ? ? ? ? ?/* do nothing -- function not supported */
> +
> + ? ? ? /* do nothing -- function not supported */
> + ? ? ? xorw ? ?%ax, %ax
> ? ? ? ?ret
>
>
> diff --git a/arch/x86/lib/realmode_switch.S b/arch/x86/lib/realmode_switch.S
> index 7ee709a..c4c4c43 100644
> --- a/arch/x86/lib/realmode_switch.S
> +++ b/arch/x86/lib/realmode_switch.S
> @@ -44,12 +44,13 @@
> ?* ? ? e40 ss;
> ?*/
>
> -#define a32 ? ? ? ? ? ?.byte 0x67; ? ? ? ? ? ? /* address size prefix 32 */
> -#define o32 ? ? ? ? ? ?.byte 0x66; ? ? ? ? ? ? /* operand size prefix 32 */
> +#define a32 ? ? ? ? ? ?.byte 0x67; ? ? /* address size prefix 32 */
> +#define o32 ? ? ? ? ? ?.byte 0x66; ? ? /* operand size prefix 32 */
>
> ?.section .realmode, "ax"
> ?.code16
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 16bit protected mode code here */
> +
> + ? ? ? /* 16bit protected mode code here */
> ?.globl realmode_enter
> ?realmode_enter:
> ?o32 ? ?pusha
> @@ -69,20 +70,23 @@ o32 pushf
> ? ? ? ?movw ? ?%ax, %gs
>
> ? ? ? ?lidt ? ?realmode_idt_ptr
> - ? ? ? movl ? ?%cr0, %eax ? ? ? ? ? ? ? ? ? ? ?/* Go back into real mode by */
> - ? ? ? andl ? ?$0x7ffffffe, %eax ? ? ? ? ? ? ? /* clearing PE to 0 */
> + ? ? ? /* Go back into real mode by clearing PE to 0 */
> + ? ? ? movl ? ?%cr0, %eax
> + ? ? ? andl ? ?$0x7ffffffe, %eax
> ? ? ? ?movl ? ?%eax, %cr0
> - ? ? ? ljmp ? ?$0x0,$do_realmode ? ? ? ? ? ? ? /* switch to real mode */
>
> -do_realmode: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* realmode code from here */
> + ? ? ? /* switch to real mode */
> + ? ? ? ljmp ? ?$0x0,$do_realmode
> +
> +do_realmode:
> + ? ? ? /* realmode code from here */
> ? ? ? ?movw ? ?%cs,%ax
> ? ? ? ?movw ? ?%ax,%ds
> ? ? ? ?movw ? ?%ax,%es
> ? ? ? ?movw ? ?%ax,%fs
> ? ? ? ?movw ? ?%ax,%gs
>
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* create a temporary stack */
> -
> + ? ? ? /* create a temporary stack */
> ? ? ? ?movw ? ?$0xc0, %ax
> ? ? ? ?movw ? ?%ax, %ss
> ? ? ? ?movw ? ?$0x200, %ax
> @@ -114,26 +118,29 @@ o32 ? ? ? popf
> ? ? ? ?popw ? ?%ss
> ? ? ? ?movl ? ?%eax, %esp
> ?cs ? ? movl ? ?temp_eax, %eax
> - ? ? ? wbinvd ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* self-modifying code,
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?* better flush the cache */
> +
> + ? ? ? /* self-modifying code, better flush the cache */
> + ? ? ? wbinvd
>
> ? ? ? ?.byte ? 0x9a ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* lcall */
> ?temp_ip:
> ? ? ? ?.word ? 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* new ip */
> ?temp_cs:
> ? ? ? ?.word ? 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* new cs */
> +
> ?realmode_ret:
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* save eax, esp and ss */
> + ? ? ? /* save eax, esp and ss */
> ?cs ? ? movl ? ?%eax, saved_eax
> ? ? ? ?movl ? ?%esp, %eax
> ?cs ? ? movl ? ?%eax, saved_esp
> ? ? ? ?movw ? ?%ss, %ax
> ?cs ? ? movw ? ?%ax, saved_ss
>
> - ? ? ? /* restore the stack, note that we set sp to 0x244;
> + ? ? ? /*
> + ? ? ? ?* restore the stack, note that we set sp to 0x244;
> ? ? ? ? * pt_regs is 0x44 bytes long and we push the structure
> - ? ? ? ?* backwards on to the stack, bottom first */
> -
> + ? ? ? ?* backwards on to the stack, bottom first
> + ? ? ? ?*/
> ? ? ? ?movw ? ?$0xc0, %ax
> ? ? ? ?movw ? ?%ax, %ss
> ? ? ? ?movw ? ?$0x244, %ax
> @@ -169,12 +176,15 @@ cs ? ? ? ?movw ? ?temp_ip, %ax
> ? ? ? ?pushl ? %ebx
>
> ?o32 cs lidt ? ?saved_idt
> -o32 cs lgdt ? ?saved_gdt ? ? ? ? ? ? ? ? ? ? ? /* Set GDTR */
> +o32 cs lgdt ? ?saved_gdt
>
> - ? ? ? movl ? ?%cr0, %eax ? ? ? ? ? ? ? ? ? ? ?/* Go back into protected mode */
> - ? ? ? orl ? ? $1,%eax /* reset PE to 1 */
> + ? ? ? /* Go back into protected mode reset PE to 1 */
> + ? ? ? movl ? ?%cr0, %eax
> + ? ? ? orl ? ? $1,%eax
> ? ? ? ?movl ? ?%eax, %cr0
> - ? ? ? jmp ? ? next_line ? ? ? ? ? ? ? ? ? ? ? /* flush prefetch queue */
> +
> + ? ? ? /* flush prefetch queue */
> + ? ? ? jmp ? ? next_line
> ?next_line:
> ? ? ? ?movw ? ?$return_ptr, %ax
> ? ? ? ?movw ? ?%ax,%bp
> @@ -182,12 +192,13 @@ o32 cs ? ?ljmp ? ?*(%bp)
>
> ?.code32
> ?protected_mode:
> - ? ? ? movl ? ?$0x18,%eax ? ? ? ? ? ? ? ? ? ? ?/* reload GDT[3] */
> - ? ? ? movw ? ?%ax,%fs ? ? ? ? ? ? ? ? ? ? ? ? /* reset FS */
> - ? ? ? movw ? ?%ax,%ds ? ? ? ? ? ? ? ? ? ? ? ? /* reset DS */
> - ? ? ? movw ? ?%ax,%gs ? ? ? ? ? ? ? ? ? ? ? ? /* reset GS */
> - ? ? ? movw ? ?%ax,%es ? ? ? ? ? ? ? ? ? ? ? ? /* reset ES */
> - ? ? ? movw ? ?%ax,%ss ? ? ? ? ? ? ? ? ? ? ? ? /* reset SS */
> + ? ? ? /* Reload segment registers */
> + ? ? ? movl ? ?$0x18, %eax
> + ? ? ? movw ? ?%ax, %fs
> + ? ? ? movw ? ?%ax, %ds
> + ? ? ? movw ? ?%ax, %gs
> + ? ? ? movw ? ?%ax, %es
> + ? ? ? movw ? ?%ax, %ss
> ? ? ? ?movl ? ?saved_protected_mode_esp, %eax
> ? ? ? ?movl ? ?%eax, %esp
> ? ? ? ?popf
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 13/17] x86: Move do_go_exec() out of board.c
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 13/17] x86: Move do_go_exec() out of board.c Graeme Russ
@ 2012-01-12  5:01       ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  5:01 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- None
>
> ?arch/x86/lib/Makefile ? | ? ?1 +
> ?arch/x86/lib/board.c ? ?| ? 27 -------------------
> ?arch/x86/lib/cmd_boot.c | ? 64 +++++++++++++++++++++++++++++++++++++++++++++++
> ?3 files changed, 65 insertions(+), 27 deletions(-)
> ?create mode 100644 arch/x86/lib/cmd_boot.c
>
> diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
> index d584aa4..7820895 100644
> --- a/arch/x86/lib/Makefile
> +++ b/arch/x86/lib/Makefile
> @@ -32,6 +32,7 @@ SOBJS-$(CONFIG_SYS_X86_REALMODE) ? ? ?+= realmode_switch.o
> ?COBJS-$(CONFIG_SYS_PC_BIOS) ? ?+= bios_setup.o
> ?COBJS-y ? ? ? ?+= board.o
> ?COBJS-y ? ? ? ?+= bootm.o
> +COBJS-y ? ? ? ?+= cmd_boot.o
> ?COBJS-y ? ? ? ?+= gcc.o
> ?COBJS-y ? ? ? ?+= interrupts.o
> ?COBJS-$(CONFIG_SYS_PCAT_INTERRUPTS) += pcat_interrupts.o
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index a240d26..aaffd1b 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -487,33 +487,6 @@ void hang(void)
> ? ? ? ? ? ? ? ?;
> ?}
>
> -unsigned long do_go_exec(ulong (*entry)(int, char * const []),
> - ? ? ? ? ? ? ? ? ? ? ? ?int argc, char * const argv[])
> -{
> - ? ? ? unsigned long ret = 0;
> - ? ? ? char **argv_tmp;
> -
> - ? ? ? /*
> - ? ? ? ?* x86 does not use a dedicated register to pass the pointer to
> - ? ? ? ?* the global_data, so it is instead passed as argv[-1]. By using
> - ? ? ? ?* argv[-1], the called 'Application' can use the contents of
> - ? ? ? ?* argv natively. However, to safely use argv[-1] a new copy of
> - ? ? ? ?* argv is needed with the extra element
> - ? ? ? ?*/
> - ? ? ? argv_tmp = malloc(sizeof(char *) * (argc + 1));
> -
> - ? ? ? if (argv_tmp) {
> - ? ? ? ? ? ? ? argv_tmp[0] = (char *)gd;
> -
> - ? ? ? ? ? ? ? memcpy(&argv_tmp[1], argv, (size_t)(sizeof(char *) * argc));
> -
> - ? ? ? ? ? ? ? ret = (entry) (argc, &argv_tmp[1]);
> - ? ? ? ? ? ? ? free(argv_tmp);
> - ? ? ? }
> -
> - ? ? ? return ret;
> -}
> -
> ?void setup_pcat_compatibility(void)
> ? ? ? ?__attribute__((weak, alias("__setup_pcat_compatibility")));
>
> diff --git a/arch/x86/lib/cmd_boot.c b/arch/x86/lib/cmd_boot.c
> new file mode 100644
> index 0000000..a81a9a3
> --- /dev/null
> +++ b/arch/x86/lib/cmd_boot.c
> @@ -0,0 +1,64 @@
> +/*
> + * (C) Copyright 2008-2011
> + * Graeme Russ, <graeme.russ@gmail.com>
> + *
> + * (C) Copyright 2002
> + * Daniel Engstr?m, Omicron Ceti AB, <daniel@omicron.se>
> + *
> + * (C) Copyright 2002
> + * Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
> + *
> + * (C) Copyright 2002
> + * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
> + * Marius Groeger <mgroeger@sysgo.de>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ?See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <common.h>
> +#include <command.h>
> +#include <malloc.h>
> +#include <asm/u-boot-x86.h>
> +
> +unsigned long do_go_exec(ulong (*entry)(int, char * const []),
> + ? ? ? ? ? ? ? ? ? ? ? ?int argc, char * const argv[])
> +{
> + ? ? ? unsigned long ret = 0;
> + ? ? ? char **argv_tmp;
> +
> + ? ? ? /*
> + ? ? ? ?* x86 does not use a dedicated register to pass the pointer to
> + ? ? ? ?* the global_data, so it is instead passed as argv[-1]. By using
> + ? ? ? ?* argv[-1], the called 'Application' can use the contents of
> + ? ? ? ?* argv natively. However, to safely use argv[-1] a new copy of
> + ? ? ? ?* argv is needed with the extra element
> + ? ? ? ?*/
> + ? ? ? argv_tmp = malloc(sizeof(char *) * (argc + 1));
> +
> + ? ? ? if (argv_tmp) {
> + ? ? ? ? ? ? ? argv_tmp[0] = (char *)gd;
> +
> + ? ? ? ? ? ? ? memcpy(&argv_tmp[1], argv, (size_t)(sizeof(char *) * argc));
> +
> + ? ? ? ? ? ? ? ret = (entry) (argc, &argv_tmp[1]);
> + ? ? ? ? ? ? ? free(argv_tmp);
> + ? ? ? }
> +
> + ? ? ? return ret;
> +}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 14/17] x86: Move setup_pcat_compatibility() out of board.c
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 14/17] x86: Move setup_pcat_compatibility() " Graeme Russ
@ 2012-01-12  5:02       ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  5:02 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> This function simply does not belong in board.c
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- Added commit message
>
> ?arch/x86/lib/board.c ?| ? ?7 -------
> ?arch/x86/lib/zimage.c | ? ?7 +++++++
> ?2 files changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index aaffd1b..416aa9e 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -486,10 +486,3 @@ void hang(void)
> ? ? ? ?for (;;)
> ? ? ? ? ? ? ? ?;
> ?}
> -
> -void setup_pcat_compatibility(void)
> - ? ? ? __attribute__((weak, alias("__setup_pcat_compatibility")));
> -
> -void __setup_pcat_compatibility(void)
> -{
> -}
> diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c
> index bb40517..2214286 100644
> --- a/arch/x86/lib/zimage.c
> +++ b/arch/x86/lib/zimage.c
> @@ -314,6 +314,13 @@ void boot_zimage(void *setup_base, void *load_address)
> ?#endif
> ?}
>
> +void setup_pcat_compatibility(void)
> + ? ? ? __attribute__((weak, alias("__setup_pcat_compatibility")));
> +
> +void __setup_pcat_compatibility(void)
> +{
> +}
> +
> ?int do_zboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
> ?{
> ? ? ? ?struct boot_params *base_ptr;
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 15/17] x86: Move relocation code out of board.c
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 15/17] x86: Move relocation code " Graeme Russ
  2012-01-07 22:15       ` Simon Glass
@ 2012-01-12  5:03       ` Simon Glass
  1 sibling, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  5:03 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- None
>
> ?arch/x86/lib/Makefile ? | ? ?1 +
> ?arch/x86/lib/board.c ? ?| ? 69 +---------------------------
> ?arch/x86/lib/relocate.c | ?115 +++++++++++++++++++++++++++++++++++++++++++++++
> ?3 files changed, 118 insertions(+), 67 deletions(-)
> ?create mode 100644 arch/x86/lib/relocate.c
>
> diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
> index 7820895..57b6896 100644
> --- a/arch/x86/lib/Makefile
> +++ b/arch/x86/lib/Makefile
> @@ -40,6 +40,7 @@ COBJS-$(CONFIG_SYS_GENERIC_TIMER) += pcat_timer.o
> ?COBJS-$(CONFIG_PCI) += pci.o
> ?COBJS-$(CONFIG_PCI) += pci_type1.o
> ?COBJS-$(CONFIG_SYS_X86_REALMODE) ? ? ? += realmode.o
> +COBJS-y ? ? ? ?+= relocate.o
> ?COBJS-y ? ? ? ?+= string.o
> ?COBJS-$(CONFIG_SYS_X86_ISR_TIMER) ? ? ?+= timer.o
> ?COBJS-$(CONFIG_VIDEO) ?+= video_bios.o
> diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
> index 416aa9e..bebb347 100644
> --- a/arch/x86/lib/board.c
> +++ b/arch/x86/lib/board.c
> @@ -41,7 +41,6 @@
> ?#include <ide.h>
> ?#include <serial.h>
> ?#include <asm/u-boot-x86.h>
> -#include <elf.h>
> ?#include <asm/processor.h>
>
> ?#ifdef CONFIG_BITBANGMII
> @@ -117,9 +116,6 @@ static void display_flash_config(ulong size)
> ?typedef int (init_fnc_t) (void);
>
> ?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);
> ?static int copy_gd_to_ram(void);
>
> ?init_fnc_t *init_sequence_f[] = {
> @@ -183,59 +179,6 @@ static int calculate_relocation_address(void)
> ? ? ? ?return 0;
> ?}
>
> -static int copy_uboot_to_ram(void)
> -{
> - ? ? ? size_t len = (size_t)&__data_end - (size_t)&__text_start;
> -
> - ? ? ? memcpy((void *)gd->relocaddr, (void *)&__text_start, len);
> -
> - ? ? ? return 0;
> -}
> -
> -static int clear_bss(void)
> -{
> - ? ? ? ulong dst_addr = (ulong)&__bss_start + gd->reloc_off;
> - ? ? ? size_t len = (size_t)&__bss_end - (size_t)&__bss_start;
> -
> - ? ? ? memset((void *)dst_addr, 0x00, len);
> -
> - ? ? ? return 0;
> -}
> -
> -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);
> -
> - ? ? ? Elf32_Addr *offset_ptr_rom;
> - ? ? ? Elf32_Addr *offset_ptr_ram;
> -
> - ? ? ? /* The size of the region of u-boot that runs out of RAM. */
> - ? ? ? uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
> -
> - ? ? ? do {
> - ? ? ? ? ? ? ? /* Get the location from the relocation entry */
> - ? ? ? ? ? ? ? offset_ptr_rom = (Elf32_Addr *)re_src->r_offset;
> -
> - ? ? ? ? ? ? ? /* Check that the location of the relocation is in .text */
> - ? ? ? ? ? ? ? if (offset_ptr_rom >= (Elf32_Addr *)CONFIG_SYS_TEXT_BASE) {
> -
> - ? ? ? ? ? ? ? ? ? ? ? /* Switch to the in-RAM version */
> - ? ? ? ? ? ? ? ? ? ? ? offset_ptr_ram = (Elf32_Addr *)((ulong)offset_ptr_rom +
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gd->reloc_off);
> -
> - ? ? ? ? ? ? ? ? ? ? ? /* Check that the target points into .text */
> - ? ? ? ? ? ? ? ? ? ? ? if (*offset_ptr_ram >= CONFIG_SYS_TEXT_BASE &&
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *offset_ptr_ram <
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (CONFIG_SYS_TEXT_BASE + size)) {
> - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *offset_ptr_ram += 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)
> ?{
> @@ -270,17 +213,9 @@ void board_init_f_r(void)
> ? ? ? ?if (init_cache() != 0)
> ? ? ? ? ? ? ? ?hang();
>
> - ? ? ? copy_uboot_to_ram();
> - ? ? ? clear_bss();
> - ? ? ? do_elf_reloc_fixups();
> -
> - ? ? ? /*
> - ? ? ? ?* Transfer execution from Flash to RAM by calculating the address
> - ? ? ? ?* of the in-RAM copy of board_init_r() and calling it
> - ? ? ? ?*/
> - ? ? ? (board_init_r + gd->reloc_off)(gd, gd->relocaddr);
> + ? ? ? relocate_code(0, gd, 0);
>
> - ? ? ? /* NOTREACHED - board_init_r() does not return */
> + ? ? ? /* NOTREACHED - relocate_code() does not return */
> ? ? ? ?while (1)
> ? ? ? ? ? ? ? ?;
> ?}
> diff --git a/arch/x86/lib/relocate.c b/arch/x86/lib/relocate.c
> new file mode 100644
> index 0000000..badb5f8
> --- /dev/null
> +++ b/arch/x86/lib/relocate.c
> @@ -0,0 +1,115 @@
> +/*
> + * (C) Copyright 2008-2011
> + * Graeme Russ, <graeme.russ@gmail.com>
> + *
> + * (C) Copyright 2002
> + * Daniel Engstr?m, Omicron Ceti AB, <daniel@omicron.se>
> + *
> + * (C) Copyright 2002
> + * Wolfgang Denk, DENX Software Engineering, <wd@denx.de>
> + *
> + * (C) Copyright 2002
> + * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
> + * Marius Groeger <mgroeger@sysgo.de>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ?See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <common.h>
> +#include <malloc.h>
> +#include <asm/u-boot-x86.h>
> +#include <elf.h>
> +
> +static int copy_uboot_to_ram(void);
> +static int clear_bss(void);
> +static int do_elf_reloc_fixups(void);
> +
> +static int copy_uboot_to_ram(void)
> +{
> + ? ? ? size_t len = (size_t)&__data_end - (size_t)&__text_start;
> +
> + ? ? ? memcpy((void *)gd->relocaddr, (void *)&__text_start, len);
> +
> + ? ? ? return 0;
> +}
> +
> +static int clear_bss(void)
> +{
> + ? ? ? ulong dst_addr = (ulong)&__bss_start + gd->reloc_off;
> + ? ? ? size_t len = (size_t)&__bss_end - (size_t)&__bss_start;
> +
> + ? ? ? memset((void *)dst_addr, 0x00, len);
> +
> + ? ? ? return 0;
> +}
> +
> +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);
> +
> + ? ? ? Elf32_Addr *offset_ptr_rom;
> + ? ? ? Elf32_Addr *offset_ptr_ram;
> +
> + ? ? ? /* The size of the region of u-boot that runs out of RAM. */
> + ? ? ? uintptr_t size = (uintptr_t)&__bss_end - (uintptr_t)&__text_start;
> +
> + ? ? ? do {
> + ? ? ? ? ? ? ? /* Get the location from the relocation entry */
> + ? ? ? ? ? ? ? offset_ptr_rom = (Elf32_Addr *)re_src->r_offset;
> +
> + ? ? ? ? ? ? ? /* Check that the location of the relocation is in .text */
> + ? ? ? ? ? ? ? if (offset_ptr_rom >= (Elf32_Addr *)CONFIG_SYS_TEXT_BASE) {
> +
> + ? ? ? ? ? ? ? ? ? ? ? /* Switch to the in-RAM version */
> + ? ? ? ? ? ? ? ? ? ? ? offset_ptr_ram = (Elf32_Addr *)((ulong)offset_ptr_rom +
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gd->reloc_off);
> +
> + ? ? ? ? ? ? ? ? ? ? ? /* Check that the target points into .text */
> + ? ? ? ? ? ? ? ? ? ? ? if (*offset_ptr_ram >= CONFIG_SYS_TEXT_BASE &&
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *offset_ptr_ram <
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (CONFIG_SYS_TEXT_BASE + size)) {
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *offset_ptr_ram += gd->reloc_off;
> + ? ? ? ? ? ? ? ? ? ? ? }
> + ? ? ? ? ? ? ? }
> + ? ? ? } while (re_src++ < re_end);
> +
> + ? ? ? return 0;
> +}
> +
> +void relocate_code(ulong dummy_1, gd_t *id, ulong dummy_2)
> +{
> + ? ? ? /*
> + ? ? ? ?* Copy U-Boot into RAM, clear the BSS and perform relocation
> + ? ? ? ?* adjustments
> + ? ? ? ?*/
> + ? ? ? copy_uboot_to_ram();
> + ? ? ? clear_bss();
> + ? ? ? do_elf_reloc_fixups();
> +
> + ? ? ? /*
> + ? ? ? ?* Transfer execution from Flash to RAM by calculating the address
> + ? ? ? ?* of the in-RAM copy of board_init_r() and calling it
> + ? ? ? ?*/
> + ? ? ? (board_init_r + gd->reloc_off)(gd, gd->relocaddr);
> +
> + ? ? ? /* NOTREACHED - board_init_r() does not return */
> + ? ? ? while (1)
> + ? ? ? ? ? ? ? ;
> +}
> --
> 1.7.5.2.317.g391b14
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 16/17] x86: Split init functions out of board.c
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 16/17] x86: Split init functions " Graeme Russ
@ 2012-01-12  5:03       ` Simon Glass
  0 siblings, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  5:03 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> This patch moves towards reducing board.c to simply a set of init cores for
> the three initialisation phases (Flash, Flash/RAM, and RAM), a set of three
> init function arrays and a init function array processing function
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- Changes patch title
> ?- Tweak commit message
>
> ?arch/x86/include/asm/init_helpers.h ?| ? 39 +++++
> ?arch/x86/include/asm/init_wrappers.h | ? 42 +++++
> ?arch/x86/lib/Makefile ? ? ? ? ? ? ? ?| ? ?2 +
> ?arch/x86/lib/board.c ? ? ? ? ? ? ? ? | ?297 +++++++++-------------------------
> ?arch/x86/lib/init_helpers.c ? ? ? ? ?| ?142 ++++++++++++++++
> ?arch/x86/lib/init_wrappers.c ? ? ? ? | ?137 ++++++++++++++++
> ?6 files changed, 438 insertions(+), 221 deletions(-)
> ?create mode 100644 arch/x86/include/asm/init_helpers.h
> ?create mode 100644 arch/x86/include/asm/init_wrappers.h
> ?create mode 100644 arch/x86/lib/init_helpers.c
> ?create mode 100644 arch/x86/lib/init_wrappers.c
>

^ permalink raw reply	[flat|nested] 87+ messages in thread

* [U-Boot] [PATCH v2 17/17] x86: Convert board_init_f_r to a processing loop
  2012-01-04 19:59     ` [U-Boot] [PATCH v2 17/17] x86: Convert board_init_f_r to a processing loop Graeme Russ
  2012-01-07 22:21       ` Simon Glass
@ 2012-01-12  5:04       ` Simon Glass
  1 sibling, 0 replies; 87+ messages in thread
From: Simon Glass @ 2012-01-12  5:04 UTC (permalink / raw)
  To: u-boot

On Wed, Jan 4, 2012 at 11:59 AM, Graeme Russ <graeme.russ@gmail.com> wrote:
> Create an init function array for board_init_f_r - This finalises the
> migration to a purely array based initialisation mechanism
>
> Also tweak a few comments while we are at it so everything is 'correct'
>
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>

Acked-by: Simon Glass <sjg@chromium.org>

> ---
> Changes for v2:
> ?- Renamed to a more apt name
> ?- Fix bug in set_reloc_flag_r
> ?- Re-instate gd->flags = boot_flags; in board_init_f
> ?- Added commit message
>
> ?arch/x86/include/asm/init_helpers.h | ? ?5 +
> ?arch/x86/include/asm/relocate.h ? ? | ? 33 ++++++
> ?arch/x86/lib/board.c ? ? ? ? ? ? ? ?| ?186 +++++++++++++++++------------------
> ?arch/x86/lib/init_helpers.c ? ? ? ? | ? 75 ++++++++++++++
> ?arch/x86/lib/relocate.c ? ? ? ? ? ? | ? 32 +-----
> ?5 files changed, 206 insertions(+), 125 deletions(-)
> ?create mode 100644 arch/x86/include/asm/relocate.h
>

^ permalink raw reply	[flat|nested] 87+ messages in thread

end of thread, other threads:[~2012-01-12  5:04 UTC | newest]

Thread overview: 87+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 01/17] x86: Import glibc memcpy implementation Graeme Russ
2012-01-04  5:18   ` Simon Glass
2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
2012-01-04 19:59     ` [U-Boot] [PATCH v2 02/17] x86: Speed up copy-to-RAM and clear BSS operations Graeme Russ
2012-01-04 20:04       ` Graeme Russ
2012-01-12  4:45       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 03/17] x86: Remove GDR related magic numbers Graeme Russ
2012-01-07 22:05       ` Simon Glass
2012-01-12  4:46       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 04/17] x86: Rework Global Descriptor Table loading Graeme Russ
2012-01-12  4:47       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 05/17] x86: Simplify Flash-to-RAM code execution transition Graeme Russ
2012-01-12  4:48       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 06/17] x86: Rework relocation calculations Graeme Russ
2012-01-12  4:49       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 07/17] x86: Use fs for global data Graeme Russ
2012-01-12  4:51       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot Graeme Russ
2012-01-12  4:51       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 09/17] x86: Create weak init_cache() and default enable_caches() functions Graeme Russ
2012-01-12  4:55       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 10/17] x86: Allow cache before copy to RAM Graeme Russ
2012-01-12  4:56       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 11/17] x86: Tweak IDT and GDT for alignment and readability Graeme Russ
2012-01-12  5:00       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 12/17] CHECKPATCH: arch/x86/lib/* Graeme Russ
2012-01-12  5:01       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 13/17] x86: Move do_go_exec() out of board.c Graeme Russ
2012-01-12  5:01       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 14/17] x86: Move setup_pcat_compatibility() " Graeme Russ
2012-01-12  5:02       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 15/17] x86: Move relocation code " Graeme Russ
2012-01-07 22:15       ` Simon Glass
2012-01-08  9:04         ` Graeme Russ
2012-01-08 17:59           ` Simon Glass
2012-01-12  5:03       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 16/17] x86: Split init functions " Graeme Russ
2012-01-12  5:03       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 17/17] x86: Convert board_init_f_r to a processing loop Graeme Russ
2012-01-07 22:21       ` Simon Glass
2012-01-08  9:10         ` Graeme Russ
2012-01-08 18:01           ` Simon Glass
2012-01-12  5:04       ` Simon Glass
2012-01-12  4:44     ` [U-Boot] [PATCH v2 01/17] x86: Import glibc memcpy implementation Simon Glass
2012-01-02  4:09 ` [U-Boot] [PATCH 02/17] x86: Speed up copy-to-RAM and clear BSS operations Graeme Russ
2012-01-04  5:21   ` Simon Glass
2012-01-04 10:04     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 03/17] x86: Remove GDR related magic numbers Graeme Russ
2012-01-04  5:23   ` Simon Glass
2012-01-04 10:20     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 04/17] x86: Rework Global Descriptor Table loading Graeme Russ
2012-01-04  5:24   ` Simon Glass
2012-01-04 10:30     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 05/17] x86: Simplify Flash-to-RAM code execution transition Graeme Russ
2012-01-04  5:28   ` Simon Glass
2012-01-04 10:59     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 06/17] x86: Rework relocation calcuations Graeme Russ
2012-01-04  5:30   ` Simon Glass
2012-01-02  4:09 ` [U-Boot] [PATCH 07/17] x86: Use fs for global data Graeme Russ
2012-01-04  5:36   ` Simon Glass
2012-01-04 11:14     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot Graeme Russ
2012-01-04  5:37   ` Simon Glass
2012-01-02  4:09 ` [U-Boot] [PATCH 09/17] x86: Create weak init_cache() function Graeme Russ
2012-01-04  5:38   ` Simon Glass
2012-01-04 11:25     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 10/17] x86: Allow cache before copy to RAM Graeme Russ
2012-01-04  5:40   ` Simon Glass
2012-01-04 11:29     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 11/17] CHECKPATCH: arch/x86/cpu/* Graeme Russ
2012-01-04  5:42   ` Simon Glass
2012-01-04 11:35     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 12/17] CHECKPATCH: arch/x86/lib/* Graeme Russ
2012-01-04  5:47   ` Simon Glass
2012-01-02  4:09 ` [U-Boot] [PATCH 13/17] x86: Move do_go_exec() out of board.c Graeme Russ
2012-01-04  5:48   ` Simon Glass
2012-01-02  4:09 ` [U-Boot] [PATCH 14/17] x86: Move setup_pcat_compatibility() " Graeme Russ
2012-01-04  5:48   ` Simon Glass
2012-01-04 11:38     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 15/17] x86: Move relocation code " Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 16/17] x86: Simplify board.c Graeme Russ
2012-01-04  5:51   ` Simon Glass
2012-01-04 11:50     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 17/17] x86: Tweak initialisation procedure Graeme Russ
2012-01-04  5:52   ` Simon Glass
2012-01-04 12:02     ` Graeme Russ

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.