summaryrefslogtreecommitdiffstats
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86/Kconfig6
-rw-r--r--src/arch/x86/assembly_entry.S11
-rw-r--r--src/arch/x86/early_ram.ld43
-rw-r--r--src/arch/x86/include/arch/memlayout.h3
-rw-r--r--src/arch/x86/memlayout.ld4
5 files changed, 62 insertions, 5 deletions
diff --git a/src/arch/x86/Kconfig b/src/arch/x86/Kconfig
index 21107aa48bac..11733bd05eba 100644
--- a/src/arch/x86/Kconfig
+++ b/src/arch/x86/Kconfig
@@ -89,9 +89,10 @@ config X86_RESET_VECTOR
config RESET_VECTOR_IN_RAM
bool
depends on ARCH_X86
+ select NO_XIP_EARLY_STAGES
help
- Select this option if the x86 soc implements custom code to handle the
- reset vector in RAM instead of the traditional 0xfffffff0 location.
+ Select this option if the x86 processor's reset vector is in
+ preinitialized DRAM instead of the traditional 0xfffffff0 location.
# Aligns 16bit entry code in bootblock so that hyper-threading CPUs
# can boot AP CPUs to enable their shared caches.
@@ -206,6 +207,7 @@ config VERSTAGE_ADDR
config POSTCAR_STAGE
def_bool y
depends on ARCH_X86
+ depends on !RESET_VECTOR_IN_RAM
config VERSTAGE_DEBUG_SPINLOOP
bool
diff --git a/src/arch/x86/assembly_entry.S b/src/arch/x86/assembly_entry.S
index f36e7dab4de5..59b34c871305 100644
--- a/src/arch/x86/assembly_entry.S
+++ b/src/arch/x86/assembly_entry.S
@@ -9,6 +9,13 @@
* continue with C code execution one needs to set stack pointer and
* clear .bss variables that are stage specific.
*/
+
+#if CONFIG(RESET_VECTOR_IN_RAM)
+ #define _STACK_TOP _eearlyram_stack
+#else
+ #define _STACK_TOP _ecar_stack
+#endif
+
.section ".text._start", "ax", @progbits
.global _start
_start:
@@ -16,8 +23,8 @@ _start:
/* Migrate GDT to this text segment */
call gdt_init
- /* reset stack pointer to CAR stack */
- mov $_ecar_stack, %esp
+ /* reset stack pointer to CAR/EARLYRAM stack */
+ mov $_STACK_TOP, %esp
/* clear .bss section as it is not shared */
cld
diff --git a/src/arch/x86/early_ram.ld b/src/arch/x86/early_ram.ld
new file mode 100644
index 000000000000..941c385b04f7
--- /dev/null
+++ b/src/arch/x86/early_ram.ld
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/* This file is part of the coreboot project. */
+
+/* This file is included inside a SECTIONS block */
+
+_STACK_SIZE = CONFIG_EARLYRAM_BSP_STACK_SIZE;
+_ = ASSERT(_STACK_SIZE > 0x0, "EARLYRAM_BSP_STACK_SIZE is not configured");
+
+_CONSOLE_SIZE = CONFIG_PRERAM_CBMEM_CONSOLE_SIZE;
+_ = ASSERT(_CONSOLE_SIZE > 0x0, "PRERAM_CBMEM_CONSOLE_SIZE is not configured");
+
+_TIMESTAMPS_SIZE = 0x200;
+#if !CONFIG(NO_FMAP_CACHE)
+_FMAP_SIZE = FMAP_SIZE;
+#else
+_FMAP_SIZE = 0;
+#endif
+
+/*
+ * The PRERAM_CBMEM_CONSOLE, TIMESTAMP, and FMAP_CACHE regions are shared
+ * between the pre-ram stages (bootblock, romstage, etc). We need to assign a
+ * fixed size and consistent link address so they can be shared between stages.
+ *
+ * The stack area is not shared between stages, but is defined here for
+ * convenience.
+ */
+. = CONFIG_X86_RESET_VECTOR - ARCH_STACK_ALIGN_SIZE - _STACK_SIZE - _CONSOLE_SIZE - _TIMESTAMPS_SIZE - _FMAP_SIZE;
+
+_ = ASSERT(. > _eprogram, "Not enough room for .earlyram.data. Try increasing C_ENV_BOOTBLOCK_SIZE, or decreasing either EARLYRAM_BSP_STACK_SIZE or PRERAM_CBMEM_CONSOLE_SIZE.");
+
+.stack ALIGN(ARCH_STACK_ALIGN_SIZE) (NOLOAD) : {
+ EARLYRAM_STACK(., _STACK_SIZE)
+}
+
+.persistent ALIGN(ARCH_POINTER_ALIGN_SIZE) (NOLOAD) : {
+ PRERAM_CBMEM_CONSOLE(., _CONSOLE_SIZE)
+ TIMESTAMP(., _TIMESTAMPS_SIZE)
+ #if !CONFIG(NO_FMAP_CACHE)
+ FMAP_CACHE(., FMAP_SIZE)
+ #endif
+}
+
+_ = ASSERT(. <= CONFIG_X86_RESET_VECTOR, "Earlyram data regions don't fit below the reset vector!");
diff --git a/src/arch/x86/include/arch/memlayout.h b/src/arch/x86/include/arch/memlayout.h
index 2eea83faaf1b..34d1bd2567de 100644
--- a/src/arch/x86/include/arch/memlayout.h
+++ b/src/arch/x86/include/arch/memlayout.h
@@ -8,4 +8,7 @@
# error "CONFIG_RAMTOP not configured"
#endif
+/* Intel386 psABI requires a 16 byte aligned stack. */
+#define ARCH_STACK_ALIGN_SIZE 16
+
#endif /* __ARCH_MEMLAYOUT_H */
diff --git a/src/arch/x86/memlayout.ld b/src/arch/x86/memlayout.ld
index 5e1ef24655fa..31767b3c3126 100644
--- a/src/arch/x86/memlayout.ld
+++ b/src/arch/x86/memlayout.ld
@@ -9,7 +9,7 @@
#if ENV_CACHE_AS_RAM
#define EARLY_MEMLAYOUT "car.ld"
#else
-#error "Early DRAM environment for x86 is work-in-progress. */
+#define EARLY_MEMLAYOUT "early_ram.ld"
#endif
#endif
@@ -53,7 +53,9 @@ SECTIONS
/* Bootblock specific scripts which provide more SECTION directives. */
#include <cpu/x86/16bit/entry16.ld>
#include <cpu/x86/16bit/reset16.ld>
+#if !CONFIG(RESET_VECTOR_IN_RAM)
#include <arch/x86/id.ld>
+#endif
#if CONFIG(CPU_INTEL_FIRMWARE_INTERFACE_TABLE)
#include <cpu/intel/fit/fit.ld>
#endif