]> git.sur5r.net Git - u-boot/blobdiff - arch/i386/cpu/start16.S
Merge branch 'master' of git://git.denx.de/u-boot-mips
[u-boot] / arch / i386 / cpu / start16.S
index 5e33aa1069c7b25652d422b7ec8d189dd37ec469..7dc53583662509b5a63704e7089f488709e3638d 100644 (file)
@@ -22,6 +22,8 @@
  * MA 02111-1307 USA
  */
 
+#include <asm/global_data.h>
+#include <asm/processor-flags.h>
 
 #define BOOT_SEG       0xffff0000      /* linear segment of boot code */
 #define a32            .byte 0x67;
 .code16
 .globl start16
 start16:
-       /* First we let the BSP do some early initialization
+       /* Set the Cold Boot / Hard Reset flag */
+       movl    $GD_FLG_COLD_BOOT, %ebx
+
+       /*
+        * First we let the BSP do some early initialization
         * this code have to map the flash to its final position
         */
-       mov     $board_init16_ret, %bp
        jmp     board_init16
+.globl board_init16_ret
 board_init16_ret:
 
        /* Turn of cache (this might require a 486-class CPU) */
        movl    %cr0, %eax
-       orl     $0x60000000,%eax
+       orl     $(X86_CR0_NW & X86_CR0_CD), %eax
        movl    %eax, %cr0
        wbinvd
 
-       /* load the descriptor tables */
+       /* load the temporary Global Descriptor Table */
+o32 cs lidt    idt_ptr
 o32 cs lgdt    gdt_ptr
 
        /* Now, we enter protected mode */
        movl    %cr0, %eax
-       orl     $1,%eax
+       orl     $X86_CR0_PE, %eax
        movl    %eax, %cr0
 
        /* Flush the prefetch queue */
        jmp     ff
 ff:
-       /* Tell 32-bit code it is being entered from hard-reset */
-       movw    $0x0001, %bx
-
        /* Finally jump to the 32bit initialization code */
        movw    $code32start, %ax
-       movw    %ax,%bp
+       movw    %ax, %bp
 o32 cs ljmp    *(%bp)
 
        /* 48-bit far pointer */
@@ -68,8 +72,17 @@ code32start:
        .long   _start          /* offset */
        .word   0x10            /* segment */
 
+idt_ptr:
+       .word   0               /* limit */
+       .long   0               /* base */
+
+/*
+ * The following Global Descriptor Table is just enough to get us into
+ * 'Flat Protected Mode' - It will be discarded as soon as the final
+ * GDT is setup in a safe location in RAM
+ */
 gdt_ptr:
-       .word   0x30            /* limit (48 bytes = 6 GDT entries) */
+       .word   0x20            /* limit (32 bytes = 4 GDT entries) */
        .long   BOOT_SEG + gdt  /* base */
 
        /* The GDT table ...
@@ -79,8 +92,6 @@ gdt_ptr:
         *       0x08           Unused
         *       0x10           32bit code
         *       0x18           32bit data/stack
-        *       0x20           16bit code
-        *       0x28           16bit data/stack
         */
 
 gdt:
@@ -96,13 +107,3 @@ gdt:
        .word   0x0             /* base address = 0 */
        .word   0x9300          /* data read/write */
        .word   0x00CF          /* granularity = 4096, 386 (+5th nibble of limit) */
-
-       .word   0xFFFF          /* 64kb */
-       .word   0               /* base address = 0 */
-       .word   0x9b00          /* data read/write */
-       .word   0x0010          /* granularity = 1  (+5th nibble of limit) */
-
-       .word   0xFFFF          /* 64kb */
-       .word   0               /* base address = 0 */
-       .word   0x9300          /* data read/write */
-       .word   0x0010          /* granularity = 1 (+5th nibble of limit) */