X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=arch%2Fx86%2Fcpu%2Fstart.S;h=781d32447ba6c53a5fe50cc341b88c36f0be870d;hb=e1ffd81797d59652124bd9cda813a58644f5dea9;hp=e960e21f6e49d88979b3b502e163f646920dc41d;hpb=79f38777947ac7685e2cef8bd977f954ab198c0e;p=u-boot diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S index e960e21f6e..781d32447b 100644 --- a/arch/x86/cpu/start.S +++ b/arch/x86/cpu/start.S @@ -7,23 +7,7 @@ * (C) Copyright 2002 * Daniel Engström, Omicron Ceti AB, * - * 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 + * SPDX-License-Identifier: GPL-2.0+ */ #include @@ -90,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 */ @@ -101,7 +95,13 @@ car_init_ret: /* Align global data to 16-byte boundary */ andl $0xfffffff0, %esp - /* Setup first parameter to setup_gdt */ + /* Zero the global data since it won't happen later */ + xorl %eax, %eax + movl $GENERATED_GBL_DATA_SIZE, %ecx + movl %esp, %edi + rep stosb + + /* Setup first parameter to setup_gdt, pointer to global_data */ movl %esp, %eax /* Reserve space for global descriptor table */ @@ -109,19 +109,26 @@ car_init_ret: /* Align temporary global descriptor table to 16-byte boundary */ andl $0xfffffff0, %esp + movl %esp, %ecx - /* Set second parameter to setup_gdt */ - movl %esp, %edx +#if defined(CONFIG_SYS_MALLOC_F_LEN) + subl $CONFIG_SYS_MALLOC_F_LEN, %esp + movl %eax, %edx + addl $GD_MALLOC_BASE, %edx + movl %esp, (%edx) +#endif - /* gd->gd_addr = gd (Required to allow gd->xyz to work) */ - movl %eax, (%eax) + /* Align temporary global descriptor table to 16-byte boundary */ + andl $0xfffffff0, %esp + + /* Set second parameter to setup_gdt */ + 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 @@ -171,9 +178,6 @@ board_init_f_r_trampoline: /* Set second parameter to setup_gdt */ movl %esp, %edx - /* gd->gd_addr = gd (Required to allow gd->xyz to work) */ - movl %eax, (%eax) - /* Setup global descriptor table so gd->xyz works */ call setup_gdt