diff options
author | Simon Glass <sjg@chromium.org> | 2014-11-06 20:20:04 (GMT) |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2014-11-21 06:24:09 (GMT) |
commit | 76f90f3020433a2d06d9ebf897f65862d6248c8e (patch) | |
tree | 34b8884c807e30ab8a583d675f8c52bce3a61614 | |
parent | 3c00695ee1d73ef52eadd7d4a1de9ecaab4f7be4 (diff) | |
download | u-boot-fsl-qoriq-76f90f3020433a2d06d9ebf897f65862d6248c8e.tar.xz |
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>
-rw-r--r-- | arch/x86/cpu/start.S | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S index 338bab1..781d324 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 |