blob: 65479851ce33f441e88924bd98fd5155c8aabb81 [file] [log] [blame]
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +03001/* SPDX-License-Identifier: GPL-2.0-only */
2
Kyösti Mälkkidc873cc2020-11-21 17:59:41 +02003gdtptr_offset = gdtptr & 0xffff;
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +03004nullidt_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");
11ap_sipi_vector_in_rom = (_start16bit >> 12) & 0xff;
12#endif
13
14SECTIONS {
Kyösti Mälkki49dbbe92019-12-21 10:17:56 +020015
16#if CONFIG(FIXED_BOOTBLOCK_SIZE)
Kyösti Mälkki2289a702019-12-21 10:17:56 +020017 . = _ebootblock - CONFIG_C_ENV_BOOTBLOCK_SIZE;
Kyösti Mälkki49dbbe92019-12-21 10:17:56 +020018#else
19 . = BOOTBLOCK_TOP - PROGRAM_SZ;
Arthur Heymans929dfec2024-02-05 15:10:28 +010020 /* Page tables need to be at a 4K boundary so align the bootblock downwards */
21 . = ALIGN(4096);
22 . -= 4096;
Kyösti Mälkki49dbbe92019-12-21 10:17:56 +020023#endif
Kyösti Mälkki2289a702019-12-21 10:17:56 +020024
25 _bootblock = .;
26
27 INCLUDE "bootblock/lib/program.ld"
28
Arthur Heymans929dfec2024-02-05 15:10:28 +010029 PROGRAM_SZ = SIZEOF(.text);
Kyösti Mälkki49dbbe92019-12-21 10:17:56 +020030
Bill XIEf0215b42021-03-20 21:06:11 +080031 . = MIN(_ECFW_PTR, MIN(_ID_SECTION, _FIT_POINTER)) - EARLYASM_SZ;
Kyösti Mälkki2289a702019-12-21 10:17:56 +020032 . = 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älkkicfe526d2020-04-21 10:29:17 +030046
Kyösti Mälkkib19d9512020-04-23 18:45:28 +030047 . = _ID_SECTION;
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030048 .id (.): {
49 KEEP(*(.id));
50 }
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030051
Kyösti Mälkki33a68e42020-12-08 19:14:58 +020052 /* 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 XIEf0215b42021-03-20 21:06:11 +080056 . = _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älkki33a68e42020-12-08 19:14:58 +020063 . = _FIT_POINTER;
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030064 .fit_pointer (.): {
65 KEEP(*(.fit_pointer));
66 }
Kyösti Mälkki33a68e42020-12-08 19:14:58 +020067 _FIT_POINTER = SIZEOF(.fit_pointer) ? 0xffffffc0 : _X86_RESET_VECTOR;
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030068
69 . = 0xfffffff0;
Kyösti Mälkki33a68e42020-12-08 19:14:58 +020070 _X86_RESET_VECTOR = .;
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030071 .reset . : {
72 *(.reset);
Arthur Heymans75226bb2022-03-30 20:16:36 +020073 . = _X86_RESET_VECTOR_FILLING;
74 BYTE(0);
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030075 }
Arthur Heymans75226bb2022-03-30 20:16:36 +020076 . = 0xfffffffc;
77 .header_pointer . : {
78 KEEP(*(.header_pointer));
79 }
80 _X86_RESET_VECTOR_FILLING = 15 - SIZEOF(.header_pointer);
Kyösti Mälkki2289a702019-12-21 10:17:56 +020081 _ebootblock = .;
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030082}
Kyösti Mälkki2289a702019-12-21 10:17:56 +020083
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älkki49dbbe92019-12-21 10:17:56 +020091_bogus4 = ASSERT(_ebootblock - _bootblock <= CONFIG_C_ENV_BOOTBLOCK_SIZE,
92 "_bootblock too low, increase C_ENV_BOOTBLOCK_SIZE");