mb/google/skyrim: Enable Chrome EC
[coreboot.git] / src / arch / x86 / assembly_entry.S
blob6e730273f84faa4c71aa8bbadc9f83800b271929
1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #include <rules.h>
5 /*
6  * This path is for stages that are post bootblock. The gdt is reloaded
7  * to accommodate platforms that are executing out of CAR. In order to
8  * continue with C code execution one needs to set stack pointer and
9  * clear .bss variables that are stage specific.
10  */
12 #if CONFIG(RESET_VECTOR_IN_RAM)
13         #define _STACK_TOP _eearlyram_stack
14 #else
15         #define _STACK_TOP _ecar_stack
16 #endif
18 #if ENV_X86_64
19 .code64
20 #else
21 .code32
22 #endif
24 .section ".text._start", "ax", @progbits
25 .global _start
26 _start:
28         /* Migrate GDT to this text segment */
29 #if ENV_X86_64
30         call    gdt_init64
31 #else
32         call    gdt_init
33 #endif
35         /* reset stack pointer to CAR/EARLYRAM stack */
36         mov     $_STACK_TOP, %esp
38         /* clear .bss section as it is not shared */
39         cld
40         xor     %eax, %eax
41         movl    $(_ebss), %ecx
42         movl    $(_bss), %edi
43         sub     %edi, %ecx
44         shrl    $2, %ecx
45         rep     stosl
47 #if ((ENV_SEPARATE_VERSTAGE && CONFIG(VERSTAGE_DEBUG_SPINLOOP)) \
48         || (ENV_ROMSTAGE && CONFIG(ROMSTAGE_DEBUG_SPINLOOP)))
50         /* Wait for a JTAG debugger to break in and set EBX non-zero */
51         xor     %ebx, %ebx
53 debug_spinloop:
54         cmp     $0, %ebx
55         jz      debug_spinloop
56 #endif
58         andl    $0xfffffff0, %esp
59 #if CONFIG(IDT_IN_EVERY_STAGE)
60         call    exception_init
61 #endif
63 #if CONFIG(ASAN_IN_ROMSTAGE)
64         call    asan_init
65 #endif
66         call    car_stage_entry
68         /* Expect to never return. */
70         jmp     1b