arch/x86: Top-align .init in bootblock
Link .init section near the end of bootblock program. It contains _start16bit, gdtptr and gdt that must be addressable from realmode, thus within top 64 KiB. Change-Id: If7b9737650362ac7cd82685cfdfaf18bd2429238 Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/47970 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
This commit is contained in:
parent
6c7441f5e6
commit
2289a70b6f
|
@ -12,8 +12,27 @@ ap_sipi_vector_in_rom = (_start16bit >> 12) & 0xff;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
/* Trigger an error if I have an unusable start address */
|
. = _ebootblock - CONFIG_C_ENV_BOOTBLOCK_SIZE;
|
||||||
_bogus = ASSERT(_start16bit >= 0xffff0000, "_start16bit too low. Please report.");
|
|
||||||
|
_bootblock = .;
|
||||||
|
|
||||||
|
INCLUDE "bootblock/lib/program.ld"
|
||||||
|
|
||||||
|
. = MIN(_ID_SECTION, _FIT_POINTER) - EARLYASM_SZ;
|
||||||
|
. = CONFIG(SIPI_VECTOR_IN_ROM) ? ALIGN(4096) : ALIGN(16);
|
||||||
|
BOOTBLOCK_TOP = .;
|
||||||
|
.init (.) : {
|
||||||
|
*(.init._start);
|
||||||
|
*(.init);
|
||||||
|
*(.init.*);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocation reserves extra space here. Alignment requirements
|
||||||
|
* may cause the total size of a section to change when the start
|
||||||
|
* address gets applied.
|
||||||
|
*/
|
||||||
|
EARLYASM_SZ = SIZEOF(.init) + (CONFIG(SIPI_VECTOR_IN_ROM) ? 4096 : 16);
|
||||||
|
|
||||||
. = _ID_SECTION;
|
. = _ID_SECTION;
|
||||||
.id (.): {
|
.id (.): {
|
||||||
|
@ -37,4 +56,13 @@ SECTIONS {
|
||||||
. = 15;
|
. = 15;
|
||||||
BYTE(0x00);
|
BYTE(0x00);
|
||||||
}
|
}
|
||||||
|
_ebootblock = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tests _bogus1 and _bogus2 are here to detect case of symbol addresses truncated
|
||||||
|
* to 32 bits and intermediate files reaching size of close to 4 GiB.
|
||||||
|
*/
|
||||||
|
_bogus1 = ASSERT(_bootblock & 0x80000000, "_bootblock too low, invalid ld script");
|
||||||
|
_bogus2 = ASSERT(_start16bit & 0x80000000, "_start16bit too low, invalid ld script");
|
||||||
|
_bogus3 = ASSERT(_start16bit >= 0xffff0000, "_start16bit too low. Please report.");
|
||||||
|
|
|
@ -28,8 +28,6 @@ SECTIONS
|
||||||
|
|
||||||
#include "car.ld"
|
#include "car.ld"
|
||||||
#elif ENV_BOOTBLOCK
|
#elif ENV_BOOTBLOCK
|
||||||
BOOTBLOCK(0xffffffff - CONFIG_C_ENV_BOOTBLOCK_SIZE + 1,
|
|
||||||
CONFIG_C_ENV_BOOTBLOCK_SIZE)
|
|
||||||
|
|
||||||
#include "car.ld"
|
#include "car.ld"
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,6 @@
|
||||||
/* Symbol _start16bit must reachable from the reset vector, and be aligned to
|
/* Symbol _start16bit must reachable from the reset vector, and be aligned to
|
||||||
* 4kB to start AP CPUs with Startup IPI message without RAM.
|
* 4kB to start AP CPUs with Startup IPI message without RAM.
|
||||||
*/
|
*/
|
||||||
.align 4096
|
|
||||||
.code16
|
.code16
|
||||||
.globl _start16bit
|
.globl _start16bit
|
||||||
.type _start16bit, @function
|
.type _start16bit, @function
|
||||||
|
|
|
@ -13,9 +13,11 @@
|
||||||
.text . : {
|
.text . : {
|
||||||
_program = .;
|
_program = .;
|
||||||
_text = .;
|
_text = .;
|
||||||
|
#if !(ENV_X86 && ENV_BOOTBLOCK)
|
||||||
*(.init._start);
|
*(.init._start);
|
||||||
*(.init);
|
*(.init);
|
||||||
*(.init.*);
|
*(.init.*);
|
||||||
|
#endif
|
||||||
*(.text._start);
|
*(.text._start);
|
||||||
*(.text.stage_entry);
|
*(.text.stage_entry);
|
||||||
KEEP(*(.metadata_hash_anchor));
|
KEEP(*(.metadata_hash_anchor));
|
||||||
|
|
|
@ -110,6 +110,22 @@ SECTIONS {
|
||||||
_TOO_LOW = _X86_RESET_VECTOR - 0xfff0;
|
_TOO_LOW = _X86_RESET_VECTOR - 0xfff0;
|
||||||
_bogus = ASSERT(_start16bit >= _TOO_LOW, "_start16bit too low. Please report.");
|
_bogus = ASSERT(_start16bit >= _TOO_LOW, "_start16bit too low. Please report.");
|
||||||
|
|
||||||
|
. = _X86_RESET_VECTOR - EARLYASM_SZ;
|
||||||
|
. = ALIGN(16);
|
||||||
|
BOOTBLOCK_TOP = .;
|
||||||
|
.init (.) : {
|
||||||
|
*(.init._start);
|
||||||
|
*(.init);
|
||||||
|
*(.init.*);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocation reserves extra space here. Alignment requirements
|
||||||
|
* may cause the total size of a section to change when the start
|
||||||
|
* address gets applied.
|
||||||
|
*/
|
||||||
|
EARLYASM_SZ = SIZEOF(.init) + 16;
|
||||||
|
|
||||||
. = BOOTBLOCK_END - 0x10;
|
. = BOOTBLOCK_END - 0x10;
|
||||||
_X86_RESET_VECTOR = .;
|
_X86_RESET_VECTOR = .;
|
||||||
.reset . : {
|
.reset . : {
|
||||||
|
|
Loading…
Reference in New Issue