summaryrefslogtreecommitdiffstats
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86/assembly_entry.S6
-rw-r--r--src/arch/x86/car.ld10
-rw-r--r--src/arch/x86/include/arch/early_variables.h9
-rw-r--r--src/arch/x86/include/arch/symbols.h13
4 files changed, 21 insertions, 17 deletions
diff --git a/src/arch/x86/assembly_entry.S b/src/arch/x86/assembly_entry.S
index 5e84af24a2b9..c36dc1cb1045 100644
--- a/src/arch/x86/assembly_entry.S
+++ b/src/arch/x86/assembly_entry.S
@@ -32,11 +32,11 @@ _start:
/* reset stack pointer to CAR stack */
mov $_car_stack_end, %esp
- /* clear CAR_GLOBAL area as it is not shared */
+ /* clear .bss section as it is not shared */
cld
xor %eax, %eax
- movl $(_car_global_end), %ecx
- movl $(_car_global_start), %edi
+ movl $(_ebss), %ecx
+ movl $(_bss), %edi
sub %edi, %ecx
shrl $2, %ecx
rep stosl
diff --git a/src/arch/x86/car.ld b/src/arch/x86/car.ld
index a09150fcd985..6ccbd8c23624 100644
--- a/src/arch/x86/car.ld
+++ b/src/arch/x86/car.ld
@@ -64,11 +64,13 @@
. += 80;
_car_ehci_dbg_info_end = .;
- /* _car_global_start and _car_global_end provide symbols to per-stage
+ /* _bss and _ebss provide symbols to per-stage
* variables that are not shared like the timestamp and the pre-ram
* cbmem console. This is useful for clearing this area on a per-stage
* basis when more than one stage uses cache-as-ram for CAR_GLOBALs. */
- _car_global_start = .;
+
+ . = ALIGN(ARCH_POINTER_ALIGN_SIZE);
+ _bss = .;
#if ENV_STAGE_HAS_BSS_SECTION
/* Allow global uninitialized variables for stages without CAR teardown. */
*(.bss)
@@ -76,10 +78,12 @@
*(.sbss)
*(.sbss.*)
#else
+ _car_global_start = .;
*(.car.global_data);
+ _car_global_end = .;
#endif
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
- _car_global_end = .;
+ _ebss = .;
_car_unallocated_start = .;
#if !CONFIG(C_ENVIRONMENT_BOOTBLOCK)
diff --git a/src/arch/x86/include/arch/early_variables.h b/src/arch/x86/include/arch/early_variables.h
index 57f430661995..b88495c85ba9 100644
--- a/src/arch/x86/include/arch/early_variables.h
+++ b/src/arch/x86/include/arch/early_variables.h
@@ -20,6 +20,15 @@
#if ENV_ROMSTAGE && CONFIG(CAR_GLOBAL_MIGRATION)
+/*
+ * The _car_global_[start|end]symbols cover CAR data which is relocatable
+ * once memory comes online. Variables with CAR_GLOBAL decoration
+ * reside within this region.
+ */
+extern char _car_global_start[];
+extern char _car_global_end[];
+#define _car_global_size (_car_global_end - _car_global_start)
+
asm(".section .car.global_data,\"w\",@nobits");
asm(".previous");
#ifdef __clang__
diff --git a/src/arch/x86/include/arch/symbols.h b/src/arch/x86/include/arch/symbols.h
index a516155dec7e..f715e0a6d114 100644
--- a/src/arch/x86/include/arch/symbols.h
+++ b/src/arch/x86/include/arch/symbols.h
@@ -24,8 +24,8 @@ extern char _car_region_end[];
#define _car_region_size (_car_region_end - _car_region_start)
/*
- * This is the stack used under CONFIG_C_ENVIRONMENT_BOOTBLOCK for
- * all stages that execute when cache-as-ram is up.
+ * This is the stack area used for all stages that execute when cache-as-ram
+ * is up. Area is not cleared in between stages.
*/
extern char _car_stack_start[];
extern char _car_stack_end[];
@@ -38,13 +38,4 @@ extern char _car_ehci_dbg_info_end[];
#define _car_ehci_dbg_info_size \
(_car_ehci_dbg_info_end - _car_ehci_dbg_info_start)
-/*
- * The _car_global_[start|end]symbols cover CAR data which is relocatable
- * once memory comes online. Variables with CAR_GLOBAL decoration
- * reside within this region.
- */
-extern char _car_global_start[];
-extern char _car_global_end[];
-#define _car_global_size (_car_global_end - _car_global_start)
-
#endif