From e83874942509247979f949835372c9f6f72e7d5e Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Fri, 14 Jun 2013 15:53:23 -0700 Subject: [PATCH] ARM: Tell the linker memset and memcpy are functions. The memset and memcpy functions are assembled as ARM code, likely because that's the default of the assembler. Without special annotation, the assembler and linker don't know that those symbols are functions which need special handling so that ARM/thumb issues are handled properly. This change adds that annotation which gets those functions working in Coreboot which is compiled as thumb. Libpayload and depthcharge are compiled as ARM so they don't *need* the annotation since it just works out in ARM mode, but it's the safe thing to do in case we change that in the future. We should explicitly select ARM vs. thumb when assembling assembly files to be consistent across builds and toolchains. BUG=None TEST=Built with the assembly versions of memcpy and memset turned on and saw that we could boot after this change where we couldn't before. Disassembled a function which calls memset and saw that it was using the blx instruction which can change mode instead of the bl instruction which can't. BRANCH=None Change-Id: Ic3ef4faf17d3467b5042c944106b8743d517cce3 Signed-off-by: Gabe Black Reviewed-on: https://gerrit.chromium.org/gerrit/58728 Commit-Queue: Gabe Black Reviewed-by: Gabe Black Tested-by: Gabe Black Reviewed-by: David Hendricks Reviewed-by: Stefan Reinauer --- payloads/libpayload/arch/armv7/memcpy.S | 1 + payloads/libpayload/arch/armv7/memset.S | 1 + src/arch/armv7/memcpy.S | 1 + src/arch/armv7/memset.S | 1 + 4 files changed, 4 insertions(+) diff --git a/payloads/libpayload/arch/armv7/memcpy.S b/payloads/libpayload/arch/armv7/memcpy.S index 549320c8d1..e68b28f542 100644 --- a/payloads/libpayload/arch/armv7/memcpy.S +++ b/payloads/libpayload/arch/armv7/memcpy.S @@ -57,6 +57,7 @@ /* Prototype: void *memcpy(void *dest, const void *src, size_t n); */ +.type memcpy, function .globl memcpy memcpy: diff --git a/payloads/libpayload/arch/armv7/memset.S b/payloads/libpayload/arch/armv7/memset.S index 4ff4c3ce93..aa4f57a993 100644 --- a/payloads/libpayload/arch/armv7/memset.S +++ b/payloads/libpayload/arch/armv7/memset.S @@ -27,6 +27,7 @@ * memset again. */ +.type memset, function .globl memset memset: ands r3, r0, #3 @ 1 unaligned? diff --git a/src/arch/armv7/memcpy.S b/src/arch/armv7/memcpy.S index f04113f279..921fc2a6bc 100644 --- a/src/arch/armv7/memcpy.S +++ b/src/arch/armv7/memcpy.S @@ -57,6 +57,7 @@ /* Prototype: void *memcpy(void *dest, const void *src, size_t n); */ +.type memcpy, function .globl memcpy memcpy: diff --git a/src/arch/armv7/memset.S b/src/arch/armv7/memset.S index 3ea2721227..a3cc9477f8 100644 --- a/src/arch/armv7/memset.S +++ b/src/arch/armv7/memset.S @@ -27,6 +27,7 @@ * memset again. */ +.type memset, function .globl memset memset: ands r3, r0, #3 @ 1 unaligned?