arm: Move libgcc assembly macros to arch/asm.h

libgcc/macros.h contains some useful assembly macros that are common in
Linux kernel code and facilitate things such as unified ARM/THUMB
assembly. This patch moves it to a more general place where it can be
used by other code as well.

Change-Id: If68e8930aaafa706c54cf9a156fac826b31bb193
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/182178
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
(cherry picked from commit a780670def94a969829811fa8cf257f12b88f085)
Signed-off-by: Isaac Christensen <isaac.christensen@se-eng.com>
Reviewed-on: http://review.coreboot.org/6917
Tested-by: build bot (Jenkins)
Reviewed-by: David Hendricks <dhendrix@chromium.org>
This commit is contained in:
Julius Werner 2013-12-12 20:24:48 -08:00 committed by Isaac Christensen
parent 406bad127b
commit 64b9ca9d4e
9 changed files with 122 additions and 43 deletions

View File

@ -27,17 +27,16 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.global _entry, _leave #include <arch/asm.h>
.text
.align 4
1: 1:
.align 4
.word _stack .word _stack
/* /*
* Our entry point * Our entry point
*/ */
_entry: ENTRY(_entry)
/* TODO: disable interrupts */ /* TODO: disable interrupts */
@ -46,14 +45,15 @@ _entry:
/* Setup new stack */ /* Setup new stack */
ldr sp, 1b ldr sp, 1b
/* TODO: Save old stack pointer */ /* TODO: Save old stack pointer and link register */
/* Let's rock. */ /* Let's rock. */
b start_main bl start_main
/* %eax has the return value - pass it on unmolested */ /* %r0 has the return value - pass it on unmolested */
_leave:
/* TODO: restore old stack pointer. */ /* TODO: restore old stack pointer and link register */
/* Return to the original context. */ /* Return to the original context. */
mov pc, lr bx lr
ENDPROC(_entry)

View File

@ -27,11 +27,9 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
.global halt #include <arch/asm.h>
.text
.align 4
/* This function puts the system into a halt. */ /* This function puts the system into a halt. */
.type halt, function ENTRY(halt)
halt:
b halt b halt
ENDPROC(halt)

View File

@ -0,0 +1,47 @@
/*
* This file is part of the coreboot project.
*
* Copyright 2013 Google Inc.
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef __ARM_ASM_H
#define __ARM_ASM_H
#if defined __arm__
# define ARM(x...) x
# define THUMB(x...)
#elif defined __thumb__
# define ARM(x...)
# define THUMB(x...) x
#else
# error Not in ARM or thumb mode!
#endif
#define ALIGN .align 0
#define ENDPROC(name) \
.type name, %function; \
END(name)
#define ENTRY(name) \
.globl name; \
ALIGN; \
name:
#define END(name) \
.size name, .-name
#endif /* __ARM_ASM_H */

View File

@ -19,7 +19,8 @@
## ##
############################################################################### ###############################################################################
armv4_flags = -marm -march=armv4t -I$(src)/arch/arm/include/armv4/ armv4_flags = -marm -march=armv4t -I$(src)/arch/arm/include/armv4/ \
-D__COREBOOT_ARM_ARCH__=4
############################################################################### ###############################################################################
# bootblock # bootblock

View File

@ -29,19 +29,10 @@
* MA 02111-1307 USA * MA 02111-1307 USA
*/ */
#include <arch/asm.h>
.section ".start", "a", %progbits .section ".start", "a", %progbits
.globl _start ENTRY(_start)
_start: b reset
.balignl 16,0xdeadbeef
_cbfs_master_header:
/* The CBFS master header is inserted by cbfstool at the first
* aligned offset after the above anchor string is found.
* Hence, we leave some space for it.
*/
.skip 128 @ Assumes 64-byte alignment
reset:
/* /*
* Set the cpu to System mode with IRQ and FIQ disabled. Prefetch/Data * Set the cpu to System mode with IRQ and FIQ disabled. Prefetch/Data
* aborts may happen early and crash before the abort handlers are * aborts may happen early and crash before the abort handlers are
@ -84,6 +75,7 @@ call_bootblock:
* wrapper which is currently broken. * wrapper which is currently broken.
*/ */
bl main bl main
ENDPROC(_start)
/* we do it this way because it's a 32-bit constant and /* 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 * in some cases too far away to be loaded as just an offset

View File

@ -20,7 +20,7 @@
############################################################################### ###############################################################################
armv7_flags = -march=armv7-a -mthumb -mthumb-interwork \ armv7_flags = -march=armv7-a -mthumb -mthumb-interwork \
-I$(src)/arch/arm/include/armv7/ -I$(src)/arch/arm/include/armv7/ -D__COREBOOT_ARM_ARCH__=7
############################################################################### ###############################################################################
# bootblock # bootblock

View File

@ -29,9 +29,10 @@
* MA 02111-1307 USA * MA 02111-1307 USA
*/ */
#include <arch/asm.h>
.section ".start", "a", %progbits .section ".start", "a", %progbits
.globl _start ENTRY(_start)
_start:
/* /*
* Set the cpu to System mode with IRQ and FIQ disabled. Prefetch/Data * Set the cpu to System mode with IRQ and FIQ disabled. Prefetch/Data
* aborts may happen early and crash before the abort handlers are * aborts may happen early and crash before the abort handlers are
@ -89,6 +90,7 @@ call_bootblock:
wait_for_interrupt: wait_for_interrupt:
wfi wfi
mov pc, lr @ back to my caller mov pc, lr @ back to my caller
ENDPROC(_start)
/* we do it this way because it's a 32-bit constant and /* 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 * in some cases too far away to be loaded as just an offset

View File

@ -0,0 +1,47 @@
/*
* This file is part of the coreboot project.
*
* Copyright 2013 Google Inc.
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef __ARM_ASM_H
#define __ARM_ASM_H
#if defined __arm__
# define ARM(x...) x
# define THUMB(x...)
#elif defined __thumb__
# define ARM(x...)
# define THUMB(x...) x
#else
# error Not in ARM or thumb mode!
#endif
#define ALIGN .align 0
#define ENDPROC(name) \
.type name, %function; \
END(name)
#define ENTRY(name) \
.globl name; \
ALIGN; \
name:
#define END(name) \
.size name, .-name
#endif /* __ARM_ASM_H */

View File

@ -29,19 +29,10 @@
* MA 02111-1307 USA * MA 02111-1307 USA
*/ */
#include <arch/asm.h>
.section ".start", "a", %progbits .section ".start", "a", %progbits
.globl _start ENTRY(_start)
_start: b reset
.balignl 16,0xdeadbeef
_cbfs_master_header:
/* The CBFS master header is inserted by cbfstool at the first
* aligned offset after the above anchor string is found.
* Hence, we leave some space for it.
*/
.skip 128 @ Assumes 64-byte alignment
reset:
/* /*
* Set the cpu to System mode with IRQ and FIQ disabled. Prefetch/Data * Set the cpu to System mode with IRQ and FIQ disabled. Prefetch/Data
* aborts may happen early and crash before the abort handlers are * aborts may happen early and crash before the abort handlers are
@ -84,6 +75,7 @@ call_bootblock:
* wrapper which is currently broken. * wrapper which is currently broken.
*/ */
bl main bl main
ENDPROC(_start)
/* we do it this way because it's a 32-bit constant and /* 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 * in some cases too far away to be loaded as just an offset