blob: d59eb27a6496eaa347203c038f2cce723f2d7ca3 [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 Heymans890d4fb2021-05-28 13:20:15 +020020 . = ALIGN(64);
Kyösti Mälkki49dbbe92019-12-21 10:17:56 +020021#endif
Kyösti Mälkki2289a702019-12-21 10:17:56 +020022
23 _bootblock = .;
24
25 INCLUDE "bootblock/lib/program.ld"
26
Kyösti Mälkki49dbbe92019-12-21 10:17:56 +020027 /*
28 * Allocation reserves extra space here. Alignment requirements
29 * may cause the total size of a section to change when the start
30 * address gets applied.
31 */
32 PROGRAM_SZ = SIZEOF(.text) + 512;
33
Bill XIEf0215b42021-03-20 21:06:11 +080034 . = MIN(_ECFW_PTR, MIN(_ID_SECTION, _FIT_POINTER)) - EARLYASM_SZ;
Kyösti Mälkki2289a702019-12-21 10:17:56 +020035 . = CONFIG(SIPI_VECTOR_IN_ROM) ? ALIGN(4096) : ALIGN(16);
36 BOOTBLOCK_TOP = .;
37 .init (.) : {
38 *(.init._start);
39 *(.init);
40 *(.init.*);
41 }
42
43 /*
44 * Allocation reserves extra space here. Alignment requirements
45 * may cause the total size of a section to change when the start
46 * address gets applied.
47 */
48 EARLYASM_SZ = SIZEOF(.init) + (CONFIG(SIPI_VECTOR_IN_ROM) ? 4096 : 16);
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030049
Kyösti Mälkkib19d9512020-04-23 18:45:28 +030050 . = _ID_SECTION;
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030051 .id (.): {
52 KEEP(*(.id));
53 }
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030054
Kyösti Mälkki33a68e42020-12-08 19:14:58 +020055 /* Flashrom and FILO have two alternatives for the location of .id section. */
56 _ID_SECTION_END = SIZEOF(.fit_pointer) && SIZEOF(.id) > 0x28 ? 0xffffff80 : _X86_RESET_VECTOR;
57 _ID_SECTION = _ID_SECTION_END - SIZEOF(.id);
58
Bill XIEf0215b42021-03-20 21:06:11 +080059 . = _ECFW_PTR;
60 .ecfw_ptr (.): {
61 ASSERT((SIZEOF(.ecfw_ptr) == CONFIG_ECFW_PTR_SIZE), "Size of ecfw_ptr is incorrect");
62 KEEP(*(.ecfw_ptr));
63 }
64 _ECFW_PTR = SIZEOF(.ecfw_ptr) ? CONFIG_ECFW_PTR_ADDR : _X86_RESET_VECTOR;
65
Kyösti Mälkki33a68e42020-12-08 19:14:58 +020066 . = _FIT_POINTER;
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030067 .fit_pointer (.): {
68 KEEP(*(.fit_pointer));
69 }
Kyösti Mälkki33a68e42020-12-08 19:14:58 +020070 _FIT_POINTER = SIZEOF(.fit_pointer) ? 0xffffffc0 : _X86_RESET_VECTOR;
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030071
72 . = 0xfffffff0;
Kyösti Mälkki33a68e42020-12-08 19:14:58 +020073 _X86_RESET_VECTOR = .;
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030074 .reset . : {
75 *(.reset);
Arthur Heymans75226bb2022-03-30 20:16:36 +020076 . = _X86_RESET_VECTOR_FILLING;
77 BYTE(0);
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030078 }
Arthur Heymans75226bb2022-03-30 20:16:36 +020079 . = 0xfffffffc;
80 .header_pointer . : {
81 KEEP(*(.header_pointer));
82 }
83 _X86_RESET_VECTOR_FILLING = 15 - SIZEOF(.header_pointer);
Kyösti Mälkki2289a702019-12-21 10:17:56 +020084 _ebootblock = .;
Kyösti Mälkkicfe526d2020-04-21 10:29:17 +030085}
Kyösti Mälkki2289a702019-12-21 10:17:56 +020086
87/*
88 * Tests _bogus1 and _bogus2 are here to detect case of symbol addresses truncated
89 * to 32 bits and intermediate files reaching size of close to 4 GiB.
90 */
91_bogus1 = ASSERT(_bootblock & 0x80000000, "_bootblock too low, invalid ld script");
92_bogus2 = ASSERT(_start16bit & 0x80000000, "_start16bit too low, invalid ld script");
93_bogus3 = ASSERT(_start16bit >= 0xffff0000, "_start16bit too low. Please report.");
Kyösti Mälkki49dbbe92019-12-21 10:17:56 +020094_bogus4 = ASSERT(_ebootblock - _bootblock <= CONFIG_C_ENV_BOOTBLOCK_SIZE,
95 "_bootblock too low, increase C_ENV_BOOTBLOCK_SIZE");