soc/amd/stoneyridge: remove LIDS field from global NVS
[coreboot.git] / payloads / libpayload / arch / x86 / head.S
blob1052b8c94d88ede9155540625f64b4035f93affe
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         .text
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:
41         jmp _init
43         .align 4
45 #define MB_MAGIC 0x1BADB002
46 #define MB_FLAGS 0x00010003
48 mb_header:
49         .long MB_MAGIC
50         .long MB_FLAGS
51         .long -(MB_MAGIC + MB_FLAGS)
52         .long mb_header
53         .long _start
54         .long _edata
55         .long _end
56         .long _init
58 #define CB_MAGIC_VALUE  0x12345678
59 #define CB_MAGIC        0x04
60 #define CB_ARGV         0x08
61 #define CB_ARGC         0x10
64  * This function saves off the previous stack and switches us to our
65  * own execution environment.
66  */
67 _init:
68         /* No interrupts, please. */
69         cli
71         /* Store EAX and EBX */
72         movl %eax, loader_eax
73         movl %ebx, loader_ebx
75         /* Copy argv[] and argc as demanded by the Payload API,
76          * see https://www.coreboot.org/Payload_API and exec.S.
77          */
78         cmpl $CB_MAGIC_VALUE, CB_MAGIC(%esp)
79         jne 1f
81         movl CB_ARGV(%esp), %eax
82         movl %eax, main_argv
84         movl CB_ARGC(%esp), %eax
85         movl %eax, main_argc
87         /* Store current stack pointer and set up new stack. */
88         movl %esp, %eax
89         movl $_stack, %esp
90         pushl %eax
92         /* Enable special x86 functions if present. */
93         pushl %eax
94         pushl %ebx
95         pushl %ecx
96         pushl %edx
98         movl $0, %eax
99         cpuid
100         /* Test if CPUID(eax=1) is available. */
101         test %eax, %eax
102         je cpuid_done
104         /* Get CPU features. */
105         movl $1, %eax
106         cpuid
108 cpuid_fpu:
109         /* Test if x87 FPU is present */
110         test $1, %edx
111         je cpuid_sse
113         fninit
114         movl %cr0, %eax
115         andl $0xFFFFFFFB, %eax  /* clear EM */
116         orl $0x00000022, %eax   /* set MP, NE */
117         movl %eax, %cr0
119 cpuid_sse:
120         /* Test if SSE is available */
121         test $0x02000000, %edx
122         je cpuid_done
124         movl %cr4, %eax
125         orl $0x00000600, %eax   /* set OSFXSR, OSXMMEXCPT */
126         movl %eax, %cr4
128 cpuid_done:
129         popl %edx
130         popl %ecx
131         popl %ebx
132         popl %eax
134         /* Let's rock. */
135         call start_main
137         /* %eax has the return value - pass it on unmolested */
138 _leave:
139         /* Restore old stack. */
140         popl %esp
142         /* Return to the original context. */
143         ret