summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/asan.c10
-rw-r--r--src/lib/cbfs.c25
-rw-r--r--src/lib/prog_loaders.c8
3 files changed, 28 insertions, 15 deletions
diff --git a/src/lib/asan.c b/src/lib/asan.c
index 9493b3b51a..8f92d5a759 100644
--- a/src/lib/asan.c
+++ b/src/lib/asan.c
@@ -16,7 +16,7 @@
static inline void *asan_mem_to_shadow(const void *addr)
{
-#if ENV_ROMSTAGE
+#if ENV_SEPARATE_ROMSTAGE
return (void *)((uintptr_t)&_asan_shadow + (((uintptr_t)addr -
(uintptr_t)&_car_region_start) >> ASAN_SHADOW_SCALE_SHIFT));
#elif ENV_RAMSTAGE
@@ -27,7 +27,7 @@ static inline void *asan_mem_to_shadow(const void *addr)
static inline const void *asan_shadow_to_mem(const void *shadow_addr)
{
-#if ENV_ROMSTAGE
+#if ENV_SEPARATE_ROMSTAGE
return (void *)((uintptr_t)&_car_region_start + (((uintptr_t)shadow_addr -
(uintptr_t)&_asan_shadow) << ASAN_SHADOW_SCALE_SHIFT));
#elif ENV_RAMSTAGE
@@ -237,7 +237,7 @@ static __always_inline void check_memory_region_inline(unsigned long addr,
size_t size, bool write,
unsigned long ret_ip)
{
-#if ENV_ROMSTAGE
+#if ENV_SEPARATE_ROMSTAGE
if (((uintptr_t)addr < (uintptr_t)&_car_region_start) ||
((uintptr_t)addr > (uintptr_t)&_ebss))
return;
@@ -269,7 +269,7 @@ void check_memory_region(unsigned long addr, size_t size, bool write,
uintptr_t __asan_shadow_offset(uintptr_t addr)
{
-#if ENV_ROMSTAGE
+#if ENV_SEPARATE_ROMSTAGE
return (uintptr_t)&_asan_shadow - (((uintptr_t)&_car_region_start) >>
ASAN_SHADOW_SCALE_SHIFT);
#elif ENV_RAMSTAGE
@@ -323,7 +323,7 @@ static void asan_ctors(void)
void asan_init(void)
{
-#if ENV_ROMSTAGE
+#if ENV_SEPARATE_ROMSTAGE
size_t size = (size_t)&_ebss - (size_t)&_car_region_start;
asan_unpoison_shadow((void *)&_car_region_start, size);
#elif ENV_RAMSTAGE
diff --git a/src/lib/cbfs.c b/src/lib/cbfs.c
index e5f232ca21..92a00e4418 100644
--- a/src/lib/cbfs.c
+++ b/src/lib/cbfs.c
@@ -141,16 +141,21 @@ static inline bool cbfs_lzma_enabled(void)
return true;
if (fspm_env() && CONFIG(FSP_COMPRESS_FSP_M_LZMA))
return true;
- /* We assume here romstage and postcar are never compressed. */
- if (ENV_BOOTBLOCK || ENV_SEPARATE_VERSTAGE)
- return false;
- if (ENV_ROMSTAGE && CONFIG(POSTCAR_STAGE))
- return false;
- if ((ENV_ROMSTAGE || ENV_POSTCAR) && !CONFIG(COMPRESS_RAMSTAGE_LZMA))
- return false;
- if (ENV_SMM)
+
+ /* Payload loader (ramstage) always needs LZMA. */
+ if (ENV_PAYLOAD_LOADER)
+ return true;
+ /* Only other use of LZMA is ramstage compression. */
+ if (!CONFIG(COMPRESS_RAMSTAGE_LZMA))
return false;
- return true;
+ /* If there is a postcar, it loads the ramstage. */
+ if (CONFIG(POSTCAR_STAGE))
+ return ENV_POSTCAR;
+ /* If there is no postcar but a separate romstage, it loads the ramstage. */
+ if (CONFIG(SEPARATE_ROMSTAGE))
+ return ENV_SEPARATE_ROMSTAGE;
+ /* Otherwise, the combined bootblock+romstage loads the ramstage. */
+ return ENV_BOOTBLOCK;
}
static bool cbfs_file_hash_mismatch(const void *buffer, size_t size,
@@ -333,7 +338,7 @@ void cbfs_preload(const char *name)
dead_code();
/* We don't want to cross the vboot boundary */
- if (ENV_ROMSTAGE && CONFIG(VBOOT_STARTS_IN_ROMSTAGE))
+ if (ENV_SEPARATE_ROMSTAGE && CONFIG(VBOOT_STARTS_IN_ROMSTAGE))
return;
DEBUG("%s(name='%s')\n", __func__, name);
diff --git a/src/lib/prog_loaders.c b/src/lib/prog_loaders.c
index 9e661c5956..b2abbff575 100644
--- a/src/lib/prog_loaders.c
+++ b/src/lib/prog_loaders.c
@@ -9,6 +9,7 @@
#include <program_loading.h>
#include <reset.h>
#include <rmodule.h>
+#include <romstage_common.h>
#include <security/vboot/vboot_common.h>
#include <stage_cache.h>
#include <symbols.h>
@@ -16,6 +17,13 @@
void run_romstage(void)
{
+ if (!CONFIG(SEPARATE_ROMSTAGE)) {
+ /* Call romstage instead of loading it as a cbfs file. */
+ timestamp_add_now(TS_ROMSTAGE_START);
+ romstage_main();
+ dead_code();
+ }
+
struct prog romstage =
PROG_INIT(PROG_ROMSTAGE, CONFIG_CBFS_PREFIX "/romstage");