linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-kernel@vger.kernel.org, Andi Kleen <andi@firstfloor.org>,
	Huang Ying <ying.huang@intel.com>, Li Wei <W.Li@Sun.COM>,
	Michael Ellerman <michaele@au1.ibm.com>,
	Ingo Molnar <mingo@elte.hu>,
	Heiko Carstens <heicars2@linux.vnet.ibm.com>,
	Martin Schwidefsky <mschwid2@linux.vnet.ibm.com>,
	Rusty Russell <rusty@rustcorp.com.au>,
	WANG Cong <xiyou.wangcong@gmail.com>,
	Sam Ravnborg <sam@ravnborg.org>, Jeff Dike <jdike@addtoit.com>
Subject: [PATCH 1/4] kernel: constructor support
Date: Tue, 19 May 2009 16:24:17 +0200	[thread overview]
Message-ID: <20090519142417.187314650@linux.vnet.ibm.com> (raw)
In-Reply-To: 20090519142416.356254359@linux.vnet.ibm.com

[-- Attachment #1: kernel-constructor-support.patch --]
[-- Type: text/plain, Size: 6028 bytes --]

From: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>

Call constructors (gcc-generated initcall-like functions) during
kernel start and module load. Constructors are e.g. used for gcov data
initialization.

Disable constructor support for usermode Linux to prevent conflicts
with host glibc.

Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
Acked-by: WANG Cong <xiyou.wangcong@gmail.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Jeff Dike <jdike@addtoit.com>
---
 include/asm-generic/sections.h    |    3 +++
 include/asm-generic/vmlinux.lds.h |   11 ++++++++++-
 include/linux/init.h              |    3 +++
 include/linux/module.h            |    6 ++++++
 init/Kconfig                      |    5 +++++
 init/main.c                       |   12 ++++++++++++
 kernel/module.c                   |   16 ++++++++++++++++
 7 files changed, 55 insertions(+), 1 deletion(-)

Index: linux-2.6.30-rc6/include/asm-generic/vmlinux.lds.h
===================================================================
--- linux-2.6.30-rc6.orig/include/asm-generic/vmlinux.lds.h	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/include/asm-generic/vmlinux.lds.h	2009-05-19 12:41:25.000000000 +0200
@@ -332,6 +332,14 @@
 /* Section used for early init (in .S files) */
 #define HEAD_TEXT  *(HEAD_TEXT_SECTION)
 
+#ifdef CONFIG_CONSTRUCTORS
+#define KERNEL_CTORS()	VMLINUX_SYMBOL(__ctors_start) = .; \
+			*(.ctors)			   \
+			VMLINUX_SYMBOL(__ctors_end) = .;
+#else
+#define KERNEL_CTORS()
+#endif
+
 /* init and exit section handling */
 #define INIT_DATA							\
 	*(.init.data)							\
@@ -340,7 +348,8 @@
 	CPU_DISCARD(init.data)						\
 	CPU_DISCARD(init.rodata)					\
 	MEM_DISCARD(init.data)						\
-	MEM_DISCARD(init.rodata)
+	MEM_DISCARD(init.rodata)					\
+	KERNEL_CTORS()
 
 #define INIT_TEXT							\
 	*(.init.text)							\
Index: linux-2.6.30-rc6/include/linux/init.h
===================================================================
--- linux-2.6.30-rc6.orig/include/linux/init.h	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/include/linux/init.h	2009-05-19 12:41:25.000000000 +0200
@@ -136,6 +136,9 @@
 extern initcall_t __con_initcall_start[], __con_initcall_end[];
 extern initcall_t __security_initcall_start[], __security_initcall_end[];
 
+/* Used for contructor calls. */
+typedef void (*ctor_fn_t)(void);
+
 /* Defined in init/main.c */
 extern int do_one_initcall(initcall_t fn);
 extern char __initdata boot_command_line[];
Index: linux-2.6.30-rc6/include/linux/module.h
===================================================================
--- linux-2.6.30-rc6.orig/include/linux/module.h	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/include/linux/module.h	2009-05-19 12:41:25.000000000 +0200
@@ -354,6 +354,12 @@
 	local_t ref;
 #endif
 #endif
+
+#ifdef CONFIG_CONSTRUCTORS
+	/* Constructor functions. */
+	ctor_fn_t *ctors;
+	unsigned int num_ctors;
+#endif
 };
 #ifndef MODULE_ARCH_INIT
 #define MODULE_ARCH_INIT {}
Index: linux-2.6.30-rc6/init/main.c
===================================================================
--- linux-2.6.30-rc6.orig/init/main.c	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/init/main.c	2009-05-19 12:41:25.000000000 +0200
@@ -700,6 +700,17 @@
 	rest_init();
 }
 
+/* Call all constructor functions linked into the kernel. */
+static void __init do_ctors(void)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	ctor_fn_t *call = (ctor_fn_t *) __ctors_start;
+
+	for (; call < (ctor_fn_t *) __ctors_end; call++)
+		(*call)();
+#endif
+}
+
 int initcall_debug;
 core_param(initcall_debug, initcall_debug, bool, 0644);
 
@@ -780,6 +791,7 @@
 	usermodehelper_init();
 	driver_init();
 	init_irq_proc();
+	do_ctors();
 	do_initcalls();
 }
 
Index: linux-2.6.30-rc6/kernel/module.c
===================================================================
--- linux-2.6.30-rc6.orig/kernel/module.c	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/kernel/module.c	2009-05-19 12:41:26.000000000 +0200
@@ -2172,6 +2172,10 @@
 					sizeof(*mod->tracepoints),
 					&mod->num_tracepoints);
 #endif
+#ifdef CONFIG_CONSTRUCTORS
+	mod->ctors = section_objs(hdr, sechdrs, secstrings, ".ctors",
+				  sizeof(*mod->ctors), &mod->num_ctors);
+#endif
 
 #ifdef CONFIG_MODVERSIONS
 	if ((mod->num_syms && !mod->crcs)
@@ -2328,6 +2332,17 @@
 	goto free_hdr;
 }
 
+/* Call module constructors. */
+static void do_mod_ctors(struct module *mod)
+{
+#ifdef CONFIG_CONSTRUCTORS
+	unsigned long i;
+
+	for (i = 0; i < mod->num_ctors; i++)
+		mod->ctors[i]();
+#endif
+}
+
 /* This is where the real work happens */
 SYSCALL_DEFINE3(init_module, void __user *, umod,
 		unsigned long, len, const char __user *, uargs)
@@ -2356,6 +2371,7 @@
 	blocking_notifier_call_chain(&module_notify_list,
 			MODULE_STATE_COMING, mod);
 
+	do_mod_ctors(mod);
 	/* Start the module */
 	if (mod->init != NULL)
 		ret = do_one_initcall(mod->init);
Index: linux-2.6.30-rc6/init/Kconfig
===================================================================
--- linux-2.6.30-rc6.orig/init/Kconfig	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/init/Kconfig	2009-05-19 12:41:26.000000000 +0200
@@ -16,6 +16,11 @@
 	default "$ARCH_DEFCONFIG"
 	default "arch/$ARCH/defconfig"
 
+config CONSTRUCTORS
+	bool
+	depends on !UML
+	default y
+
 menu "General setup"
 
 config EXPERIMENTAL
Index: linux-2.6.30-rc6/include/asm-generic/sections.h
===================================================================
--- linux-2.6.30-rc6.orig/include/asm-generic/sections.h	2009-05-19 12:27:39.000000000 +0200
+++ linux-2.6.30-rc6/include/asm-generic/sections.h	2009-05-19 12:41:26.000000000 +0200
@@ -14,6 +14,9 @@
 extern char __initdata_begin[], __initdata_end[];
 extern char __start_rodata[], __end_rodata[];
 
+/* Start and end of .ctors section - used for constructor calls. */
+extern char __ctors_start[], __ctors_end[];
+
 /* function descriptor handling (if any).  Override
  * in asm/sections.h */
 #ifndef dereference_function_descriptor



  reply	other threads:[~2009-05-19 14:26 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-05-19 14:24 [PATCH 0/4] gcov kernel support Peter Oberparleiter
2009-05-19 14:24 ` Peter Oberparleiter [this message]
2009-05-19 14:24 ` [PATCH 2/4] seq_file: add function to write binary data Peter Oberparleiter
2009-05-19 14:24 ` [PATCH 3/4] gcov: add gcov profiling infrastructure Peter Oberparleiter
2009-05-19 15:00   ` Ingo Molnar
2009-05-22  8:55     ` Peter Oberparleiter
2009-05-22  9:22       ` Andi Kleen
2009-05-19 14:24 ` [PATCH 4/4] gcov: enable GCOV_PROFILE_ALL for x86_64 Peter Oberparleiter
  -- strict thread matches above, loose matches on Subject: below --
2009-06-02 11:43 [PATCH 0/4] gcov kernel support Peter Oberparleiter
2009-06-02 11:44 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
2009-06-02 21:32   ` Andrew Morton
2009-06-03 11:55     ` Peter Oberparleiter
2009-05-12 15:38 [PATCH 0/4] gcov kernel support Peter Oberparleiter
2009-05-12 15:38 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
2009-05-08 15:44 [PATCH 0/4] gcov kernel support Peter Oberparleiter
2009-05-08 15:44 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
2009-05-09  5:03   ` Américo Wang
2009-05-11  8:43     ` Peter Oberparleiter
2009-05-11 18:54       ` Sam Ravnborg
2009-05-12 13:12         ` Peter Oberparleiter
2009-05-07 12:45 [PATCH 0/4] gcov kernel support Peter Oberparleiter
2009-05-07 12:45 ` [PATCH 1/4] kernel: constructor support Peter Oberparleiter
2009-05-07 12:51   ` Ingo Molnar
2009-05-07 13:33     ` Peter Oberparleiter
2009-05-07 12:53   ` Ingo Molnar
2009-05-07 13:38     ` Peter Oberparleiter
2009-05-07 13:48       ` Ingo Molnar
2009-05-08 11:23         ` Peter Oberparleiter
2009-02-26 13:51 Peter Oberparleiter
2009-02-03 12:46 Peter Oberparleiter
2009-02-04  2:54 ` Rusty Russell
2009-02-04 15:05   ` Peter Oberparleiter
2009-02-04 23:23     ` Rusty Russell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090519142417.187314650@linux.vnet.ibm.com \
    --to=oberpar@linux.vnet.ibm.com \
    --cc=W.Li@Sun.COM \
    --cc=akpm@linux-foundation.org \
    --cc=andi@firstfloor.org \
    --cc=heicars2@linux.vnet.ibm.com \
    --cc=jdike@addtoit.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=michaele@au1.ibm.com \
    --cc=mingo@elte.hu \
    --cc=mschwid2@linux.vnet.ibm.com \
    --cc=rusty@rustcorp.com.au \
    --cc=sam@ravnborg.org \
    --cc=xiyou.wangcong@gmail.com \
    --cc=ying.huang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).