aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorIan Campbell <Ian.Campbell@xensource.com>2006-09-26 02:32:28 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-09-26 11:48:56 -0400
commit5091e746848f74c9a2c0579b4ef8d8cd1a6b135d (patch)
treedba54fe198dbcde7a22873705241439859435f22 /include/linux
parent9c9b8b388296ad5a306ab238dc677cfe6ff4cb12 (diff)
[PATCH] Translate asm version of ELFNOTE macro into preprocessor macro
I've come across some problems with the assembly version of the ELFNOTE macro currently in -mm. (in x86-put-note-sections-into-a-pt_note-segment-in-vmlinux.patch) The first is that older gas does not support :varargs in .macro definitions (in my testing 2.17 does while 2.15 does not, I don't know when it became supported). The Changes file says binutils >= 2.12 so I think we need to avoid using it. There are no other uses in mainline or -mm. Old gas appears to just ignore it so you get "too many arguments" type errors. Secondly it seems that passing strings as arguments to assembler macros is broken without varargs. It looks like they get unquoted or each character is treated as a separate argument or something and this causes all manner of grief. I think this is because of the use of -traditional when compiling assembly files. Therefore I have translated the assembler macro into a pre-processor macro. I added the desctype as a separate argument instead of including it with the descdata as the previous version did since -traditional means the ELFNOTE definition after the #else needs to have the same number of arguments (I think so anyway, the -traditional CPP semantics are pretty fscking strange!). With this patch I am able to define elfnotes in assembly like this with both old and new assemblers. ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS, .asciz, "linux") ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION, .asciz, "2.6") ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION, .asciz, "xen-3.0") ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE, .long, __PAGE_OFFSET) Which seems reasonable enough. Signed-off-by: Ian Campbell <ian.campbell@xensource.com> Acked-by: Jeremy Fitzhardinge <jeremy@xensource.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/elfnote.h32
1 files changed, 17 insertions, 15 deletions
diff --git a/include/linux/elfnote.h b/include/linux/elfnote.h
index 16f9f8ebffd9..67396db141e8 100644
--- a/include/linux/elfnote.h
+++ b/include/linux/elfnote.h
@@ -31,22 +31,24 @@
31/* 31/*
32 * Generate a structure with the same shape as Elf{32,64}_Nhdr (which 32 * Generate a structure with the same shape as Elf{32,64}_Nhdr (which
33 * turn out to be the same size and shape), followed by the name and 33 * turn out to be the same size and shape), followed by the name and
34 * desc data with appropriate padding. The 'desc' argument includes 34 * desc data with appropriate padding. The 'desctype' argument is the
35 * the assembler pseudo op defining the type of the data: .asciz 35 * assembler pseudo op defining the type of the data e.g. .asciz while
36 * "hello, world" 36 * 'descdata' is the data itself e.g. "hello, world".
37 *
38 * e.g. ELFNOTE(XYZCo, 42, .asciz, "forty-two")
39 * ELFNOTE(XYZCo, 12, .long, 0xdeadbeef)
37 */ 40 */
38.macro ELFNOTE name type desc:vararg 41#define ELFNOTE(name, type, desctype, descdata) \
39.pushsection ".note.\name" 42.pushsection .note.name ; \
40 .align 4 43 .align 4 ; \
41 .long 2f - 1f /* namesz */ 44 .long 2f - 1f /* namesz */ ; \
42 .long 4f - 3f /* descsz */ 45 .long 4f - 3f /* descsz */ ; \
43 .long \type 46 .long type ; \
441:.asciz "\name" 471:.asciz "name" ; \
452:.align 4 482:.align 4 ; \
463:\desc 493:desctype descdata ; \
474:.align 4 504:.align 4 ; \
48.popsection 51.popsection ;
49.endm
50#else /* !__ASSEMBLER__ */ 52#else /* !__ASSEMBLER__ */
51#include <linux/elf.h> 53#include <linux/elf.h>
52/* 54/*