/* * start-arm.c * * Copyright (c) 2010 Sascha Hauer , Pengutronix * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #ifdef CONFIG_PBL_IMAGE /* * First function in the uncompressed image. We get here from * the pbl. */ void __naked __section(.text_entry) start(void) { u32 r; /* Setup the stack */ r = STACK_BASE + STACK_SIZE - 16; __asm__ __volatile__("mov sp, %0" : : "r"(r)); /* clear bss */ memset(__bss_start, 0, __bss_stop - __bss_start); start_barebox(); } #else /* * First function in the image without pbl support */ void __naked __section(.text_entry) start(void) { barebox_arm_head(); } /* * Board code can jump here by either returning from board_init_lowlevel * or by calling this function directly. */ void __naked board_init_lowlevel_return(void) { uint32_t r, offset; /* Setup the stack */ r = STACK_BASE + STACK_SIZE - 16; __asm__ __volatile__("mov sp, %0" : : "r"(r)); /* Get offset between linked address and runtime address */ offset = get_runtime_offset(); /* relocate to link address if necessary */ if (offset) memcpy((void *)_text, (void *)(_text - offset), __bss_start - _text); /* clear bss */ memset(__bss_start, 0, __bss_stop - __bss_start); flush_icache(); /* call start_barebox with its absolute address */ r = (unsigned int)&start_barebox; __asm__ __volatile__("mov pc, %0" : : "r"(r)); } #endif