Kyösti Mälkki | cfe526d | 2020-04-21 10:29:17 +0300 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
| 2 | |
Kyösti Mälkki | dc873cc | 2020-11-21 17:59:41 +0200 | [diff] [blame] | 3 | gdtptr_offset = gdtptr & 0xffff; |
Kyösti Mälkki | cfe526d | 2020-04-21 10:29:17 +0300 | [diff] [blame] | 4 | nullidt_offset = nullidt & 0xffff; |
| 5 | |
| 6 | /* Symbol _start16bit must be aligned to 4kB to start AP CPUs with |
| 7 | * Startup IPI message without RAM. |
| 8 | */ |
| 9 | #if CONFIG(SIPI_VECTOR_IN_ROM) |
| 10 | _bogus = ASSERT((_start16bit & 0xfff) == 0, "Symbol _start16bit is not at 4 KiB boundary"); |
| 11 | ap_sipi_vector_in_rom = (_start16bit >> 12) & 0xff; |
| 12 | #endif |
| 13 | |
| 14 | SECTIONS { |
Kyösti Mälkki | 49dbbe9 | 2019-12-21 10:17:56 +0200 | [diff] [blame] | 15 | |
| 16 | #if CONFIG(FIXED_BOOTBLOCK_SIZE) |
Kyösti Mälkki | 2289a70 | 2019-12-21 10:17:56 +0200 | [diff] [blame] | 17 | . = _ebootblock - CONFIG_C_ENV_BOOTBLOCK_SIZE; |
Kyösti Mälkki | 49dbbe9 | 2019-12-21 10:17:56 +0200 | [diff] [blame] | 18 | #else |
| 19 | . = BOOTBLOCK_TOP - PROGRAM_SZ; |
Arthur Heymans | 929dfec | 2024-02-05 15:10:28 +0100 | [diff] [blame^] | 20 | /* Page tables need to be at a 4K boundary so align the bootblock downwards */ |
| 21 | . = ALIGN(4096); |
| 22 | . -= 4096; |
Kyösti Mälkki | 49dbbe9 | 2019-12-21 10:17:56 +0200 | [diff] [blame] | 23 | #endif |
Kyösti Mälkki | 2289a70 | 2019-12-21 10:17:56 +0200 | [diff] [blame] | 24 | |
| 25 | _bootblock = .; |
| 26 | |
| 27 | INCLUDE "bootblock/lib/program.ld" |
| 28 | |
Arthur Heymans | 929dfec | 2024-02-05 15:10:28 +0100 | [diff] [blame^] | 29 | PROGRAM_SZ = SIZEOF(.text); |
Kyösti Mälkki | 49dbbe9 | 2019-12-21 10:17:56 +0200 | [diff] [blame] | 30 | |
Bill XIE | f0215b4 | 2021-03-20 21:06:11 +0800 | [diff] [blame] | 31 | . = MIN(_ECFW_PTR, MIN(_ID_SECTION, _FIT_POINTER)) - EARLYASM_SZ; |
Kyösti Mälkki | 2289a70 | 2019-12-21 10:17:56 +0200 | [diff] [blame] | 32 | . = CONFIG(SIPI_VECTOR_IN_ROM) ? ALIGN(4096) : ALIGN(16); |
| 33 | BOOTBLOCK_TOP = .; |
| 34 | .init (.) : { |
| 35 | *(.init._start); |
| 36 | *(.init); |
| 37 | *(.init.*); |
| 38 | } |
| 39 | |
| 40 | /* |
| 41 | * Allocation reserves extra space here. Alignment requirements |
| 42 | * may cause the total size of a section to change when the start |
| 43 | * address gets applied. |
| 44 | */ |
| 45 | EARLYASM_SZ = SIZEOF(.init) + (CONFIG(SIPI_VECTOR_IN_ROM) ? 4096 : 16); |
Kyösti Mälkki | cfe526d | 2020-04-21 10:29:17 +0300 | [diff] [blame] | 46 | |
Kyösti Mälkki | b19d951 | 2020-04-23 18:45:28 +0300 | [diff] [blame] | 47 | . = _ID_SECTION; |
Kyösti Mälkki | cfe526d | 2020-04-21 10:29:17 +0300 | [diff] [blame] | 48 | .id (.): { |
| 49 | KEEP(*(.id)); |
| 50 | } |
Kyösti Mälkki | cfe526d | 2020-04-21 10:29:17 +0300 | [diff] [blame] | 51 | |
Kyösti Mälkki | 33a68e4 | 2020-12-08 19:14:58 +0200 | [diff] [blame] | 52 | /* Flashrom and FILO have two alternatives for the location of .id section. */ |
| 53 | _ID_SECTION_END = SIZEOF(.fit_pointer) && SIZEOF(.id) > 0x28 ? 0xffffff80 : _X86_RESET_VECTOR; |
| 54 | _ID_SECTION = _ID_SECTION_END - SIZEOF(.id); |
| 55 | |
Bill XIE | f0215b4 | 2021-03-20 21:06:11 +0800 | [diff] [blame] | 56 | . = _ECFW_PTR; |
| 57 | .ecfw_ptr (.): { |
| 58 | ASSERT((SIZEOF(.ecfw_ptr) == CONFIG_ECFW_PTR_SIZE), "Size of ecfw_ptr is incorrect"); |
| 59 | KEEP(*(.ecfw_ptr)); |
| 60 | } |
| 61 | _ECFW_PTR = SIZEOF(.ecfw_ptr) ? CONFIG_ECFW_PTR_ADDR : _X86_RESET_VECTOR; |
| 62 | |
Kyösti Mälkki | 33a68e4 | 2020-12-08 19:14:58 +0200 | [diff] [blame] | 63 | . = _FIT_POINTER; |
Kyösti Mälkki | cfe526d | 2020-04-21 10:29:17 +0300 | [diff] [blame] | 64 | .fit_pointer (.): { |
| 65 | KEEP(*(.fit_pointer)); |
| 66 | } |
Kyösti Mälkki | 33a68e4 | 2020-12-08 19:14:58 +0200 | [diff] [blame] | 67 | _FIT_POINTER = SIZEOF(.fit_pointer) ? 0xffffffc0 : _X86_RESET_VECTOR; |
Kyösti Mälkki | cfe526d | 2020-04-21 10:29:17 +0300 | [diff] [blame] | 68 | |
| 69 | . = 0xfffffff0; |
Kyösti Mälkki | 33a68e4 | 2020-12-08 19:14:58 +0200 | [diff] [blame] | 70 | _X86_RESET_VECTOR = .; |
Kyösti Mälkki | cfe526d | 2020-04-21 10:29:17 +0300 | [diff] [blame] | 71 | .reset . : { |
| 72 | *(.reset); |
Arthur Heymans | 75226bb | 2022-03-30 20:16:36 +0200 | [diff] [blame] | 73 | . = _X86_RESET_VECTOR_FILLING; |
| 74 | BYTE(0); |
Kyösti Mälkki | cfe526d | 2020-04-21 10:29:17 +0300 | [diff] [blame] | 75 | } |
Arthur Heymans | 75226bb | 2022-03-30 20:16:36 +0200 | [diff] [blame] | 76 | . = 0xfffffffc; |
| 77 | .header_pointer . : { |
| 78 | KEEP(*(.header_pointer)); |
| 79 | } |
| 80 | _X86_RESET_VECTOR_FILLING = 15 - SIZEOF(.header_pointer); |
Kyösti Mälkki | 2289a70 | 2019-12-21 10:17:56 +0200 | [diff] [blame] | 81 | _ebootblock = .; |
Kyösti Mälkki | cfe526d | 2020-04-21 10:29:17 +0300 | [diff] [blame] | 82 | } |
Kyösti Mälkki | 2289a70 | 2019-12-21 10:17:56 +0200 | [diff] [blame] | 83 | |
| 84 | /* |
| 85 | * Tests _bogus1 and _bogus2 are here to detect case of symbol addresses truncated |
| 86 | * to 32 bits and intermediate files reaching size of close to 4 GiB. |
| 87 | */ |
| 88 | _bogus1 = ASSERT(_bootblock & 0x80000000, "_bootblock too low, invalid ld script"); |
| 89 | _bogus2 = ASSERT(_start16bit & 0x80000000, "_start16bit too low, invalid ld script"); |
| 90 | _bogus3 = ASSERT(_start16bit >= 0xffff0000, "_start16bit too low. Please report."); |
Kyösti Mälkki | 49dbbe9 | 2019-12-21 10:17:56 +0200 | [diff] [blame] | 91 | _bogus4 = ASSERT(_ebootblock - _bootblock <= CONFIG_C_ENV_BOOTBLOCK_SIZE, |
| 92 | "_bootblock too low, increase C_ENV_BOOTBLOCK_SIZE"); |