coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
rules.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef _RULES_H
4 #define _RULES_H
5 
6 #if defined(__TEST__)
7 #define ENV_TEST 1
8 #else
9 #define ENV_TEST 0
10 #endif
11 
12 #if defined(__TIMELESS__)
13 #define ENV_TIMELESS 1
14 #else
15 #define ENV_TIMELESS 0
16 #endif
17 
18 /* Useful helpers to tell whether the code is executing in bootblock,
19  * romstage, ramstage or SMM.
20  */
21 
22 #if defined(__DECOMPRESSOR__)
23 #define ENV_DECOMPRESSOR 1
24 #define ENV_BOOTBLOCK 0
25 #define ENV_ROMSTAGE 0
26 #define ENV_RAMSTAGE 0
27 #define ENV_SMM 0
28 #define ENV_SEPARATE_VERSTAGE 0
29 #define ENV_RMODULE 0
30 #define ENV_POSTCAR 0
31 #define ENV_LIBAGESA 0
32 #define ENV_STRING "decompressor"
33 
34 #elif defined(__BOOTBLOCK__)
35 #define ENV_DECOMPRESSOR 0
36 #define ENV_BOOTBLOCK 1
37 #define ENV_ROMSTAGE 0
38 #define ENV_RAMSTAGE 0
39 #define ENV_SMM 0
40 #define ENV_SEPARATE_VERSTAGE 0
41 #define ENV_RMODULE 0
42 #define ENV_POSTCAR 0
43 #define ENV_LIBAGESA 0
44 #define ENV_STRING "bootblock"
45 
46 #elif defined(__ROMSTAGE__)
47 #define ENV_DECOMPRESSOR 0
48 #define ENV_BOOTBLOCK 0
49 #define ENV_ROMSTAGE 1
50 #define ENV_RAMSTAGE 0
51 #define ENV_SMM 0
52 #define ENV_SEPARATE_VERSTAGE 0
53 #define ENV_RMODULE 0
54 #define ENV_POSTCAR 0
55 #define ENV_LIBAGESA 0
56 #define ENV_STRING "romstage"
57 
58 #elif defined(__SMM__)
59 #define ENV_DECOMPRESSOR 0
60 #define ENV_BOOTBLOCK 0
61 #define ENV_ROMSTAGE 0
62 #define ENV_RAMSTAGE 0
63 #define ENV_SMM 1
64 #define ENV_SEPARATE_VERSTAGE 0
65 #define ENV_RMODULE 0
66 #define ENV_POSTCAR 0
67 #define ENV_LIBAGESA 0
68 #define ENV_STRING "smm"
69 
70 /*
71  * NOTE: "verstage" code may either run as a separate stage or linked into the
72  * bootblock/romstage, depending on the setting of the VBOOT_SEPARATE_VERSTAGE
73  * kconfig option. The ENV_SEPARATE_VERSTAGE macro will only return true for
74  * "verstage" code when CONFIG(VBOOT_SEPARATE_VERSTAGE) is true, otherwise that
75  * code will have ENV_BOOTBLOCK or ENV_ROMSTAGE set (depending on the
76  * "VBOOT_STARTS_IN_"... kconfig options).
77  */
78 #elif defined(__VERSTAGE__)
79 #define ENV_DECOMPRESSOR 0
80 #define ENV_BOOTBLOCK 0
81 #define ENV_ROMSTAGE 0
82 #define ENV_RAMSTAGE 0
83 #define ENV_SMM 0
84 #define ENV_SEPARATE_VERSTAGE 1
85 #define ENV_RMODULE 0
86 #define ENV_POSTCAR 0
87 #define ENV_LIBAGESA 0
88 #if CONFIG(VBOOT_STARTS_BEFORE_BOOTBLOCK)
89 #define ENV_STRING "verstage-before-bootblock"
90 #else
91 #define ENV_STRING "verstage"
92 #endif
93 
94 #elif defined(__RAMSTAGE__)
95 #define ENV_DECOMPRESSOR 0
96 #define ENV_BOOTBLOCK 0
97 #define ENV_ROMSTAGE 0
98 #define ENV_RAMSTAGE 1
99 #define ENV_SMM 0
100 #define ENV_SEPARATE_VERSTAGE 0
101 #define ENV_RMODULE 0
102 #define ENV_POSTCAR 0
103 #define ENV_LIBAGESA 0
104 #define ENV_STRING "ramstage"
105 
106 #elif defined(__RMODULE__)
107 #define ENV_DECOMPRESSOR 0
108 #define ENV_BOOTBLOCK 0
109 #define ENV_ROMSTAGE 0
110 #define ENV_RAMSTAGE 0
111 #define ENV_SMM 0
112 #define ENV_SEPARATE_VERSTAGE 0
113 #define ENV_RMODULE 1
114 #define ENV_POSTCAR 0
115 #define ENV_LIBAGESA 0
116 #define ENV_STRING "rmodule"
117 
118 #elif defined(__POSTCAR__)
119 #define ENV_DECOMPRESSOR 0
120 #define ENV_BOOTBLOCK 0
121 #define ENV_ROMSTAGE 0
122 #define ENV_RAMSTAGE 0
123 #define ENV_SMM 0
124 #define ENV_SEPARATE_VERSTAGE 0
125 #define ENV_RMODULE 0
126 #define ENV_POSTCAR 1
127 #define ENV_LIBAGESA 0
128 #define ENV_STRING "postcar"
129 
130 #elif defined(__LIBAGESA__)
131 #define ENV_DECOMPRESSOR 0
132 #define ENV_BOOTBLOCK 0
133 #define ENV_ROMSTAGE 0
134 #define ENV_RAMSTAGE 0
135 #define ENV_SMM 0
136 #define ENV_SEPARATE_VERSTAGE 0
137 #define ENV_RMODULE 0
138 #define ENV_POSTCAR 0
139 #define ENV_LIBAGESA 1
140 #define ENV_STRING "libagesa"
141 
142 #else
143 /*
144  * Default case of nothing set for random blob generation using
145  * create_class_compiler that isn't bound to a stage.
146  */
147 #define ENV_DECOMPRESSOR 0
148 #define ENV_BOOTBLOCK 0
149 #define ENV_ROMSTAGE 0
150 #define ENV_RAMSTAGE 0
151 #define ENV_SMM 0
152 #define ENV_SEPARATE_VERSTAGE 0
153 #define ENV_RMODULE 0
154 #define ENV_POSTCAR 0
155 #define ENV_LIBAGESA 0
156 #define ENV_STRING "UNKNOWN"
157 #endif
158 
159 /* Define helpers about the current architecture, based on toolchain.inc. */
160 
161 #if defined(__ARCH_arm__)
162 #define ENV_ARM 1
163 #define ENV_ARM64 0
164 #if __COREBOOT_ARM_ARCH__ == 4
165 #define ENV_ARMV4 1
166 #define ENV_ARMV7 0
167 #elif __COREBOOT_ARM_ARCH__ == 7
168 #define ENV_ARMV4 0
169 #define ENV_ARMV7 1
170 #if defined(__COREBOOT_ARM_V7_A__)
171 #define ENV_ARMV7_A 1
172 #define ENV_ARMV7_M 0
173 #define ENV_ARMV7_R 0
174 #elif defined(__COREBOOT_ARM_V7_M__)
175 #define ENV_ARMV7_A 0
176 #define ENV_ARMV7_M 1
177 #define ENV_ARMV7_R 0
178 #elif defined(__COREBOOT_ARM_V7_R__)
179 #define ENV_ARMV7_A 0
180 #define ENV_ARMV7_M 0
181 #define ENV_ARMV7_R 1
182 #endif
183 #else
184 #define ENV_ARMV4 0
185 #define ENV_ARMV7 0
186 #endif
187 #define ENV_ARMV8 0
188 #define ENV_RISCV 0
189 #define ENV_X86 0
190 #define ENV_X86_32 0
191 #define ENV_X86_64 0
192 
193 #elif defined(__ARCH_arm64__)
194 #define ENV_ARM 0
195 #define ENV_ARM64 1
196 #define ENV_ARMV4 0
197 #define ENV_ARMV7 0
198 #if __COREBOOT_ARM_ARCH__ == 8
199 #define ENV_ARMV8 1
200 #else
201 #define ENV_ARMV8 0
202 #endif
203 #define ENV_RISCV 0
204 #define ENV_X86 0
205 #define ENV_X86_32 0
206 #define ENV_X86_64 0
207 
208 #elif defined(__ARCH_riscv__)
209 #define ENV_ARM 0
210 #define ENV_ARM64 0
211 #define ENV_ARMV4 0
212 #define ENV_ARMV7 0
213 #define ENV_ARMV8 0
214 #define ENV_RISCV 1
215 #define ENV_X86 0
216 #define ENV_X86_32 0
217 #define ENV_X86_64 0
218 
219 #elif defined(__ARCH_x86_32__)
220 #define ENV_ARM 0
221 #define ENV_ARM64 0
222 #define ENV_ARMV4 0
223 #define ENV_ARMV7 0
224 #define ENV_ARMV8 0
225 #define ENV_RISCV 0
226 #define ENV_X86 1
227 #define ENV_X86_32 1
228 #define ENV_X86_64 0
229 
230 #elif defined(__ARCH_x86_64__)
231 #define ENV_ARM 0
232 #define ENV_ARM64 0
233 #define ENV_ARMV4 0
234 #define ENV_ARMV7 0
235 #define ENV_ARMV8 0
236 #define ENV_RISCV 0
237 #define ENV_X86 1
238 #define ENV_X86_32 0
239 #define ENV_X86_64 1
240 
241 #else
242 #define ENV_ARM 0
243 #define ENV_ARM64 0
244 #define ENV_ARMV4 0
245 #define ENV_ARMV7 0
246 #define ENV_ARMV8 0
247 #define ENV_RISCV 0
248 #define ENV_X86 0
249 #define ENV_X86_32 0
250 #define ENV_X86_64 0
251 
252 #endif
253 
254 #if CONFIG(RAMPAYLOAD)
255 /* ENV_PAYLOAD_LOADER is set to ENV_POSTCAR when CONFIG_RAMPAYLOAD is enabled */
256 #define ENV_PAYLOAD_LOADER ENV_POSTCAR
257 #else
258 /* ENV_PAYLOAD_LOADER is set when you are in a stage that loads the payload.
259  * For now, that is the ramstage. */
260 #define ENV_PAYLOAD_LOADER ENV_RAMSTAGE
261 #endif
262 
263 #define ENV_ROMSTAGE_OR_BEFORE \
264  (ENV_DECOMPRESSOR || ENV_BOOTBLOCK || ENV_ROMSTAGE || \
265  (ENV_SEPARATE_VERSTAGE && !CONFIG(VBOOT_STARTS_IN_ROMSTAGE)))
266 
267 #if ENV_X86
268 /* Indicates memory layout is determined with arch/x86/car.ld. */
269 #define ENV_CACHE_AS_RAM (ENV_ROMSTAGE_OR_BEFORE && !CONFIG(RESET_VECTOR_IN_RAM))
270 /* No .data sections with execute-in-place from ROM. */
271 #define ENV_STAGE_HAS_DATA_SECTION !ENV_CACHE_AS_RAM
272 #else
273 /* Both .data and .bss, sometimes SRAM not DRAM. */
274 #define ENV_STAGE_HAS_DATA_SECTION 1
275 #define ENV_CACHE_AS_RAM 0
276 #endif
277 
278 /* Currently rmodules, ramstage and smm have heap. */
279 #define ENV_STAGE_HAS_HEAP_SECTION (ENV_RMODULE || ENV_RAMSTAGE || ENV_SMM)
280 
281 /* Set USER_SPACE in the makefile for the rare code that runs in userspace */
282 #if defined(__USER_SPACE__)
283 #define ENV_USER_SPACE 1
284 #else
285 #define ENV_USER_SPACE 0
286 #endif
287 
288 /* Define the first stage to run */
289 #if CONFIG(VBOOT_STARTS_BEFORE_BOOTBLOCK)
290 #define ENV_INITIAL_STAGE ENV_SEPARATE_VERSTAGE
291 #else
292 #define ENV_INITIAL_STAGE ENV_BOOTBLOCK
293 #endif
294 
295 #if ENV_X86
296 #define STAGE_HAS_SPINLOCKS !ENV_ROMSTAGE_OR_BEFORE
297 #elif ENV_RISCV
298 #define STAGE_HAS_SPINLOCKS 1
299 #else
300 #define STAGE_HAS_SPINLOCKS 0
301 #endif
302 
303 /* When set <arch/smp/spinlock.h> is included for the spinlock implementation. */
304 #define ENV_STAGE_SUPPORTS_SMP (CONFIG(SMP) && STAGE_HAS_SPINLOCKS)
305 
306 #if ENV_X86 && CONFIG(COOP_MULTITASKING) && (ENV_RAMSTAGE || ENV_ROMSTAGE)
307 /* TODO: Enable in all x86 stages */
308 #define ENV_STAGE_SUPPORTS_COOP 1
309 #else
310 #define ENV_STAGE_SUPPORTS_COOP 0
311 #endif
312 
313 /**
314  * For pre-DRAM stages and post-CAR always build with simple device model, ie.
315  * PCI, PNP and CPU functions operate without use of devicetree. The reason
316  * post-CAR utilizes __SIMPLE_DEVICE__ is for simplicity. Currently there's
317  * no known requirement that devicetree would be needed during that stage.
318  *
319  * For ramstage individual source file may define __SIMPLE_DEVICE__
320  * before including any header files to force that particular source
321  * be built with simple device model.
322  */
323 
324 #if !ENV_RAMSTAGE
325 #define __SIMPLE_DEVICE__
326 #endif
327 
328 #endif /* _RULES_H */