7c6e489b23
This patch changes the ENTRY() macro in asm.h to create a new section for every assembler function, thus providing dcache_clean/invalidate_all and friends with the same --gc-sections goodness that our C functions have. This requires a few minor changes of moving around data (to make sure it ends up in the right section) and changing some libgcc functions (which apparently need to have two names?), but nothing serious. (You may note that some of our assembly functions have data, sometimes even writable, within the same .text section. This has been this way before and I'm not looking to change it for now, although it's not totally clean. Since we don't enforce read-only sections through paging, it doesn't really hurt.) BUG=None TEST=Nyan and Snow still boot. Confirm dcache_invalidate_all is not output into any binary anymore since no one actually uses it. Original-Change-Id: I247b29d6173ba516c8dff59126c93b66f7dc4b8d Original-Signed-off-by: Julius Werner <jwerner@chromium.org> Original-Reviewed-on: https://chromium-review.googlesource.com/183891 (cherry picked from commit 4a3f2e45e06cc8592d56c3577f41ff879f10e9cc) Signed-off-by: Marc Jones <marc.jones@se-eng.com> Change-Id: Ieaa4f2ea9d81c5b9e2b36a772ff9610bdf6446f9 Reviewed-on: http://review.coreboot.org/7451 Tested-by: build bot (Jenkins) Reviewed-by: David Hendricks <dhendrix@chromium.org>
89 lines
2.8 KiB
ArmAsm
89 lines
2.8 KiB
ArmAsm
/*
|
|
* Early initialization code for ARM architecture.
|
|
*
|
|
* This file is based off of the OMAP3530/ARM Cortex start.S file from Das
|
|
* U-Boot, which itself got the file from armboot.
|
|
*
|
|
* Copyright (c) 2004 Texas Instruments <r-woodruff2@ti.com>
|
|
* Copyright (c) 2001 Marius Gröger <mag@sysgo.de>
|
|
* Copyright (c) 2002 Alex Züpke <azu@sysgo.de>
|
|
* Copyright (c) 2002 Gary Jennejohn <garyj@denx.de>
|
|
* Copyright (c) 2003 Richard Woodruff <r-woodruff2@ti.com>
|
|
* Copyright (c) 2003 Kshitij <kshitij@ti.com>
|
|
* Copyright (c) 2006-2008 Syed Mohammed Khasim <x0khasim@ti.com>
|
|
* Copyright (c) 2013 The Chromium OS Authors
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; version 2 of
|
|
* the License.
|
|
*
|
|
* 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 <arch/asm.h>
|
|
|
|
ENTRY(_start)
|
|
/*
|
|
* Set the cpu to System mode with IRQ and FIQ disabled. Prefetch/Data
|
|
* aborts may happen early and crash before the abort handlers are
|
|
* installed, but at least the problem will show up near the code that
|
|
* causes it.
|
|
*/
|
|
msr cpsr_cxf, #0xdf
|
|
|
|
/*
|
|
* Initialize the stack to a known value. This is used to check for
|
|
* stack overflow later in the boot process.
|
|
*/
|
|
ldr r0, .Stack
|
|
ldr r1, .Stack_size
|
|
sub r0, r0, r1
|
|
ldr r1, .Stack
|
|
ldr r2, =0xdeadbeef
|
|
init_stack_loop:
|
|
str r2, [r0]
|
|
add r0, #4
|
|
cmp r0, r1
|
|
bne init_stack_loop
|
|
|
|
/* Set stackpointer in internal RAM to call bootblock main() */
|
|
call_bootblock:
|
|
ldr sp, .Stack /* Set up stack pointer */
|
|
ldr r0,=0x00000000
|
|
/*
|
|
* The current design of cpu_info places the
|
|
* struct at the top of the stack. The number of
|
|
* words pushed must be at least as large as that
|
|
* struct.
|
|
*/
|
|
push {r0-r2}
|
|
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
|
/*
|
|
* Use "bl" instead of "b" even though we do not intend to return.
|
|
* "bl" gets compiled to "blx" if we're transitioning from ARM to
|
|
* Thumb. However, "b" will not and GCC may attempt to create a
|
|
* wrapper which is currently broken.
|
|
*/
|
|
bl main
|
|
ENDPROC(_start)
|
|
|
|
/* we do it this way because it's a 32-bit constant and
|
|
* in some cases too far away to be loaded as just an offset
|
|
* from IP
|
|
*/
|
|
.align 2
|
|
.Stack:
|
|
.word CONFIG_STACK_TOP
|
|
.align 2
|
|
/* create this size the same way we do in coreboot_ram.ld: top-bottom */
|
|
.Stack_size:
|
|
.word CONFIG_STACK_TOP - CONFIG_STACK_BOTTOM
|