Angel Pons | f23ae0b | 2020-04-02 23:48:12 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
Kyösti Mälkki | a4ffe9d | 2016-06-27 13:24:11 +0300 | [diff] [blame] | 2 | |
Jeremy Compostella | fa83887 | 2022-11-30 19:26:01 -0700 | [diff] [blame] | 3 | #include <adainit.h> |
Kyösti Mälkki | a963acd | 2019-08-16 20:34:25 +0300 | [diff] [blame] | 4 | #include <arch/romstage.h> |
Kyösti Mälkki | 65e5466 | 2017-09-01 07:10:56 +0300 | [diff] [blame] | 5 | #include <arch/symbols.h> |
Elyes HAOUAS | d26844c | 2019-06-21 07:31:40 +0200 | [diff] [blame] | 6 | #include <commonlib/helpers.h> |
Elyes Haouas | 7df5c68 | 2022-10-02 12:36:58 +0200 | [diff] [blame] | 7 | #include <console/console.h> |
| 8 | #include <cpu/x86/smm.h> |
Kyösti Mälkki | a4ffe9d | 2016-06-27 13:24:11 +0300 | [diff] [blame] | 9 | #include <program_loading.h> |
Arthur Heymans | bab9e2e | 2021-05-29 07:30:33 +0200 | [diff] [blame] | 10 | #include <romstage_common.h> |
Tim Wawrzynczak | f2cae50 | 2019-10-25 15:13:04 -0600 | [diff] [blame] | 11 | #include <security/vboot/vboot_common.h> |
Elyes Haouas | 7df5c68 | 2022-10-02 12:36:58 +0200 | [diff] [blame] | 12 | #include <types.h> |
Kyösti Mälkki | a4ffe9d | 2016-06-27 13:24:11 +0300 | [diff] [blame] | 13 | |
Arthur Heymans | 4c095fc | 2019-08-18 08:40:56 +0200 | [diff] [blame] | 14 | /* If we do not have a constrained _car_stack region size, use the |
| 15 | following as a guideline for acceptable stack usage. */ |
Kyösti Mälkki | dfb2de8 | 2016-11-19 16:39:21 +0200 | [diff] [blame] | 16 | #define DCACHE_RAM_ROMSTAGE_STACK_SIZE 0x2000 |
Kyösti Mälkki | e325b22 | 2016-06-17 11:04:37 +0300 | [diff] [blame] | 17 | |
Arthur Heymans | bab9e2e | 2021-05-29 07:30:33 +0200 | [diff] [blame] | 18 | void __noreturn romstage_main(void) |
Kyösti Mälkki | e325b22 | 2016-06-17 11:04:37 +0300 | [diff] [blame] | 19 | { |
Kyösti Mälkki | a4ffe9d | 2016-06-27 13:24:11 +0300 | [diff] [blame] | 20 | int i; |
Arthur Heymans | 4c095fc | 2019-08-18 08:40:56 +0200 | [diff] [blame] | 21 | const int num_guards = 64; |
Kyösti Mälkki | a4ffe9d | 2016-06-27 13:24:11 +0300 | [diff] [blame] | 22 | const u32 stack_guard = 0xdeadbeef; |
Kyösti Mälkki | 65e5466 | 2017-09-01 07:10:56 +0300 | [diff] [blame] | 23 | u32 *stack_base; |
| 24 | u32 size; |
Arthur Heymans | 4c095fc | 2019-08-18 08:40:56 +0200 | [diff] [blame] | 25 | const size_t stack_size = MAX(CONFIG_DCACHE_BSP_STACK_SIZE, |
| 26 | DCACHE_RAM_ROMSTAGE_STACK_SIZE); |
Kyösti Mälkki | 65e5466 | 2017-09-01 07:10:56 +0300 | [diff] [blame] | 27 | |
| 28 | /* Size of unallocated CAR. */ |
Kyösti Mälkki | d7892bc | 2018-12-28 19:18:46 +0200 | [diff] [blame] | 29 | size = ALIGN_DOWN(_car_stack_size, 16); |
Kyösti Mälkki | 65e5466 | 2017-09-01 07:10:56 +0300 | [diff] [blame] | 30 | |
Arthur Heymans | 4c095fc | 2019-08-18 08:40:56 +0200 | [diff] [blame] | 31 | size = MIN(size, stack_size); |
| 32 | if (size < stack_size) |
Kyösti Mälkki | 65e5466 | 2017-09-01 07:10:56 +0300 | [diff] [blame] | 33 | printk(BIOS_DEBUG, "Romstage stack size limited to 0x%x!\n", |
| 34 | size); |
| 35 | |
Elyes Haouas | 4d685d4 | 2022-11-18 15:04:34 +0100 | [diff] [blame] | 36 | stack_base = (u32 *)(_ecar_stack - size); |
Kyösti Mälkki | a4ffe9d | 2016-06-27 13:24:11 +0300 | [diff] [blame] | 37 | |
| 38 | for (i = 0; i < num_guards; i++) |
| 39 | stack_base[i] = stack_guard; |
| 40 | |
Tim Wawrzynczak | f2cae50 | 2019-10-25 15:13:04 -0600 | [diff] [blame] | 41 | if (CONFIG(VBOOT_EARLY_EC_SYNC)) |
| 42 | vboot_sync_ec(); |
| 43 | |
Jeremy Compostella | fa83887 | 2022-11-30 19:26:01 -0700 | [diff] [blame] | 44 | /* |
| 45 | * We can generally jump between C and Ada code back and forth |
| 46 | * without trouble. But since we don't have an Ada main() we |
| 47 | * have to do some Ada package initializations that GNAT would |
| 48 | * do there. This has to be done before calling any Ada code. |
| 49 | * |
| 50 | * The package initializations should not have any dependen- |
| 51 | * cies on C code. So we can call them here early, and don't |
| 52 | * have to worry at which point we can start to use Ada. |
| 53 | */ |
| 54 | romstage_adainit(); |
| 55 | |
Kyösti Mälkki | 157b189 | 2019-08-16 14:02:25 +0300 | [diff] [blame] | 56 | mainboard_romstage_entry(); |
Kyösti Mälkki | a4ffe9d | 2016-06-27 13:24:11 +0300 | [diff] [blame] | 57 | |
| 58 | /* Check the stack. */ |
| 59 | for (i = 0; i < num_guards; i++) { |
| 60 | if (stack_base[i] == stack_guard) |
| 61 | continue; |
| 62 | printk(BIOS_DEBUG, "Smashed stack detected in romstage!\n"); |
| 63 | } |
| 64 | |
Kyösti Mälkki | 7cdb047 | 2019-08-08 11:16:06 +0300 | [diff] [blame] | 65 | if (CONFIG(SMM_TSEG)) |
| 66 | smm_list_regions(); |
| 67 | |
Arthur Heymans | 876a1b4 | 2022-02-15 11:06:10 +0100 | [diff] [blame] | 68 | prepare_and_run_postcar(); |
Kyösti Mälkki | 5bc641a | 2019-08-09 09:37:49 +0300 | [diff] [blame] | 69 | /* We do not return here. */ |
Arthur Heymans | d3d82e0 | 2018-06-05 11:19:22 +0200 | [diff] [blame] | 70 | } |