summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2014-11-06 13:20:04 -0700
committerSimon Glass <sjg@chromium.org>2014-11-21 07:24:09 +0100
commit76f90f3020433a2d06d9ebf897f65862d6248c8e (patch)
tree34b8884c807e30ab8a583d675f8c52bce3a61614 /arch
parent3c00695ee1d73ef52eadd7d4a1de9ecaab4f7be4 (diff)
downloadblackbird-obmc-uboot-76f90f3020433a2d06d9ebf897f65862d6248c8e.tar.gz
blackbird-obmc-uboot-76f90f3020433a2d06d9ebf897f65862d6248c8e.zip
x86: Tidy up global descriptor table setup
This code is a little muddled, so tidy it up. Make sure that we put the GDT in the right place and set it up properly. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/cpu/start.S19
1 files changed, 16 insertions, 3 deletions
diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S
index 338bab19e4..781d32447b 100644
--- a/arch/x86/cpu/start.S
+++ b/arch/x86/cpu/start.S
@@ -74,6 +74,16 @@ car_init_ret:
* We now have CONFIG_SYS_CAR_SIZE bytes of Cache-As-RAM (or SRAM,
* or fully initialised SDRAM - we really don't care which)
* starting at CONFIG_SYS_CAR_ADDR to be used as a temporary stack
+ * and early malloc area.
+ *
+ * Stack grows down from top of CAR. We have:
+ *
+ * top-> CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE
+ * global_data
+ * x86 global descriptor table
+ * early malloc area
+ * stack
+ * bottom-> CONFIG_SYS_CAR_ADDR
*/
/* Stack grows down from top of CAR */
@@ -91,12 +101,16 @@ car_init_ret:
movl %esp, %edi
rep stosb
- /* Setup first parameter to setup_gdt */
+ /* Setup first parameter to setup_gdt, pointer to global_data */
movl %esp, %eax
/* Reserve space for global descriptor table */
subl $X86_GDT_SIZE, %esp
+ /* Align temporary global descriptor table to 16-byte boundary */
+ andl $0xfffffff0, %esp
+ movl %esp, %ecx
+
#if defined(CONFIG_SYS_MALLOC_F_LEN)
subl $CONFIG_SYS_MALLOC_F_LEN, %esp
movl %eax, %edx
@@ -108,14 +122,13 @@ car_init_ret:
andl $0xfffffff0, %esp
/* Set second parameter to setup_gdt */
- movl %esp, %edx
+ movl %ecx, %edx
/* Setup global descriptor table so gd->xyz works */
call setup_gdt
/* Set parameter to board_init_f() to boot flags */
xorl %eax, %eax
- movw %bx, %ax
/* Enter, U-boot! */
call board_init_f
OpenPOWER on IntegriCloud