aboutsummaryrefslogtreecommitdiff
path: root/src/arch/x86
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/x86')
-rw-r--r--src/arch/x86/Kconfig1
-rw-r--r--src/arch/x86/Makefile.inc2
-rw-r--r--src/arch/x86/c_start.S8
-rw-r--r--src/arch/x86/cbmem.c13
-rw-r--r--src/arch/x86/exit_car.S8
5 files changed, 18 insertions, 14 deletions
diff --git a/src/arch/x86/Kconfig b/src/arch/x86/Kconfig
index 502e7747f4..8ce5977fdb 100644
--- a/src/arch/x86/Kconfig
+++ b/src/arch/x86/Kconfig
@@ -16,6 +16,7 @@ config ARCH_X86
default n
select PCI
select RELOCATABLE_MODULES
+ select RAMSTAGE_CBMEM_TOP_ARG
# stage selectors for x86
diff --git a/src/arch/x86/Makefile.inc b/src/arch/x86/Makefile.inc
index 8d001745db..447fd57a11 100644
--- a/src/arch/x86/Makefile.inc
+++ b/src/arch/x86/Makefile.inc
@@ -259,7 +259,6 @@ postcar-generic-ccopts += -D__POSTCAR__
postcar-$(CONFIG_HAVE_ACPI_RESUME) += acpi_s3.c
postcar-y += gdt_init.S
postcar-y += cbfs_and_run.c
-postcar-y += cbmem.c
postcar-$(CONFIG_EARLY_EBDA_INIT) += ebda.c
postcar-$(CONFIG_IDT_IN_EVERY_STAGE) += exception.c
postcar-$(CONFIG_IDT_IN_EVERY_STAGE) += idt.S
@@ -299,7 +298,6 @@ ramstage-$(CONFIG_HAVE_ACPI_TABLES) += acpi_pld.c
ramstage-$(CONFIG_HAVE_ACPI_RESUME) += acpi_s3.c
ramstage-$(CONFIG_ACPI_BERT) += acpi_bert_storage.c
ramstage-y += c_start.S
-ramstage-y += cbmem.c
ramstage-y += cpu.c
ramstage-y += ebda.c
ramstage-y += exception.c
diff --git a/src/arch/x86/c_start.S b/src/arch/x86/c_start.S
index 43d78020e1..bd99c21c91 100644
--- a/src/arch/x86/c_start.S
+++ b/src/arch/x86/c_start.S
@@ -60,6 +60,14 @@ _start:
cld
+#ifdef __x86_64__
+ mov %rdi, _cbmem_top_ptr
+#else
+ /* The return argument is at 0(%esp), the calling argument at 4(%esp) */
+ movl 4(%esp), %eax
+ movl %eax, _cbmem_top_ptr
+#endif
+
/** poison the stack. Code should not count on the
* stack being full of zeros. This stack poisoning
* recently uncovered a bug in the broadcast SIPI
diff --git a/src/arch/x86/cbmem.c b/src/arch/x86/cbmem.c
index f7c58a47ce..fc85bc617f 100644
--- a/src/arch/x86/cbmem.c
+++ b/src/arch/x86/cbmem.c
@@ -18,19 +18,8 @@
void *cbmem_top_chipset(void)
{
- static void *cbmem_top_backup;
- void *top_backup;
-
- if (ENV_RAMSTAGE && cbmem_top_backup != NULL)
- return cbmem_top_backup;
-
/* Top of CBMEM is at highest usable DRAM address below 4GiB. */
- top_backup = (void *)restore_top_of_low_cacheable();
-
- if (ENV_RAMSTAGE)
- cbmem_top_backup = top_backup;
-
- return top_backup;
+ return (void *)restore_top_of_low_cacheable();
}
#endif /* CBMEM_TOP_BACKUP */
diff --git a/src/arch/x86/exit_car.S b/src/arch/x86/exit_car.S
index 679e335eb3..8c2878481b 100644
--- a/src/arch/x86/exit_car.S
+++ b/src/arch/x86/exit_car.S
@@ -31,6 +31,14 @@ _start:
/* Migrate GDT to this text segment */
call gdt_init
+#ifdef __x86_64__
+ mov %rdi, _cbmem_top_ptr
+#else
+ /* The return argument is at 0(%esp), the calling argument at 4(%esp) */
+ movl 4(%esp), %eax
+ movl %eax, _cbmem_top_ptr
+#endif
+
/* chipset_teardown_car() is expected to disable cache-as-ram. */
call chipset_teardown_car