From fffbda5897059d642dd3d8facd2a14ada6da416b Mon Sep 17 00:00:00 2001 From: Stefan Reinauer Date: Wed, 31 Jul 2013 16:28:44 -0700 Subject: [PATCH] ARMv7: Fix location of CBMEM console in romstage The CBMEM console pointer in romstage is actually a zero byte array. This means CBMEM area has to live at the end of the allocations or else CBMEM console will overwrite whatever comes after it. Change-Id: Icc59e982b724a2d396370c3a5abd8898e08baf26 Signed-off-by: Stefan Reinauer Reviewed-on: https://gerrit.chromium.org/gerrit/63997 Reviewed-by: Aaron Durbin Commit-Queue: Stefan Reinauer Tested-by: Stefan Reinauer Reviewed-on: http://review.coreboot.org/4428 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi --- src/arch/armv7/romstage.ld | 39 +++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/arch/armv7/romstage.ld b/src/arch/armv7/romstage.ld index 14c5bde3a6..11a91cf0af 100644 --- a/src/arch/armv7/romstage.ld +++ b/src/arch/armv7/romstage.ld @@ -60,19 +60,6 @@ SECTIONS _erom = .; } - .car.data . (NOLOAD) : { - _car_data_start = .; - *(.car.global_data); - /* The cbmem_console section comes last to take advantage of - * a zero-sized array to hold the memconsole contents that - * grows to a bound of CONFIG_CONSOLE_CAR_BUFFER_SIZE. However, - * collisions within the cache-as-ram region cannot be - * statically checked because the cache-as-ram region usage is - * cpu/chipset dependent. */ - *(.car.cbmem_console); - _car_data_end = .; - } - /* bss does not contain data, it is just a space that should be zero * initialized on startup. (typically uninitialized global variables) * crt0.S fills between _bss and _ebss with zeroes. @@ -84,9 +71,35 @@ SECTIONS *(.sbss) *(COMMON) } + _ebss = .; + + .car.data . (NOLOAD) : { + . = ALIGN(8); + _car_data_start = .; + *(.car.global_data); + . = ALIGN(8); + /* The cbmem_console section comes last to take advantage of + * a zero-sized array to hold the memconsole contents that + * grows to a bound of CONFIG_CONSOLE_CAR_BUFFER_SIZE. However, + * collisions within the cache-as-ram region cannot be + * statically checked because the cache-as-ram region usage is + * cpu/chipset dependent. */ + *(.car.cbmem_console); + _car_data_end = .; + } + _end = .; + /* TODO: check if we are running out of SRAM. Below check is not good + * enough though because SRAM has different size on different CPUs + * and not all SRAM is available to the romstage. On Exynos, some is + * used for BL1, the bootblock and the stack. + * + * _bogus = ASSERT((_end - _start + EXPECTED_CBMEM_CONSOLE_SIZE <= \ + * 0x54000), "SRAM area is too full"); + */ + /* Discard the sections we don't need/want */ /DISCARD/ : { *(.comment)