Two hda_verb.h files: Add more comments.
[coreboot.git] / src / arch / i386 / lib / c_start.S
index d2d8b435bc316ff29a2c133dd6207af64a6ad28b..94ce4a70c3ed0efbbf8005cb032bf166a853ffa4 100644 (file)
@@ -1,5 +1,4 @@
-#include <arch/asm.h>
-#include <arch/intel.h>
+#include <cpu/x86/post_code.h>
 
        .section ".text"
        .code32
@@ -15,14 +14,14 @@ _start:
        movl    %eax, %fs
        movl    %eax, %gs
 
-       intel_chip_post_macro(0x13)             /* post 13 */
+       post_code(0x13)         /* post 13 */
 
        /** clear stack */
        cld
        leal    _stack, %edi
        movl    $_estack, %ecx
        subl    %edi, %ecx
-       shrl    $2, %ecx   /* it is 32 bit align, right? */
+       shrl    $2, %ecx   /* it is 32 bit aligned, right? */
        xorl    %eax, %eax
        rep
        stosl
@@ -32,7 +31,7 @@ _start:
        movl    $_ebss, %ecx
        subl    %edi, %ecx
        jz      .Lnobss
-       shrl    $2, %ecx  /* it is 32 bit align, right? */
+       shrl    $2, %ecx  /* it is 32 bit aligned, right? */
        xorl    %eax, %eax
        rep
        stosl
@@ -73,20 +72,20 @@ _start:
         *      Now we are finished. Memory is up, data is copied and
         *      bss is cleared.   Now we call the main routine and
         *      let it do the rest.
-        */ 
-       intel_chip_post_macro(0xfe)     /* post fe */
+        */
+       post_code(0xfe) /* post fe */
 
        /* Restore the stack location */
        movl    %ebp, %esp
-       
+
        /* The boot_complete flag has already been pushed */
        call    hardwaremain
-       /*NOTREACHED*/
+       /* NOTREACHED */
 .Lhlt:
-       intel_chip_post_macro(0xee)     /* post ee */
+       post_code(0xee) /* post ee */
        hlt
        jmp     .Lhlt
-       
+
 vec0:
        pushl   $0 /* error code */
        pushl   $0 /* vector */
@@ -95,103 +94,104 @@ vec1:
        pushl   $0 /* error code */
        pushl   $1 /* vector */
        jmp int_hand
-       
+
 vec2:
        pushl   $0 /* error code */
        pushl   $2 /* vector */
        jmp int_hand
-       
+
 vec3:
        pushl   $0 /* error code */
        pushl   $3 /* vector */
        jmp     int_hand
-       
+
 vec4:
        pushl   $0 /* error code */
        pushl   $4 /* vector */
        jmp     int_hand
-       
+
 vec5:
        pushl   $0 /* error code */
        pushl   $5 /* vector */
        jmp     int_hand
-       
+
 vec6:
        pushl   $0 /* error code */
        pushl   $6 /* vector */
        jmp     int_hand
-       
+
 vec7:
        pushl   $0 /* error code */
        pushl   $7 /* vector */
        jmp     int_hand
-       
+
 vec8:
        /* error code */
        pushl   $8 /* vector */
        jmp     int_hand
        .word   0x9090
-       
+
 vec9:
        pushl   $0 /* error code */
        pushl   $9 /* vector */
        jmp int_hand
-       
+
 vec10:
        /* error code */
        pushl   $10 /* vector */
        jmp     int_hand
        .word   0x9090
-       
+
 vec11:
        /* error code */
        pushl   $11 /* vector */
        jmp     int_hand
        .word   0x9090
-               
+
 vec12:
        /* error code */
        pushl   $12 /* vector */
        jmp     int_hand
        .word   0x9090
-       
+
 vec13:
        /* error code */
        pushl   $13 /* vector */
        jmp     int_hand
        .word   0x9090
-       
+
 vec14:
        /* error code */
        pushl   $14 /* vector */
        jmp     int_hand
        .word   0x9090
-       
+
 vec15:
        pushl   $0 /* error code */
        pushl   $15 /* vector */
        jmp     int_hand
-       
+
 vec16:
        pushl   $0 /* error code */
        pushl   $16 /* vector */
        jmp     int_hand
-       
+
 vec17:
        /* error code */
        pushl   $17 /* vector */
        jmp     int_hand
        .word   0x9090
-       
+
 vec18:
        pushl   $0 /* error code */
        pushl   $18 /* vector */
        jmp     int_hand
-       
+
 vec19:
        pushl   $0 /* error code */
        pushl   $19 /* vector */
        jmp     int_hand
+
 int_hand:
        /* At this point on the stack there is:
         *  0(%esp) vector
@@ -233,7 +233,7 @@ int_hand:
        .globl gdb_stub_breakpoint
 gdb_stub_breakpoint:
        popl    %eax    /* Return address */
-       pushfl  
+       pushfl
        pushl   %cs
        pushl   %eax    /* Return address */
        pushl   $0      /* No error code */
@@ -253,7 +253,16 @@ gdtaddr:
 
        /* This is the gdt for GCC part of coreboot.
         * It is different from the gdt in ROMCC/ASM part of coreboot
-        * which is defined in entry32.inc */ /* BUT WHY?? */
+        * which is defined in entry32.inc
+        *
+        * When the machine is initially started, we use a very simple
+        * gdt from rom (that in entry32.inc) which only contains those
+        * entries we need for protected mode.
+        *
+        * When we're executing code from RAM, we want to do more complex
+        * stuff, like initializing PCI option roms in real mode, or doing
+        * a resume from a suspend to ram.
+        */
 gdt:
        /* selgdt 0, unused */
        .word   0x0000, 0x0000          /* dummy */
@@ -263,33 +272,45 @@ gdt:
        .word   0x0000, 0x0000          /* dummy */
        .byte   0x00, 0x00, 0x00, 0x00
 
-       /* selgdt 0x10, flat code segment */ 
-       .word   0xffff, 0x0000          
-       .byte   0x00, 0x9b, 0xcf, 0x00 /* G=1 and 0x0f, So we get 4Gbytes for limit */  
+       /* selgdt 0x10, flat code segment */
+       .word   0xffff, 0x0000
+       .byte   0x00, 0x9b, 0xcf, 0x00 /* G=1 and 0x0f, So we get 4Gbytes for limit */
 
        /* selgdt 0x18, flat data segment */
-       .word   0xffff, 0x0000          
-       .byte   0x00, 0x93, 0xcf, 0x00  
+       .word   0xffff, 0x0000
+       .byte   0x00, 0x93, 0xcf, 0x00
 
        /* selgdt 0x20, unused */
        .word   0x0000, 0x0000          /* dummy */
        .byte   0x00, 0x00, 0x00, 0x00
 
-       /* selgdt 0x28 16-bit 64k code at 0x00000000 */
+       /* The next two entries are used for executing VGA option ROMs */
+
+       /* selgdt 0x28 16 bit 64k code at 0x00000000 */
        .word   0xffff, 0x0000
        .byte   0, 0x9a, 0, 0
 
-       /* selgdt 0x30 16-bit 64k data at 0x00000000 */
+       /* selgdt 0x30 16 bit 64k data at 0x00000000 */
        .word   0xffff, 0x0000
        .byte   0, 0x92, 0, 0
+
+       /* The next two entries are used for ACPI S3 RESUME */
+
+       /* selgdt 0x38, flat data segment 16 bit */
+       .word   0x0000, 0x0000          /* dummy */
+       .byte   0x00, 0x93, 0x8f, 0x00 /* G=1 and 0x0f, So we get 4Gbytes for limit */
+
+       /* selgdt 0x40, flat code segment 16 bit */
+       .word   0xffff, 0x0000
+       .byte   0x00, 0x9b, 0x8f, 0x00 /* G=1 and 0x0f, So we get 4Gbytes for limit */
 gdt_end:
 
 idtarg:
        .word   _idt_end - _idt - 1     /* limit */
        .long   _idt
-       .word   0       
+       .word   0
 _idt:
-       .fill   20, 8, 0        # idt is unitiailzed
+       .fill   20, 8, 0        # idt is uninitialized
 _idt_end:
 
        .previous