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>
diff --git a/payloads/libpayload/arch/arm/head.S b/payloads/libpayload/arch/arm/head.S
index 7a706e3..0d23c72 100644
--- a/payloads/libpayload/arch/arm/head.S
+++ b/payloads/libpayload/arch/arm/head.S
@@ -27,17 +27,16 @@
  * SUCH DAMAGE.
  */
 
-	.global _entry, _leave
-	.text
-	.align 4
+#include <arch/asm.h>
 
 1:
+.align 4
 .word	_stack
 
 /*
  * Our entry point
  */
-_entry:
+ENTRY(_entry)
 
 	/* TODO: disable interrupts */
 
@@ -46,14 +45,15 @@
 	/* Setup new stack */
 	ldr sp, 1b
 
-	/* TODO: Save old stack pointer */
+	/* TODO: Save old stack pointer and link register */
 
 	/* Let's rock. */
-	b start_main
+	bl start_main
 
-	/* %eax has the return value - pass it on unmolested */
-_leave:
-	/* TODO: restore old stack pointer. */
+	/* %r0 has the return value - pass it on unmolested */
+
+	/* TODO: restore old stack pointer and link register */
 
 	/* Return to the original context. */
-	mov pc, lr
+	bx lr
+ENDPROC(_entry)
diff --git a/payloads/libpayload/arch/arm/util.S b/payloads/libpayload/arch/arm/util.S
index e3f173e..7c14a39 100644
--- a/payloads/libpayload/arch/arm/util.S
+++ b/payloads/libpayload/arch/arm/util.S
@@ -27,11 +27,9 @@
  * SUCH DAMAGE.
  */
 
-	.global halt
-	.text
-	.align 4
+#include <arch/asm.h>
 
 /* This function puts the system into a halt. */
-	.type halt, function
-halt:
+ENTRY(halt)
 	b halt
+ENDPROC(halt)
diff --git a/payloads/libpayload/include/arm/arch/asm.h b/payloads/libpayload/include/arm/arch/asm.h
new file mode 100644
index 0000000..1c3f7a2
--- /dev/null
+++ b/payloads/libpayload/include/arm/arch/asm.h
@@ -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 */
diff --git a/src/arch/arm/armv4/Makefile.inc b/src/arch/arm/armv4/Makefile.inc
index d054b31..aa78868 100644
--- a/src/arch/arm/armv4/Makefile.inc
+++ b/src/arch/arm/armv4/Makefile.inc
@@ -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
diff --git a/src/arch/arm/armv4/bootblock.S b/src/arch/arm/armv4/bootblock.S
index 3ba2a88..58a34cf 100644
--- a/src/arch/arm/armv4/bootblock.S
+++ b/src/arch/arm/armv4/bootblock.S
@@ -29,19 +29,10 @@
  * MA 02111-1307 USA
  */
 
+#include <arch/asm.h>
+
 .section ".start", "a", %progbits
-.globl _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:
+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
@@ -84,6 +75,7 @@
 	 * 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
diff --git a/src/arch/arm/armv7/Makefile.inc b/src/arch/arm/armv7/Makefile.inc
index 2cc42bb..033d498 100644
--- a/src/arch/arm/armv7/Makefile.inc
+++ b/src/arch/arm/armv7/Makefile.inc
@@ -20,7 +20,7 @@
 ###############################################################################
 
 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
diff --git a/src/arch/arm/armv7/bootblock.S b/src/arch/arm/armv7/bootblock.S
index cfe65e5..a8d0973 100644
--- a/src/arch/arm/armv7/bootblock.S
+++ b/src/arch/arm/armv7/bootblock.S
@@ -29,9 +29,10 @@
  * MA 02111-1307 USA
  */
 
+#include <arch/asm.h>
+
 .section ".start", "a", %progbits
-.globl _start
-_start:
+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
@@ -89,6 +90,7 @@
 wait_for_interrupt:
 	wfi
 	mov	pc, lr			@ back to my caller
+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
diff --git a/src/arch/arm/include/arch/asm.h b/src/arch/arm/include/arch/asm.h
new file mode 100644
index 0000000..1c3f7a2
--- /dev/null
+++ b/src/arch/arm/include/arch/asm.h
@@ -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 */
diff --git a/src/soc/nvidia/tegra124/bootblock_asm.S b/src/soc/nvidia/tegra124/bootblock_asm.S
index 3ba2a88..58a34cf 100644
--- a/src/soc/nvidia/tegra124/bootblock_asm.S
+++ b/src/soc/nvidia/tegra124/bootblock_asm.S
@@ -29,19 +29,10 @@
  * MA 02111-1307 USA
  */
 
+#include <arch/asm.h>
+
 .section ".start", "a", %progbits
-.globl _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:
+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
@@ -84,6 +75,7 @@
 	 * 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