public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [patch 0/5] autoparam v0.2: generating parameter descriptions on compile
@ 2005-07-07 11:25 domen
  2005-07-07 11:25 ` [patch 1/5] autoparam: includes domen
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: domen @ 2005-07-07 11:25 UTC (permalink / raw)
  To: linux-kernel; +Cc: damm

Hi!

The purpose of autoparam is to generate boot parameter descriptions
from sources. It does that by creating a new section called
__param_strings. (The interesting bits here are from Magnus Damm.)
It fills a gap about undocumented boot options from modules.

It consists of 5 patches:

autoparam_1-includes
  Descriptions get saved in __param_strings. Also added a new
  __setup_desc().

autoparam_2-makefile
  On every vmlinux change .kernel-parameters.o gets regenerated, and
  __param_strings removed from vmlinux. (It's still bigger than
  non-patched vmlinux, but all sections are of same length, alignment
  issues?)
  Also, a new target "make kernelparams" which generates
  Documentation/kernel-parameters-gen.txt. It should probably not be
  in $(srctree) though.
  There should be some more work done here, but I'm out of ideas ATM.

autoparam_3-extract_script
  Simple perl script to extract descriptions.

autoparam_4-af_unix_workaround
autoparam_5-ide_workaround
  Workarounds needed.


Comments, improvements?


	Domen


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [patch 1/5] autoparam: includes
  2005-07-07 11:25 [patch 0/5] autoparam v0.2: generating parameter descriptions on compile domen
@ 2005-07-07 11:25 ` domen
  2005-07-07 11:25 ` [patch 2/5] autoparam: makefile domen
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: domen @ 2005-07-07 11:25 UTC (permalink / raw)
  To: linux-kernel; +Cc: damm, domen

[-- Attachment #1: autoparam_1-includes --]
[-- Type: text/plain, Size: 5658 bytes --]

From: Magnus Damm <damm@opensource.se>


The code of autoparam - modified include files. Stores parameter name, type
and description in a section called __param_strings.

Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Domen Puncer <domen@coderock.org>

 include/linux/init.h        |   24 ++++++++++++++++++------
 include/linux/module.h      |    8 ++++++++
 include/linux/moduleparam.h |   15 ++++++++++++---
 3 files changed, 38 insertions(+), 9 deletions(-)

Index: a/include/linux/init.h
===================================================================
--- a.orig/include/linux/init.h
+++ a/include/linux/init.h
@@ -119,19 +119,30 @@ struct obs_kernel_param {
  * Force the alignment so the compiler doesn't space elements of the
  * obs_kernel_param "array" too far apart in .init.setup.
  */
-#define __setup_param(str, unique_id, fn, early)			\
+#define __setup_param(str, unique_id, fn, early, mark)		\
 	static char __setup_str_##unique_id[] __initdata = str;	\
 	static struct obs_kernel_param __setup_##unique_id	\
 		__attribute_used__				\
 		__attribute__((__section__(".init.setup")))	\
 		__attribute__((aligned((sizeof(long)))))	\
-		= { __setup_str_##unique_id, fn, early }
+		= { __setup_str_##unique_id, fn, early };	\
+		static const char __setup_doc_##unique_id[]	\
+		__attribute_used__				\
+		__attribute__((section("__param_strings")))	\
+		= mark str
 
 #define __setup_null_param(str, unique_id)			\
-	__setup_param(str, unique_id, NULL, 0)
+	__setup_param(str, unique_id, NULL, 0, "o:")
 
 #define __setup(str, fn)					\
-	__setup_param(str, fn, fn, 0)
+	__setup_param(str, fn, fn, 0, "s:")
+
+#define __setup_desc(str, fn, desc)				\
+	__setup(str, fn);					\
+	static const char __param_doc_desc_##_parm[]		\
+	__attribute_used__					\
+	__attribute__((section("__param_strings")))		\
+	= "d:" str ":" desc
 
 #define __obsolete_setup(str)					\
 	__setup_null_param(str, __LINE__)
@@ -139,7 +150,7 @@ struct obs_kernel_param {
 /* NOTE: fn is as per module_param, not __setup!  Emits warning if fn
  * returns non-zero. */
 #define early_param(str, fn)					\
-	__setup_param(str, fn, fn, 1)
+	__setup_param(str, fn, fn, 1, "e:")
 
 /* Relies on saved_command_line being set */
 void __init parse_early_param(void);
@@ -198,9 +209,10 @@ void __init parse_early_param(void);
 	{ return exitfn; }					\
 	void cleanup_module(void) __attribute__((alias(#exitfn)));
 
-#define __setup_param(str, unique_id, fn)	/* nothing */
+#define __setup_param(str, unique_id, fn, early, mark)	/* nothing */
 #define __setup_null_param(str, unique_id) 	/* nothing */
 #define __setup(str, func) 			/* nothing */
+#define __setup_desc(str, fn, desc)		/* nothing */
 #define __obsolete_setup(str) 			/* nothing */
 #endif
 
Index: a/include/linux/module.h
===================================================================
--- a.orig/include/linux/module.h
+++ a/include/linux/module.h
@@ -131,10 +131,18 @@ extern struct module __this_module;
 /* What your module does. */
 #define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)
 
+#ifdef MODULE
 /* One for each parameter, describing how to use it.  Some files do
    multiple of these per line, so can't just use MODULE_INFO. */
 #define MODULE_PARM_DESC(_parm, desc) \
 	__MODULE_INFO(parm, _parm, #_parm ":" desc)
+#else
+#define MODULE_PARM_DESC(_parm, desc)				\
+	static const char __param_doc_desc_##_parm[]		\
+	__attribute_used__					\
+	__attribute__((section("__param_strings")))		\
+	= "d:" __stringify(KBUILD_MODNAME) "." #_parm ":" desc
+#endif
 
 #define MODULE_DEVICE_TABLE(type,name)		\
   MODULE_GENERIC_TABLE(type##_device,name)
Index: a/include/linux/moduleparam.h
===================================================================
--- a.orig/include/linux/moduleparam.h
+++ a/include/linux/moduleparam.h
@@ -69,6 +69,12 @@ struct kparam_array
     __attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) \
 	= { __param_str_##name, perm, set, get, arg }
 
+#define module_param_doc(prefix, name, type)				\
+	static const char __param_doc_##name[]				\
+	__attribute_used__						\
+	__attribute__((section("__param_strings")))			\
+	= "m:" prefix #name ":" #type
+
 #define module_param_call(name, set, get, arg, perm)			      \
 	__module_param_call(MODULE_PARAM_PREFIX, name, set, get, arg, perm)
 
@@ -78,7 +84,8 @@ struct kparam_array
 #define module_param_named(name, value, type, perm)			   \
 	param_check_##type(name, &(value));				   \
 	module_param_call(name, param_set_##type, param_get_##type, &value, perm); \
-	__MODULE_PARM_TYPE(name, #type)
+	__MODULE_PARM_TYPE(name, #type);				   \
+	module_param_doc(MODULE_PARAM_PREFIX, name, type)
 
 #define module_param(name, type, perm)				\
 	module_param_named(name, name, type, perm)
@@ -89,7 +96,8 @@ struct kparam_array
 		= { len, string };					\
 	module_param_call(name, param_set_copystring, param_get_string,	\
 		   &__param_string_##name, perm);			\
-	__MODULE_PARM_TYPE(name, "string")
+	__MODULE_PARM_TYPE(name, "string");				\
+	module_param_doc(MODULE_PARAM_PREFIX, name, type)
 
 /* Called on module insert or kernel boot */
 extern int parse_args(const char *name,
@@ -151,7 +159,8 @@ extern int param_get_invbool(char *buffe
 	    sizeof(array[0]), array };					\
 	module_param_call(name, param_array_set, param_array_get, 	\
 			  &__param_arr_##name, perm);			\
-	__MODULE_PARM_TYPE(name, "array of " #type)
+	__MODULE_PARM_TYPE(name, "array of " #type);			\
+	module_param_doc(MODULE_PARAM_PREFIX, name, type)
 
 #define module_param_array(name, type, nump, perm)		\
 	module_param_array_named(name, name, type, nump, perm)

--

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [patch 2/5] autoparam: makefile
  2005-07-07 11:25 [patch 0/5] autoparam v0.2: generating parameter descriptions on compile domen
  2005-07-07 11:25 ` [patch 1/5] autoparam: includes domen
@ 2005-07-07 11:25 ` domen
  2005-07-07 11:25 ` [patch 3/5] autoparam: extract script domen
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: domen @ 2005-07-07 11:25 UTC (permalink / raw)
  To: linux-kernel; +Cc: damm, domen

[-- Attachment #1: autoparam_2-makefile --]
[-- Type: text/plain, Size: 2409 bytes --]

From: Domen Puncer <domen@coderock.org>


Build .kernel-parameters.o when vmlinux is (re)built.
Add target "kernelparams" which generates descriptions of parameters
in Documentation/kernel-parameters-gen.txt

Signed-off-by: Domen Puncer <domen@coderock.org>

 Makefile |   24 +++++++++++++++++++++++-
 1 files changed, 23 insertions(+), 1 deletion(-)

Index: a/Makefile
===================================================================
--- a.orig/Makefile
+++ a/Makefile
@@ -650,6 +650,7 @@ define rule_vmlinux__
 		/bin/false;                             \
 	fi;
 	$(verify_kallsyms)
+	$(extract_kernel_parameters)
 endef
 
 
@@ -916,6 +917,15 @@ modules modules_install: FORCE
 
 endif # CONFIG_MODULES
 
+# Extract kernel parameters
+# ---------------------------------------------------------------------------
+
+define extract_kernel_parameters
+	$(Q)$(OBJCOPY) -j __param_strings $(objtree)/vmlinux -O binary \
+		$(objtree)/.kernel-parameters.o
+	$(Q)$(OBJCOPY) -R __param_strings $(objtree)/vmlinux $(objtree)/vmlinux
+endef
+
 # Generate asm-offsets.h 
 # ---------------------------------------------------------------------------
 
@@ -946,7 +956,8 @@ endef
 # Directories & files removed with 'make clean'
 CLEAN_DIRS  += $(MODVERDIR)
 CLEAN_FILES +=	vmlinux System.map \
-                .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map
+                .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map \
+		.kernel-parameters.o
 
 # Directories & files removed with 'make mrproper'
 MRPROPER_DIRS  += include/config include2
@@ -1048,6 +1059,8 @@ help:
 	@echo  ''
 	@echo  'Documentation targets:'
 	@$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp
+	@echo  '  kernelparams    - Generates list of boot parameters in'
+	@echo  '                    Documentation/kernel-parameters-gen.txt'
 	@echo  ''
 	@echo  'Architecture specific targets ($(ARCH)):'
 	@$(if $(archhelp),$(archhelp),\
@@ -1142,6 +1155,15 @@ help:
 	@echo  ''
 endif # KBUILD_EXTMOD
 
+
+kernelparams:
+	$(Q)if [ ! -f $(objtree)/.kernel-parameters.o ]; then \
+		echo "You have to build a kernel (vmlinux) first."; \
+		exit 1; \
+	fi
+	$(O)$(PERL) -w $(srctree)/scripts/kernelparams.pl $(objtree)/.kernel-parameters.o \
+		> $(srctree)/Documentation/kernel-parameters-gen.txt
+
 # Generate tags for editors
 # ---------------------------------------------------------------------------
 

--

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [patch 3/5] autoparam: extract script
  2005-07-07 11:25 [patch 0/5] autoparam v0.2: generating parameter descriptions on compile domen
  2005-07-07 11:25 ` [patch 1/5] autoparam: includes domen
  2005-07-07 11:25 ` [patch 2/5] autoparam: makefile domen
@ 2005-07-07 11:25 ` domen
  2005-07-07 11:25 ` [patch 4/5] autoparam: af_unix workaround domen
  2005-07-07 11:25 ` [patch 5/5] autoparam: ide workarounds domen
  4 siblings, 0 replies; 7+ messages in thread
From: domen @ 2005-07-07 11:25 UTC (permalink / raw)
  To: linux-kernel; +Cc: damm, domen

[-- Attachment #1: autoparam_3-extract_script --]
[-- Type: text/plain, Size: 1617 bytes --]

From: Domen Puncer <domen@coderock.org>


A simple perl script which extracts parameters, types and
descriptions from binary file.

Signed-off-by: Domen Puncer <domen@coderock.org>

 scripts/kernelparams.pl |   49 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 49 insertions(+)

Index: a/scripts/kernelparams.pl
===================================================================
--- /dev/null
+++ a/scripts/kernelparams.pl
@@ -0,0 +1,49 @@
+#!/usr/bin/perl
+use strict;
+my ($p, @params, %param_t, %param_d);
+
+while (<>) {
+	my @params = split '\0', $_;
+	foreach $p (@params) {
+		next if (!$p);
+		# module_param, "m:module.param:type"
+		if ($p =~ /^(m:.+?):(.*)/) {
+			$param_t{$1} = " ($2)";
+		}
+		# __setup, "s:"; obsolete_setup; early_param
+		elsif ($p =~ /^([soe]:.+)/) {
+			$param_t{$1} = '';
+		}
+		# description, "d:module.param:description"
+		elsif ($p =~ /^d:(.+?):(.+)/) {
+			$param_d{$1} = $2;
+		}
+		# i.e. ide uses __setup("", blah)
+		elsif ($p !~ /^[soe]:$/) {
+			print STDERR "Parameter error: \"$p\"\n";
+		}
+	}
+}
+
+# print the parameters
+foreach $p (sort(keys(%param_t))) {
+	print "$p$param_t{$p}\n";
+	my $pn = substr($p, 2);
+	if (!$param_d{$pn}) {
+		# only warn for module parameters
+		if ($p =~ "^m:") {
+			print "  No description\n";
+		}
+	} else {
+		print "  $param_d{$pn}\n";
+	}
+	print "\n";
+}
+
+# descriptions alone; typos, deprecated
+foreach $p (sort(keys(%param_d))) {
+	if (!exists $param_t{"m:".$p} && !exists $param_t{"s:".$p} &&
+			!exists $param_t{"o:".$p}) {
+		print STDERR "$p only has description (MODULE_PARM?)\n";
+	}
+}

--

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [patch 4/5] autoparam: af_unix workaround
  2005-07-07 11:25 [patch 0/5] autoparam v0.2: generating parameter descriptions on compile domen
                   ` (2 preceding siblings ...)
  2005-07-07 11:25 ` [patch 3/5] autoparam: extract script domen
@ 2005-07-07 11:25 ` domen
  2005-07-07 17:13   ` Alexey Dobriyan
  2005-07-07 11:25 ` [patch 5/5] autoparam: ide workarounds domen
  4 siblings, 1 reply; 7+ messages in thread
From: domen @ 2005-07-07 11:25 UTC (permalink / raw)
  To: linux-kernel; +Cc: damm, domen

[-- Attachment #1: autoparam_4-af_unix_workaround --]
[-- Type: text/plain, Size: 608 bytes --]

From: Magnus Damm <damm@opensource.se>


This is a quick fix that removes the "KBUILD_MODNAME -> unix -> 1" conflict.

Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Domen Puncer <domen@coderock.org>

 net/unix/af_unix.c |    2 ++
 1 files changed, 2 insertions(+)

Index: a/net/unix/af_unix.c
===================================================================
--- a.orig/net/unix/af_unix.c
+++ a/net/unix/af_unix.c
@@ -2068,6 +2068,8 @@ static void __exit af_unix_exit(void)
 	proto_unregister(&unix_proto);
 }
 
+#undef unix
+
 module_init(af_unix_init);
 module_exit(af_unix_exit);
 

--

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [patch 5/5] autoparam: ide workarounds
  2005-07-07 11:25 [patch 0/5] autoparam v0.2: generating parameter descriptions on compile domen
                   ` (3 preceding siblings ...)
  2005-07-07 11:25 ` [patch 4/5] autoparam: af_unix workaround domen
@ 2005-07-07 11:25 ` domen
  4 siblings, 0 replies; 7+ messages in thread
From: domen @ 2005-07-07 11:25 UTC (permalink / raw)
  To: linux-kernel; +Cc: damm, domen

[-- Attachment #1: autoparam_5-ide_workaround --]
[-- Type: text/plain, Size: 1949 bytes --]

From: Magnus Damm <damm@opensource.se>


This patch contains quick fixes that prevents KBUILD_MODNAME conflicts.

Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Domen Puncer <domen@coderock.org>

 drivers/ide/ide-disk.c   |    2 ++
 drivers/ide/ide-floppy.c |    2 ++
 drivers/ide/ide-tape.c   |    2 ++
 drivers/scsi/ide-scsi.c  |    2 ++
 4 files changed, 8 insertions(+)

Index: a/drivers/ide/ide-disk.c
===================================================================
--- a.orig/drivers/ide/ide-disk.c
+++ a/drivers/ide/ide-disk.c
@@ -1273,6 +1273,8 @@ static int idedisk_init (void)
 	return driver_register(&idedisk_driver.gen_driver);
 }
 
+#undef ide_disk
+
 module_init(idedisk_init);
 module_exit(idedisk_exit);
 MODULE_LICENSE("GPL");
Index: a/drivers/ide/ide-floppy.c
===================================================================
--- a.orig/drivers/ide/ide-floppy.c
+++ a/drivers/ide/ide-floppy.c
@@ -2204,6 +2204,8 @@ static int idefloppy_init (void)
 	return driver_register(&idefloppy_driver.gen_driver);
 }
 
+#undef ide_floppy
+
 module_init(idefloppy_init);
 module_exit(idefloppy_exit);
 MODULE_LICENSE("GPL");
Index: a/drivers/ide/ide-tape.c
===================================================================
--- a.orig/drivers/ide/ide-tape.c
+++ a/drivers/ide/ide-tape.c
@@ -4919,6 +4919,8 @@ static int idetape_init (void)
 	return driver_register(&idetape_driver.gen_driver);
 }
 
+#undef ide_tape
+
 module_init(idetape_init);
 module_exit(idetape_exit);
 MODULE_ALIAS_CHARDEV_MAJOR(IDETAPE_MAJOR);
Index: a/drivers/scsi/ide-scsi.c
===================================================================
--- a.orig/drivers/scsi/ide-scsi.c
+++ a/drivers/scsi/ide-scsi.c
@@ -1186,6 +1186,8 @@ static void __exit exit_idescsi_module(v
 	driver_unregister(&idescsi_driver.gen_driver);
 }
 
+#undef ide_scsi
+
 module_init(init_idescsi_module);
 module_exit(exit_idescsi_module);
 MODULE_LICENSE("GPL");

--

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [patch 4/5] autoparam: af_unix workaround
  2005-07-07 11:25 ` [patch 4/5] autoparam: af_unix workaround domen
@ 2005-07-07 17:13   ` Alexey Dobriyan
  0 siblings, 0 replies; 7+ messages in thread
From: Alexey Dobriyan @ 2005-07-07 17:13 UTC (permalink / raw)
  To: domen; +Cc: linux-kernel, damm

On Thursday 07 July 2005 15:25, domen@coderock.org wrote:
> This is a quick fix that removes the "KBUILD_MODNAME -> unix -> 1" conflict.

> --- a.orig/net/unix/af_unix.c
> +++ a/net/unix/af_unix.c

> +#undef unix

This deserves a comment. Ditto for ide workarounds.

>  module_init(af_unix_init);
>  module_exit(af_unix_exit);

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2005-07-07 17:09 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-07-07 11:25 [patch 0/5] autoparam v0.2: generating parameter descriptions on compile domen
2005-07-07 11:25 ` [patch 1/5] autoparam: includes domen
2005-07-07 11:25 ` [patch 2/5] autoparam: makefile domen
2005-07-07 11:25 ` [patch 3/5] autoparam: extract script domen
2005-07-07 11:25 ` [patch 4/5] autoparam: af_unix workaround domen
2005-07-07 17:13   ` Alexey Dobriyan
2005-07-07 11:25 ` [patch 5/5] autoparam: ide workarounds domen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox