coreboot/src/lib
Jeremy Compostella b7832de026 x86: Add .data section support for pre-memory stages
x86 pre-memory stages do not support the `.data` section and as a
result developers are required to include runtime initialization code
instead of relying on C global variable definition.

To illustrate the impact of this lack of `.data` section support, here
are two limitations I personally ran into:

1. The inclusion of libgfxinit in romstage for Raptor Lake has
   required some changes in libgfxinit to ensure data is initialized at
   runtime. In addition, we had to manually map some `.data` symbols in
   the `_bss` region.

2. CBFS cache is currently not supported in pre-memory stages and
   enabling it would require to add an initialization function and
   find a generic spot to call it.

Other platforms do not have that limitation. Hence, resolving it would
help to align code and reduce compilation based restriction (cf. the
use of `ENV_HAS_DATA_SECTION` compilation flag in various places of
coreboot code).

We identified three cases to consider:

1. eXecute-In-Place pre-memory stages
   - code is in SPINOR
   - data is also stored in SPINOR but must be linked in Cache-As-RAM
     and copied there at runtime

2. `bootblock` stage is a bit different as it uses Cache-As-Ram but
   the memory mapping and its entry code different

3. pre-memory stages loaded in and executed from
   Cache-As-RAM (cf. `CONFIG_NO_XIP_EARLY_STAGES`).

eXecute-In-Place pre-memory stages (#1) require the creation of a new
ELF segment as the code segment Virtual Memory Address and Load Memory
Address are identical but the data needs to be linked in
cache-As-RAM (VMA) but to be stored right after the code (LMA).

Here is the output `readelf --segments` on a `romstage.debug` ELF
binary.

    Program Headers:
      Type    Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
      LOAD    0x000080 0x02000000 0x02000000 0x21960 0x21960 R E 0x20
      LOAD    0x0219e0 0xfefb1640 0x02021960 0x00018 0x00018 RW  0x4

     Section to Segment mapping:
      Segment Sections...
       00     .text
       01     .data

Segment 0 `VirtAddr` and `PhysAddr` are at the same address while they
are totally different for the Segment 1 holding the `.data`
section. Since we need the data section `VirtAddr` to be in the
Cache-As-Ram and its `PhysAddr` right after the `.text` section, the
use of a new segment is mandatory.

`bootblock` (#2) also uses this new segment to store the data right
after the code and load it to Cache-As-RAM at runtime. However, the
code involved is different.

Not eXecute-In-Place pre-memory stages (#3) do not really need any
special work other than enabling a data section as the code and data
VMA / LMA translation vector is the same.

TEST=#1 and #2 verified on rex and qemu 32 and 64 bits:
     - The `bootblock.debug`, `romstage.debug` and
       `verstage.debug` all have data stored at the end of the `.text`
       section and code to copy the data content to the Cache-As-RAM.
     - The CBFS stages included in the final image has not improperly
       relocated any of the `.data` section symbol.
     - Test purposes global data symbols we added in bootblock,
       romstage and verstage are properly accessible at runtime
     #3: for "Intel Apollolake DDR3 RVP1" board, we verified that the
     generated romstage ELF includes a .data section similarly to a
     regular memory enabled stage.

Change-Id: I030407fcc72776e59def476daa5b86ad0495debe
Signed-off-by: Jeremy Compostella <jeremy.compostella@intel.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/77289
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
2023-09-14 21:02:07 +00:00
..
gnat lib/gnat: Remove Compiler_Unit_Warning pragmas 2023-02-26 13:30:35 +00:00
asan.c
b64_decode.c
bmp_logo.c
boot_device.c
bootblock.c
bootmem.c lib: set up specific purpose memory as LB_MEM_SOFT_RESERVED 2023-03-03 11:10:38 +00:00
bootmode.c lib: Perform display init in normal boot mode if BMP_LOGO is set 2023-05-16 13:08:12 +00:00
bootsplash.c Center bootsplash on bigger framebuffers 2023-07-17 14:49:04 +00:00
cb.ads
cbfs.c cbfs: Allow controlling decompression of unverified files 2023-06-19 12:27:15 +00:00
cbfs_master_header.c
cbmem_common.c
cbmem_console.c lib/cbmem_console.c: Use C99 flexible arrays 2023-07-30 09:59:46 +00:00
cbmem_stage_cache.c
compute_ip_checksum.c
coreboot_table.c Center bootsplash on bigger framebuffers 2023-07-17 14:49:04 +00:00
crc_byte.c
decompressor.c
delay.c
device_tree.c lib/device_tree.c: Change log level message 2022-12-22 03:27:34 +00:00
dimm_info_util.c lib/dimm_info_util.c: Add newlines to log messages 2023-06-03 16:12:54 +00:00
dp_aux.c
edid.c
edid_fill_fb.c
espi_debug.c
ext_stage_cache.c
fallback_boot.c
fit.c Convert literal uses of CONFIG_MAINBOARD_{VENDOR,PART_NUMBER} 2023-05-05 13:56:34 +00:00
fit_payload.c
fmap.c
fw_config.c lib/fw_config: Make fw_config_is_provisioned() always available 2023-06-17 02:40:57 +00:00
gcc.c
gcov-glue.c tree: Use __func__ instead of hard-coded names 2023-02-17 16:08:04 +00:00
gcov-io.c
gcov-io.h lib/gcov-io.h: Use C99 flexible arrays 2023-08-01 13:34:27 +00:00
gcov-iov.h
gpio.c
halt.c
hardwaremain.c commonlib/console/post_code.h: Change post code prefix to POSTCODE 2023-06-23 15:06:04 +00:00
hexdump.c
hexstrtobin.c
hw-time-timer.adb
identity.c lib/version: Move board identification strings 2023-04-22 16:20:49 +00:00
imd.c
imd_cbmem.c cbmem_top_chipset: Change the return value to uintptr_t 2022-11-18 16:00:45 +00:00
jpeg.c Center bootsplash on bigger framebuffers 2023-07-17 14:49:04 +00:00
jpeg.h Center bootsplash on bigger framebuffers 2023-07-17 14:49:04 +00:00
Kconfig lib: Hook up libhwbase in romstage 2022-12-17 20:51:38 +00:00
Kconfig.cbfs_verification cbfs: Allow controlling decompression of unverified files 2023-06-19 12:27:15 +00:00
libgcc.c
libgcov.c
list.c
lzma.c
lzmadecode.c lib/lzma: Build the source for decompression with flag -Ofast 2022-10-12 16:55:58 +00:00
lzmadecode.h
Makefile.inc Makefile.inc: don't add fmap_config.h dependency twice 2023-06-23 16:31:47 +00:00
malloc.c tree: Use __func__ instead of hard-coded names 2023-02-17 16:08:04 +00:00
master_header_pointer.c
memchr.c
memcmp.c
memcpy.c
memmove.c
memrange.c memrange: Honor limit in the last step of top-down stealing 2023-08-26 20:29:37 +00:00
memset.c
metadata_hash.c
nhlt.c lib/nhlt, soc/intel/skl: Update NHLT to program feedback config 2022-12-21 13:57:48 +00:00
primitive_memtest.c
prog_loaders.c vboot: Fix S3 resume with stage_cache 2023-07-10 04:43:05 +00:00
prog_ops.c lib/prog_ops.c: Add <types.h> 2022-10-06 18:13:19 +00:00
program.ld x86: Add .data section support for pre-memory stages 2023-09-14 21:02:07 +00:00
ramdetect.c
ramtest.c commonlib/console/post_code.h: Change post code prefix to POSTCODE 2023-06-23 15:06:04 +00:00
reg_script.c
region_file.c
reset.c
rmodule.c payloads,src: Replace ALIGN(x, a) by ALIGN_UP(x, a) for clarity 2022-10-13 19:14:57 +00:00
rmodule.ld
romstage_handoff.c
rtc.c
selfboot.c /: Remove extra space after comma 2022-11-30 03:07:23 +00:00
smbios.c lib/smbios: Add a config string for BIOS Vendor in SMBIOS Type 0 2023-06-26 03:07:38 +00:00
smbios_defaults.c arch/x86,lib: Migrate SMBIOS implementation to common code 2023-06-22 22:24:57 +00:00
spd_bin.c lib: Add LPDDR5x DRAM type 2022-11-07 02:29:23 +00:00
spd_cache.c
stack.c
string.c
thread.c timer: Change timer util functions to 64-bit 2022-09-14 11:55:39 +00:00
timer.c
timer_queue.c lib/timer_queue.c: Fix function signature 2022-09-23 17:34:30 +00:00
timestamp.c
ubsan.c lib/ubsan.c: Restore Jonas' copyright 2023-05-22 12:33:32 +00:00
uuid.c
ux_locales.c lib: Introduce new parsing rules for ux_locales.c 2023-07-28 14:21:18 +00:00
version.c lib/version: Move board identification strings 2023-04-22 16:20:49 +00:00
wrdd.c
xxhash.c lib/xxhash.c: Add new hash functions 2022-09-07 22:24:51 +00:00