From 2a9db262a2bbf5b0cf0c904431afb7af172bb7eb Mon Sep 17 00:00:00 2001 From: Pavel Pisa Date: Sat, 28 Nov 2015 12:01:36 +0100 Subject: bsp/tms570: ensure that linker symbol comparison to NULL is not optimized out. Signed-off-by: Pavel Pisa --- c/src/lib/libbsp/arm/tms570/startup/bspstart.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/c/src/lib/libbsp/arm/tms570/startup/bspstart.c b/c/src/lib/libbsp/arm/tms570/startup/bspstart.c index b7e2b62591..7c1e9a17bf 100644 --- a/c/src/lib/libbsp/arm/tms570/startup/bspstart.c +++ b/c/src/lib/libbsp/arm/tms570/startup/bspstart.c @@ -32,6 +32,9 @@ void bsp_start( void ) { + void *need_remap_ptr; + unsigned int need_remap_int; + #if BYTE_ORDER == BIG_ENDIAN /* * If CPU is big endian (TMS570 family variant) @@ -65,9 +68,16 @@ void bsp_start( void ) * SRAM then it leads to CPU error halt. * * So use of POM to replace jumps to vectors target - * addresses seems to be the best option. + * addresses seems to be the best option for now. + * + * The passing of linker symbol (represented as start address + * of global array) through dummy asm block ensures that C compiler + * cannot optimize comparison out on premise that reference cannot + * evaluate to NULL definition in standard. */ - if ( (uintptr_t)bsp_start_vector_table_begin != 0 ) { + need_remap_ptr = bsp_start_vector_table_begin; + asm volatile ("\n": "=r" (need_remap_int): "0" (need_remap_ptr)); + if ( need_remap_int != 0 ) { tms570_pom_remap(); } -- cgit v1.2.3