Skip to contentSkip to conversation

use elfnote.h to generate vsyscall notes

PATCH In review Jeremy Fitzhardinge 2 participants 4 messages Apr 28, 2007

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 use elfnote.h to generate vsyscall notes

Use existing elfnote.h to generate vsyscall notes, rather than doing it locally. Changes elfnote.h a bit to suite, since this is the first asm user, and it wasn't quite right.

Cc "Eric W. Biederman" <[email protected]>
Cc Roland McGrath <[email protected]>
---
 arch/i386/kernel/vsyscall-note.S |   23 ++++++-----------------
 include/linux/elfnote.h          |   18 +++++++++++++-----
 2 files changed, 19 insertions(+), 22 deletions(-)

===================================================================

arch/i386/kernel/vsyscall-note.S +6 -17
@@ -3,23 +3,12 @@
  * Here we can supply some information useful to userland.
  */
 
-#include <linux/uts.h>
 #include <linux/version.h>
+#include <linux/elfnote.h>
 
-#define ASM_ELF_NOTE_BEGIN(name, flags, vendor, type)			      \
-	.section name, flags;						      \
-	.balign 4;							      \
-	.long 1f - 0f;		/* name length */			      \
-	.long 3f - 2f;		/* data length */			      \
-	.long type;		/* note type */				      \
-0:	.asciz vendor;		/* vendor name */			      \
-1:	.balign 4;							      \
-2:
-
-#define ASM_ELF_NOTE_END						      \
-3:	.balign 4;		/* pad out section */			      \
-	.previous
-
-	ASM_ELF_NOTE_BEGIN(".note.kernel-version", "a", UTS_SYSNAME, 0)
+/* Ideally this would use UTS_NAME, but using a quoted string here
+   doesn't work. Remember to change this when changing the
+   kernel's name. */
+ELFNOTE_START(Linux, 0, "a")
 	.long LINUX_VERSION_CODE
-	ASM_ELF_NOTE_END
+ELFNOTE_END

===================================================================

include/linux/elfnote.h +13 -5
@@ -38,17 +38,25 @@
  * e.g. ELFNOTE(XYZCo, 42, .asciz, "forty-two")
  *      ELFNOTE(XYZCo, 12, .long, 0xdeadbeef)
  */
-#define ELFNOTE(name, type, desctype, descdata)	\
-.pushsection .note.name, "",@note	;	\
+#define ELFNOTE_START(name, type, flags)	\
+.pushsection .note.name, flags,@note	;	\
   .align 4				;	\
   .long 2f - 1f		/* namesz */	;	\
-  .long 4f - 3f		/* descsz */	;	\
+  .long 4484f - 3f	/* descsz */	;	\
   .long type				;	\
 1:.asciz #name				;	\
 2:.align 4				;	\
-3:desctype descdata			;	\
-4:.align 4				;	\
+3:
+
+#define ELFNOTE_END				\
+4484:.align 4				;	\
 .popsection				;
+
+#define ELFNOTE(name, type, desc)		\
+	ELFNOTE_START(name, type, "")		\
+		desc			;	\
+	ELFNOTE_END
+
 #else	/* !__ASSEMBLER__ */
 #include <linux/elf.h>
 /*
#1 lore raw

Please don't change the section name that way. I don't see why the macros should do differently than what was in vsyscall-note.S to begin with.

Thanks,
Roland

#2 lore raw
Quoted 1 line · Roland McGrath

Please don't change the section name that way.

Does the section name matter? I've been operating under the assumption that it doesn't, other that needing to start with .note. Using .note.vendor means that all the vendor's notes will get grouped properly, but other than that it seems much of a muchness.

Quoted 3 lines

I don't see why the macros
should do differently than what was in vsyscall-note.S to begin with.

Well, passing the section name seems redundant unless its actually needed. In this case it will go from .note.kernel-version to .note.Linux, but it will end up being called .note in the final vdso regardless.

J

#3 lore raw

You're right. I was thinking of the output section name in the DSO.