Edward O'Callaghan (eocallaghan@alterapraxis.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4719
-gerrit
commit fdac806240c2aa5da7820147bc3928920ff32e07 Author: Edward O'Callaghan eocallaghan@alterapraxis.com Date: Thu Feb 20 01:51:43 2014 +1100
CAR_GLOBAL: enforce compiler to check if _start != _end
There are some fun rules C compilers can use to optimize their code. One of them is the assumption that two symbols point to two different addresses. In this case this wasn't true, resulting in unintended code execution (and later, a crash) with a clang build.
Change-Id: I1496b22e1d1869ed0610e321b6ec6a83252e9d8b Signed-off-by: Patrick Georgi patrick@georgi-clan.de Signed-off-by: Edward O'Callaghan eocallaghan@alterapraxis.com --- src/arch/x86/init/romstage.ld | 1 + src/cpu/x86/car.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/arch/x86/init/romstage.ld b/src/arch/x86/init/romstage.ld index f44185f..5458cfc 100644 --- a/src/arch/x86/init/romstage.ld +++ b/src/arch/x86/init/romstage.ld @@ -37,6 +37,7 @@ SECTIONS . = ALIGN(16); _car_migrate_start = .; *(.car.migrate); + LONG(0); _car_migrate_end = .; . = ALIGN(16); _erom = .; diff --git a/src/cpu/x86/car.c b/src/cpu/x86/car.c index 481153d..8f6a855 100644 --- a/src/cpu/x86/car.c +++ b/src/cpu/x86/car.c @@ -98,7 +98,7 @@ void car_migrate_variables(void)
/* Call all the migration functions. */ migrate_func = &_car_migrate_start; - while (migrate_func != &_car_migrate_end) { + while (*migrate_func != NULL) { (*migrate_func)(); migrate_func++; }