From 1f65ed53da16e383416ae034b585fd52682f5ea7 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 13 Mar 2016 11:09:01 +0000 Subject: [PATCH] [build] Allow assembler section type character to vary by architecture On some architectures (such as ARM) the "@" character is used as a comment delimiter. A section type argument such as "@progbits" therefore becomes "%progbits". This is further complicated by the fact that the "%" character has special meaning for inline assembly when input or output operands are used, in which cases "@progbits" becomes "%%progbits". Allow the section type character(s) to be defined via Makefile variables. Signed-off-by: Michael Brown --- src/Makefile.housekeeping | 7 ++++++- src/arch/x86/Makefile | 5 +++++ src/crypto/certstore.c | 2 +- src/crypto/privkey.c | 2 +- src/image/embedded.c | 2 +- src/include/compiler.h | 17 ++++++++++++++--- src/include/errno.h | 2 +- 7 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/Makefile.housekeeping b/src/Makefile.housekeeping index 0a80d2ac..4280f398 100644 --- a/src/Makefile.housekeeping +++ b/src/Makefile.housekeeping @@ -491,6 +491,11 @@ LDFLAGS += -static # CFLAGS += -include include/compiler.h +# The section type character (e.g. "@" in "@progbits") varies by +# architecture. +# +CFLAGS += -DASM_TCHAR='$(ASM_TCHAR)' -DASM_TCHAR_OPS='$(ASM_TCHAR_OPS)' + # CFLAGS for specific object types # CFLAGS_c += @@ -896,7 +901,7 @@ endif # Device ID tables (using IDs from ROM definition file) # define obj_pci_id_asm - .section ".pci_devlist.$(1)", "a", @progbits + .section ".pci_devlist.$(1)", "a", $(ASM_TCHAR)progbits .globl pci_devlist_$(1) pci_devlist_$(1): .short ( 0x$(1) & 0xffff ) diff --git a/src/arch/x86/Makefile b/src/arch/x86/Makefile index 6ad8031f..e933f4a4 100644 --- a/src/arch/x86/Makefile +++ b/src/arch/x86/Makefile @@ -1,3 +1,8 @@ +# Assembler section type character +# +ASM_TCHAR := @ +ASM_TCHAR_OPS := @ + # Include common x86 headers # INCDIRS += arch/x86/include diff --git a/src/crypto/certstore.c b/src/crypto/certstore.c index 503ce499..e62d8330 100644 --- a/src/crypto/certstore.c +++ b/src/crypto/certstore.c @@ -45,7 +45,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #define CERT( _index, _path ) \ extern char stored_cert_ ## _index ## _data[]; \ extern char stored_cert_ ## _index ## _len[]; \ - __asm__ ( ".section \".rodata\", \"a\", @progbits\n\t" \ + __asm__ ( ".section \".rodata\", \"a\", " PROGBITS "\n\t" \ "\nstored_cert_" #_index "_data:\n\t" \ ".incbin \"" _path "\"\n\t" \ "\nstored_cert_" #_index "_end:\n\t" \ diff --git a/src/crypto/privkey.c b/src/crypto/privkey.c index a6043bd1..0b10e9cf 100644 --- a/src/crypto/privkey.c +++ b/src/crypto/privkey.c @@ -54,7 +54,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); /* Raw private key data */ extern char private_key_data[]; extern char private_key_len[]; -__asm__ ( ".section \".rodata\", \"a\", @progbits\n\t" +__asm__ ( ".section \".rodata\", \"a\", " PROGBITS "\n\t" "\nprivate_key_data:\n\t" #ifdef PRIVATE_KEY ".incbin \"" PRIVATE_KEY "\"\n\t" diff --git a/src/image/embedded.c b/src/image/embedded.c index 48dd8685..376e5d29 100644 --- a/src/image/embedded.c +++ b/src/image/embedded.c @@ -18,7 +18,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #define EMBED( _index, _path, _name ) \ extern char embedded_image_ ## _index ## _data[]; \ extern char embedded_image_ ## _index ## _len[]; \ - __asm__ ( ".section \".rodata\", \"a\", @progbits\n\t" \ + __asm__ ( ".section \".rodata\", \"a\", " PROGBITS "\n\t" \ "\nembedded_image_" #_index "_data:\n\t" \ ".incbin \"" _path "\"\n\t" \ "\nembedded_image_" #_index "_end:\n\t" \ diff --git a/src/include/compiler.h b/src/include/compiler.h index ca82f952..32afb64c 100644 --- a/src/include/compiler.h +++ b/src/include/compiler.h @@ -52,6 +52,17 @@ /** Stringify expanded argument */ #define _S2( x ) _S1 ( x ) +/* Assembler section types */ +#ifdef ASSEMBLY +#define PROGBITS _C2 ( ASM_TCHAR, progbits ) +#define NOBITS _C2 ( ASM_TCHAR, nobits ) +#else +#define PROGBITS_OPS _S2 ( ASM_TCHAR_OPS ) "progbits" +#define PROGBITS _S2 ( ASM_TCHAR ) "progbits" +#define NOBITS_OPS _S2 ( ASM_TCHAR_OPS ) "nobits" +#define NOBITS _S2 ( ASM_TCHAR ) "nobits" +#endif + /** * @defgroup symmacros Macros to provide or require explicit symbols * @{ @@ -64,7 +75,7 @@ */ #ifdef ASSEMBLY #define PROVIDE_SYMBOL( symbol ) \ - .section ".provided", "a", @nobits ; \ + .section ".provided", "a", NOBITS ; \ .hidden symbol ; \ .globl symbol ; \ symbol: ; \ @@ -139,14 +150,14 @@ */ #ifdef ASSEMBLY #define PROVIDE_REQUIRING_SYMBOL() \ - .section ".tbl.requiring_symbols", "a", @progbits ; \ + .section ".tbl.requiring_symbols", "a", PROGBITS ; \ __requiring_symbol__: .byte 0 ; \ .size __requiring_symbol__, . - __requiring_symbol__ ; \ .previous #else #define PROVIDE_REQUIRING_SYMBOL() \ __asm__ ( ".section \".tbl.requiring_symbols\", " \ - " \"a\", @progbits\n" \ + " \"a\", " PROGBITS "\n" \ "__requiring_symbol__:\t.byte 0\n" \ ".size __requiring_symbol__, " \ " . - __requiring_symbol__\n" \ diff --git a/src/include/errno.h b/src/include/errno.h index 036479af..342384fa 100644 --- a/src/include/errno.h +++ b/src/include/errno.h @@ -258,7 +258,7 @@ static inline void eplatform_discard ( int dummy __unused, ... ) {} * @ret error Error */ #define __einfo_error( einfo ) ( { \ - __asm__ ( ".section \".einfo\", \"\", @progbits\n\t" \ + __asm__ ( ".section \".einfo\", \"\", " PROGBITS_OPS "\n\t" \ ".align 8\n\t" \ "\n1:\n\t" \ ".long ( 4f - 1b )\n\t" \