libpayload: configs: Add new config.featuretest to broaden CI
[coreboot.git] / payloads / libpayload / arch / x86 / head.S
blob26ba901d5a16d342de595de2a27c111476ed9977
1 /*
2  *
3  * Copyright (C) 2008 Advanced Micro Devices, Inc.
4  * Copyright (C) 2017 Patrick Rudolph <siro@das-labor.org>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
30         .code32
31         .global _entry
32         .section .text._entry
33         .align 4
36  * Our entry point - assume that the CPU is in 32 bit protected mode and
37  * all segments are in a flat model. That's our operating mode, so we won't
38  * change anything.
39  */
40 _entry:
42         /* Add multiboot header and jump around it when building with multiboot support. */
43 #if CONFIG(LP_MULTIBOOT)
44         #include "multiboot_header.inc"
45 #endif
46         /* No interrupts, please. */
47         cli
49         /* save pointer to coreboot tables */
50         movl 4(%esp), %eax
51         movl %eax, cb_header_ptr
53         /* Store current stack pointer and set up new stack. */
54         movl %esp, %eax
55         movl $_estack, %esp
56         pushl %eax
58         /* Enable special x86 functions if present. */
59         pushl %eax
60         pushl %ebx
61         pushl %ecx
62         pushl %edx
64         movl $0, %eax
65         cpuid
66         /* Test if CPUID(eax=1) is available. */
67         test %eax, %eax
68         je cpuid_done
70         /* Get CPU features. */
71         movl $1, %eax
72         cpuid
74 cpuid_fpu:
75         /* Test if x87 FPU is present */
76         test $1, %edx
77         je cpuid_sse
79         fninit
80         movl %cr0, %eax
81         andl $0xFFFFFFFB, %eax  /* clear EM */
82         orl $0x00000022, %eax   /* set MP, NE */
83         movl %eax, %cr0
85 cpuid_sse:
86         /* Test if SSE is available */
87         test $0x02000000, %edx
88         je cpuid_done
90         movl %cr4, %eax
91         orl $0x00000600, %eax   /* set OSFXSR, OSXMMEXCPT */
92         movl %eax, %cr4
94 cpuid_done:
95         popl %edx
96         popl %ecx
97         popl %ebx
98         popl %eax
100         /* Let's rock. */
101         call start_main
103         /* %eax has the return value - pass it on unmolested */
104 _leave:
105         /* Restore old stack. */
106         popl %esp
108         /* Return to the original context. */
109         ret