21a4053fde
When CONFIG_SEPARATE_VERSTAGE=n, all verstage code gets linked into the appropriate calling stage (bootblock or romstage). This means that ENV_VERSTAGE is actually 0, and instead ENV_BOOTBLOCK or ENV_ROMSTAGE are 1. This keeps tripping up people who are just trying to write a simple "are we in verstage (i.e. wherever the vboot init logic runs)" check, e.g. for TPM init functions which may run in "verstage" or ramstage depending on whether vboot is enabled. Those checks will not work as intended for CONFIG_SEPARATE_VERSTAGE=n. This patch renames ENV_VERSTAGE to ENV_SEPARATE_VERSTAGE to try to clarify that this macro can really only be used to check whether code is running in a *separate* verstage, and clue people in that they may need to cover the linked-in verstage case as well. Signed-off-by: Julius Werner <jwerner@chromium.org> Change-Id: I2ff3a3c3513b3db44b3cff3d93398330cd3632ea Reviewed-on: https://review.coreboot.org/c/coreboot/+/40582 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
190 lines
5.6 KiB
C
190 lines
5.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/* This file is part of the coreboot project. */
|
|
|
|
/* This file contains macro definitions for memlayout.ld linker scripts. */
|
|
|
|
#ifndef __MEMLAYOUT_H
|
|
#define __MEMLAYOUT_H
|
|
|
|
#include <arch/memlayout.h>
|
|
#include <vb2_constants.h>
|
|
|
|
#include "fmap_config.h"
|
|
|
|
/* Macros that the architecture can override. */
|
|
#ifndef ARCH_POINTER_ALIGN_SIZE
|
|
#define ARCH_POINTER_ALIGN_SIZE 8
|
|
#endif
|
|
|
|
#ifndef ARCH_CACHELINE_ALIGN_SIZE
|
|
#define ARCH_CACHELINE_ALIGN_SIZE 64
|
|
#endif
|
|
|
|
#define STR(x) XSTR(x)
|
|
#define XSTR(x) #x
|
|
|
|
#define ALIGN_COUNTER(align) \
|
|
. = ALIGN(align);
|
|
|
|
#define SET_COUNTER(name, addr) \
|
|
_ = ASSERT(. <= addr, STR(name overlaps the previous region!)); \
|
|
. = addr;
|
|
|
|
#define SYMBOL(name, addr) \
|
|
SET_COUNTER(name, addr) \
|
|
_##name = .;
|
|
|
|
#define REGION(name, addr, size, expected_align) \
|
|
SYMBOL(name, addr) \
|
|
_ = ASSERT(. == ALIGN(expected_align), \
|
|
STR(name must be aligned to expected_align!)); \
|
|
SYMBOL(e##name, addr + size)
|
|
|
|
#define ALIAS_REGION(name, alias) \
|
|
_##alias = _##name; \
|
|
_e##alias = _e##name;
|
|
|
|
/* Declare according to SRAM/DRAM ranges in SoC hardware-defined address map. */
|
|
#define SRAM_START(addr) SYMBOL(sram, addr)
|
|
|
|
#define SRAM_END(addr) SYMBOL(esram, addr)
|
|
|
|
#define DRAM_START(addr) SYMBOL(dram, addr)
|
|
|
|
#define TIMESTAMP(addr, size) \
|
|
REGION(timestamp, addr, size, 8) \
|
|
_ = ASSERT(size >= 212, "Timestamp region must fit timestamp_cache!");
|
|
|
|
#define PRERAM_CBMEM_CONSOLE(addr, size) \
|
|
REGION(preram_cbmem_console, addr, size, 4)
|
|
|
|
/* Use either CBFS_CACHE (unified) or both (PRERAM|POSTRAM)_CBFS_CACHE */
|
|
#define CBFS_CACHE(addr, size) \
|
|
REGION(cbfs_cache, addr, size, 4) \
|
|
ALIAS_REGION(cbfs_cache, preram_cbfs_cache) \
|
|
ALIAS_REGION(cbfs_cache, postram_cbfs_cache)
|
|
|
|
#define FMAP_CACHE(addr, sz) \
|
|
REGION(fmap_cache, addr, sz, 4) \
|
|
_ = ASSERT(sz >= FMAP_SIZE, \
|
|
STR(FMAP does not fit in FMAP_CACHE! (sz < FMAP_SIZE)));
|
|
|
|
#if ENV_ROMSTAGE_OR_BEFORE
|
|
#define PRERAM_CBFS_CACHE(addr, size) \
|
|
REGION(preram_cbfs_cache, addr, size, 4) \
|
|
ALIAS_REGION(preram_cbfs_cache, cbfs_cache)
|
|
#define POSTRAM_CBFS_CACHE(addr, size) \
|
|
REGION(postram_cbfs_cache, addr, size, 4)
|
|
#else
|
|
#define PRERAM_CBFS_CACHE(addr, size) \
|
|
REGION(preram_cbfs_cache, addr, size, 4)
|
|
#define POSTRAM_CBFS_CACHE(addr, size) \
|
|
REGION(postram_cbfs_cache, addr, size, 4) \
|
|
ALIAS_REGION(postram_cbfs_cache, cbfs_cache)
|
|
#endif
|
|
|
|
/* Careful: 'INCLUDE <filename>' must always be at the end of the output line */
|
|
#if ENV_DECOMPRESSOR
|
|
#define DECOMPRESSOR(addr, sz) \
|
|
SYMBOL(decompressor, addr) \
|
|
_edecompressor = _decompressor + sz; \
|
|
_ = ASSERT(_eprogram - _program <= sz, \
|
|
STR(decompressor exceeded its allotted size! (sz))); \
|
|
INCLUDE "decompressor/lib/program.ld"
|
|
|
|
#define OVERLAP_DECOMPRESSOR_ROMSTAGE(addr, sz) DECOMPRESSOR(addr, sz)
|
|
#define OVERLAP_DECOMPRESSOR_VERSTAGE_ROMSTAGE(addr, sz) \
|
|
DECOMPRESSOR(addr, sz)
|
|
#else
|
|
#define DECOMPRESSOR(addr, sz) \
|
|
REGION(decompressor, addr, sz, 1)
|
|
|
|
#define OVERLAP_DECOMPRESSOR_ROMSTAGE(addr, sz) ROMSTAGE(addr, sz)
|
|
#define OVERLAP_DECOMPRESSOR_VERSTAGE_ROMSTAGE(addr, sz) \
|
|
OVERLAP_VERSTAGE_ROMSTAGE(addr, sz)
|
|
#endif
|
|
|
|
#if ENV_BOOTBLOCK
|
|
#define BOOTBLOCK(addr, sz) \
|
|
SYMBOL(bootblock, addr) \
|
|
_ebootblock = _bootblock + sz; \
|
|
_ = ASSERT(_eprogram - _program <= sz, \
|
|
STR(Bootblock exceeded its allotted size! (sz))); \
|
|
INCLUDE "bootblock/lib/program.ld"
|
|
#else
|
|
#define BOOTBLOCK(addr, sz) \
|
|
REGION(bootblock, addr, sz, 1)
|
|
#endif
|
|
|
|
#if ENV_ROMSTAGE
|
|
#define ROMSTAGE(addr, sz) \
|
|
SYMBOL(romstage, addr) \
|
|
_eromstage = _romstage + sz; \
|
|
_ = ASSERT(_eprogram - _program <= sz, \
|
|
STR(Romstage exceeded its allotted size! (sz))); \
|
|
INCLUDE "romstage/lib/program.ld"
|
|
#else
|
|
#define ROMSTAGE(addr, sz) \
|
|
REGION(romstage, addr, sz, 1)
|
|
#endif
|
|
|
|
#if ENV_RAMSTAGE
|
|
#define RAMSTAGE(addr, sz) \
|
|
SYMBOL(ramstage, addr) \
|
|
_eramstage = _ramstage + sz; \
|
|
_ = ASSERT(_eprogram - _program <= sz, \
|
|
STR(Ramstage exceeded its allotted size! (sz))); \
|
|
INCLUDE "ramstage/lib/program.ld"
|
|
#else
|
|
#define RAMSTAGE(addr, sz) \
|
|
REGION(ramstage, addr, sz, 1)
|
|
#endif
|
|
|
|
/* VBOOT2_WORK must always use VB2_FIRMWARE_WORKBUF_RECOMMENDED_SIZE for its
|
|
* size argument. The constant is imported via vb2_workbuf_size.h. */
|
|
#define VBOOT2_WORK(addr, sz) \
|
|
REGION(vboot2_work, addr, sz, 16) \
|
|
_ = ASSERT(sz == VB2_FIRMWARE_WORKBUF_RECOMMENDED_SIZE, \
|
|
STR(vboot2 work buffer size must be equivalent to \
|
|
VB2_FIRMWARE_WORKBUF_RECOMMENDED_SIZE! (sz)));
|
|
|
|
#define TPM_TCPA_LOG(addr, size) \
|
|
REGION(tpm_tcpa_log, addr, size, 16) \
|
|
_ = ASSERT(size >= 2K, "tpm tcpa log buffer must be at least 2K!");
|
|
|
|
#if ENV_SEPARATE_VERSTAGE
|
|
#define VERSTAGE(addr, sz) \
|
|
SYMBOL(verstage, addr) \
|
|
_everstage = _verstage + sz; \
|
|
_ = ASSERT(_eprogram - _program <= sz, \
|
|
STR(Verstage exceeded its allotted size! (sz))); \
|
|
INCLUDE "verstage/lib/program.ld"
|
|
|
|
#define OVERLAP_VERSTAGE_ROMSTAGE(addr, size) \
|
|
_ = ASSERT(CONFIG(VBOOT_RETURN_FROM_VERSTAGE) == 1, \
|
|
"Must set RETURN_FROM_VERSTAGE to overlap romstage."); \
|
|
VERSTAGE(addr, size)
|
|
#else
|
|
#define VERSTAGE(addr, sz) \
|
|
REGION(verstage, addr, sz, 1)
|
|
|
|
#define OVERLAP_VERSTAGE_ROMSTAGE(addr, size) ROMSTAGE(addr, size)
|
|
#endif
|
|
|
|
#if ENV_POSTCAR
|
|
#define POSTCAR(addr, sz) \
|
|
SYMBOL(postcar, addr) \
|
|
_epostcar = _postcar + sz; \
|
|
_ = ASSERT(_eprogram - _program <= sz, \
|
|
STR(Aftercar exceeded its allotted size! (sz))); \
|
|
INCLUDE "postcar/lib/program.ld"
|
|
#else
|
|
#define POSTCAR(addr, sz) \
|
|
REGION(postcar, addr, sz, 1)
|
|
#endif
|
|
|
|
#define WATCHDOG_TOMBSTONE(addr, size) \
|
|
REGION(watchdog_tombstone, addr, size, 4) \
|
|
_ = ASSERT(size == 4, "watchdog tombstones should be exactly 4 byte!");
|
|
|
|
#endif /* __MEMLAYOUT_H */
|