]> git.sur5r.net Git - u-boot/blobdiff - arch/x86/cpu/start16.S
Merge branch 'master' of git://git.denx.de/u-boot-arm
[u-boot] / arch / x86 / cpu / start16.S
index f1b9d0a0c9719f0c9946bc4243c43802a529323d..603bf1d2d3ecf8a05ae79c54e2bd4dd267800432 100644 (file)
@@ -5,7 +5,7 @@
  * Graeme Russ, <graeme.russ@gmail.com>
  *
  * (C) Copyright 2002,2003
- * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
+ * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -50,7 +50,7 @@ board_init16_ret:
 
        /* Turn of cache (this might require a 486-class CPU) */
        movl    %cr0, %eax
-       orl     $(X86_CR0_NW & X86_CR0_CD), %eax
+       orl     $(X86_CR0_NW | X86_CR0_CD), %eax
        movl    %eax, %cr0
        wbinvd
 
@@ -89,7 +89,11 @@ gdt_ptr:
        .word   0x20            /* limit (32 bytes = 4 GDT entries) */
        .long   BOOT_SEG + gdt  /* base */
 
-       /* The GDT table ...
+/* Some CPUs are picky about GDT alignment... */
+.align 16
+gdt:
+       /*
+        * The GDT table ...
         *
         *       Selector       Type
         *       0x00           NULL
@@ -97,17 +101,46 @@ gdt_ptr:
         *       0x10           32bit code
         *       0x18           32bit data/stack
         */
+       /* The NULL Desciptor - Mandatory */
+       .word   0x0000          /* limit_low */
+       .word   0x0000          /* base_low */
+       .byte   0x00            /* base_middle */
+       .byte   0x00            /* access */
+       .byte   0x00            /* flags + limit_high */
+       .byte   0x00            /* base_high */
 
-gdt:
-       .word   0, 0, 0, 0      /* NULL  */
-       .word   0, 0, 0, 0      /* unused */
+       /* Unused Desciptor - (matches Linux) */
+       .word   0x0000          /* limit_low */
+       .word   0x0000          /* base_low */
+       .byte   0x00            /* base_middle */
+       .byte   0x00            /* access */
+       .byte   0x00            /* flags + limit_high */
+       .byte   0x00            /* base_high */
 
-       .word   0xFFFF          /* 4Gb - (0x100000*0x1000 = 4Gb) */
-       .word   0               /* base address = 0 */
-       .word   0x9B00          /* code read/exec */
-       .word   0x00CF          /* granularity = 4096, 386 (+5th nibble of limit) */
+       /*
+        * The Code Segment Descriptor:
+        * - Base   = 0x00000000
+        * - Size   = 4GB
+        * - Access = Present, Ring 0, Exec (Code), Readable
+        * - Flags  = 4kB Granularity, 32-bit
+        */
+       .word   0xffff          /* limit_low */
+       .word   0x0000          /* base_low */
+       .byte   0x00            /* base_middle */
+       .byte   0x9b            /* access */
+       .byte   0xcf            /* flags + limit_high */
+       .byte   0x00            /* base_high */
 
-       .word   0xFFFF          /* 4Gb - (0x100000*0x1000 = 4Gb) */
-       .word   0x0             /* base address = 0 */
-       .word   0x9300          /* data read/write */
-       .word   0x00CF          /* granularity = 4096, 386 (+5th nibble of limit) */
+       /*
+        * The Data Segment Descriptor:
+        * - Base   = 0x00000000
+        * - Size   = 4GB
+        * - Access = Present, Ring 0, Non-Exec (Data), Writable
+        * - Flags  = 4kB Granularity, 32-bit
+        */
+       .word   0xffff          /* limit_low */
+       .word   0x0000          /* base_low */
+       .byte   0x00            /* base_middle */
+       .byte   0x93            /* access */
+       .byte   0xcf            /* flags + limit_high */
+       .byte   0x00            /* base_high */