arch/x86: Clean up bootblock assembly

We have identical gdtptr16 and gdtptr. The reference in
gdtptr_offset calculation is not accounted for when
considering --gc-sections, so to support linking
gdt_init.S separately add dummy use of gdtptr symbol.

Realmode execution already accessed gdt that was located
outside [_start16bit,_estart16bit] region. Remove latter
symbol as the former was not really a start of region,
but entry point symbol.

With the romcc bootblock solution, entry32.inc may have
been linked into romstage before, but the !ENV_BOOTBLOCK
case seems obsolete now.

Change-Id: I0a3f6aeb217ca4e38b936b8c9ec8b0b69732cbb9
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/47964
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
This commit is contained in:
Kyösti Mälkki 2020-11-21 17:59:41 +02:00 committed by Hung-Te Lin
parent 5283c337bf
commit dc873cc0c6
4 changed files with 6 additions and 31 deletions

View File

@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
gdtptr16_offset = gdtptr16 & 0xffff; gdtptr_offset = gdtptr & 0xffff;
nullidt_offset = nullidt & 0xffff; nullidt_offset = nullidt & 0xffff;
/* Symbol _start16bit must be aligned to 4kB to start AP CPUs with /* Symbol _start16bit must be aligned to 4kB to start AP CPUs with

View File

@ -108,7 +108,7 @@ _start16bit:
movw $nullidt_offset, %bx movw $nullidt_offset, %bx
subw %ax, %bx subw %ax, %bx
lidt %cs:(%bx) lidt %cs:(%bx)
movw $gdtptr16_offset, %bx movw $gdtptr_offset, %bx
subw %ax, %bx subw %ax, %bx
lgdtl %cs:(%bx) lgdtl %cs:(%bx)
@ -127,11 +127,8 @@ _start16bit:
* The gdt is defined in entry32.inc, it has a 4 Gb code segment * The gdt is defined in entry32.inc, it has a 4 Gb code segment
* at 0x08, and a 4 GB data segment at 0x10; * at 0x08, and a 4 GB data segment at 0x10;
*/ */
.align 4 __gdtptr:
.globl gdtptr16 .long gdtptr
gdtptr16:
.word gdt_end - gdt -1 /* compute the table limit */
.long gdt /* we know the offset */
.align 4 .align 4
.globl nullidt .globl nullidt
@ -139,7 +136,3 @@ nullidt:
.word 0 /* limit */ .word 0 /* limit */
.long 0 .long 0
.word 0 .word 0
.globl _estart16bit
_estart16bit:
.code32

View File

@ -8,29 +8,11 @@
.code32 .code32
/* /*
* When we come here we are in protected mode. We expand * When we come here we are in protected mode.
* the stack and copies the data segment from ROM to the
* memory.
*
* After that, we call the chipset bootstrap routine that
* does what is left of the chipset initialization.
*
* NOTE aligned to 4 so that we are sure that the prefetch * NOTE aligned to 4 so that we are sure that the prefetch
* cache will be reloaded. * cache will be reloaded.
*
* In the bootblock there is already a ljmp to __protected_start and
* the reset vector jumps to symbol _start16bit in entry16.inc from
* the reset vectors's symbol which is _start. Therefore, don't
* expose the _start symbol for bootblock.
*/ */
.align 4 .align 4
#if !ENV_BOOTBLOCK
.globl _start
_start:
#endif
lgdt %cs:gdtptr
ljmp $ROM_CODE_SEG, $__protected_start
__protected_start: __protected_start:
/* Save the BIST value */ /* Save the BIST value */

View File

@ -102,7 +102,7 @@ SECTIONS
#if ENV_BOOTBLOCK #if ENV_BOOTBLOCK
gdtptr16_offset = gdtptr16 & 0xffff; gdtptr_offset = gdtptr & 0xffff;
nullidt_offset = nullidt & 0xffff; nullidt_offset = nullidt & 0xffff;
SECTIONS { SECTIONS {