-#include <arch/asm.h>
-#include <arch/intel.h>
+#include <cpu/x86/post_code.h>
.section ".text"
.code32
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
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
* 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 */
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
.globl gdb_stub_breakpoint
gdb_stub_breakpoint:
popl %eax /* Return address */
- pushfl
+ pushfl
pushl %cs
pushl %eax /* Return address */
pushl $0 /* No error code */
/* 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 */
.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