diff options
Diffstat (limited to 'arch/x86/cpu')
-rw-r--r-- | arch/x86/cpu/Makefile | 4 | ||||
-rw-r--r-- | arch/x86/cpu/start.S | 13 | ||||
-rw-r--r-- | arch/x86/cpu/start16.S | 2 |
3 files changed, 16 insertions, 3 deletions
diff --git a/arch/x86/cpu/Makefile b/arch/x86/cpu/Makefile index 415bc24..e7bb3e3 100644 --- a/arch/x86/cpu/Makefile +++ b/arch/x86/cpu/Makefile @@ -9,5 +9,5 @@ # extra-y = start.o -extra-$(CONFIG_X86_RESET_VECTOR) += resetvec.o start16.o -obj-y = interrupts.o cpu.o +obj-$(CONFIG_X86_RESET_VECTOR) += resetvec.o start16.o +obj-y += interrupts.o cpu.o diff --git a/arch/x86/cpu/start.S b/arch/x86/cpu/start.S index 329bb3a..338bab1 100644 --- a/arch/x86/cpu/start.S +++ b/arch/x86/cpu/start.S @@ -85,12 +85,25 @@ car_init_ret: /* Align global data to 16-byte boundary */ andl $0xfffffff0, %esp + /* 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 */ movl %esp, %eax /* Reserve space for global descriptor table */ subl $X86_GDT_SIZE, %esp +#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 + /* Align temporary global descriptor table to 16-byte boundary */ andl $0xfffffff0, %esp diff --git a/arch/x86/cpu/start16.S b/arch/x86/cpu/start16.S index 8b9b327..6968fda 100644 --- a/arch/x86/cpu/start16.S +++ b/arch/x86/cpu/start16.S @@ -70,7 +70,7 @@ idt_ptr: * GDT is setup in a safe location in RAM */ gdt_ptr: - .word 0x20 /* limit (32 bytes = 4 GDT entries) */ + .word 0x1f /* limit (31 bytes = 4 GDT entries - 1) */ .long BOOT_SEG + gdt /* base */ /* Some CPUs are picky about GDT alignment... */ |