Kernel configuration in kernel, kernel 2.5.53
PATCH 1/1 Kernel configuration in kernel, kernel 2.5.53
Hello,
Here is the 2.5.53 version of the patch I just sent to the list for 2.4.20 Main differences are in the Makefile and Kconfig. the C source code hasn't changed.
This has been tested on a standard 2.5.53 without problem, just one important point : you need to activate /proc support.
This constraint is not present in the Kconfig entry, as I don't know how to do. Any idea welcome...
Regards,
Paul Rolland, [email protected]
drivers/char/config.c 2002-12-29 17:26:46.000000000 +0100 renamed from drivers/char/config.c 1970-01-01 01:00:00.000000000 +0100 +148 -0
@@ -0,0 +1,148 @@ +/* + * Linux Configuration Driver + * (c) 2002 Paul Rolland + * + * This driver is intended to give access to the .config file that was + * used to compile the kernel. + * It does include a gzip'd copy of the file, which can be access thru + * /proc/config/config.gz + * + */ + +#define CONFIG_VERSION "1.0" + +#include <linux/module.h> +#include <linux/config.h> +#include <linux/sched.h> +#include <linux/smp_lock.h> + +#include <linux/types.h> +#include <linux/errno.h> +#include <linux/miscdevice.h> +#include <linux/slab.h> +#include <linux/ioport.h> +#include <linux/fcntl.h> +#include <linux/mc146818rtc.h> +#include <linux/init.h> +#include <linux/proc_fs.h> +#include <linux/spinlock.h> + +#include <asm/io.h> +#include <asm/uaccess.h> +#include <asm/system.h> + +#include "config.h" + +static int config_read_proc(char * page, char ** start, off_t off, + int count, int *eof, void *data); + + +#ifndef CONFIG_PROC_FS +#warn Attention +static int config_read_proc( char *buffer, char **start, off_t offset, + int size, int *eof, void *data) { return 0; } +#else + +/* This macro frees the machine specific function from bounds checking and + * this like that... */ +#define PRINT_PROC(fmt,args...) \ + do { \ + *len += sprintf( buffer+*len, fmt, ##args ); \ + if (*begin + *len > offset + size) \ + return( 0 ); \ + if (*begin + *len < offset) { \ + *begin += *len; \ + *len = 0; \ + } \ + } while(0) + + +static int config_version_infos(char *buffer, int *len, off_t *begin, + off_t offset, int size) +{ + PRINT_PROC("Linux Kernel Configuration driver version %s\n", CONFIG_VERSION); + PRINT_PROC("(c) P. Rolland - Dec 2002\n"); + + return(1); +} + +static int config_gz_infos(char *buffer, int *len, off_t *begin, off_t offset, + int size) +{ + int i; + + for (i=0; i<CONFIG_SIZE; i++) { + PRINT_PROC("%c", config_gz[i]); + } + + return(1); +} + +static int config_read_proc( char *buffer, char **start, off_t offset, + int size, int *eof, void *data ) +{ + int len = 0; + off_t begin = 0; + + *eof = config_version_infos(buffer, &len, &begin, offset, size); + + if (offset >= begin + len) + return(0); + *start = buffer + (offset - begin); + return( size < begin + len - offset ? size : begin + len - offset ); +} + +static int config_gz_read_proc( char *buffer, char **start, off_t offset, + int size, int *eof, void *data ) +{ + int len = 0; + off_t begin = 0; + + *eof = config_gz_infos(buffer, &len, &begin, offset, size); + + if (offset >= begin + len) + return(0); + *start = buffer + (offset - begin); + return( size < begin + len - offset ? size : begin + len - offset ); +} + +static int __init config_init(void) +{ + struct proc_dir_entry * entry; + entry = create_proc_entry("config", S_IRUGO|S_IXUGO|S_IFDIR, NULL); + if (entry == NULL) { + printk(KERN_ERR "config: can't create /proc/config\n"); + return(-ENOMEM); + } + + if (!create_proc_read_entry("config/version",0,0,config_read_proc,NULL)) { + printk(KERN_ERR "config: can't create /proc/config/version\n"); + return(-ENOMEM); + } + if (!create_proc_read_entry("config/config.gz",0,0,config_gz_read_proc,NULL)) { + printk(KERN_ERR "config: can't create /proc/config/config.gz\n"); + return(-ENOMEM); + } + + printk(KERN_INFO "Linux Kernel Configuration driver v" CONFIG_VERSION " (c) Paul Rolland\n"); + + return( 0 ); +} + +static void __exit config_cleanup_module (void) +{ + remove_proc_entry( "config/version", 0 ); + remove_proc_entry( "config/config.gz", 0 ); + remove_proc_entry( "config", 0 ); +} + +module_init(config_init); +module_exit(config_cleanup_module); + +#endif /* CONFIG_PROC_FS */ + +MODULE_AUTHOR("Paul Rolland"); +MODULE_DESCRIPTION("Driver for accessing kernel configuration"); +MODULE_LICENSE("GPL"); + +EXPORT_NO_SYMBOLS;
drivers/char/dotHmaker.c 2002-12-29 17:43:37.000000000 +0100 renamed from drivers/char/dotHmaker.c 1970-01-01 01:00:00.000000000 +0100 +41 -0
41 lines not on this page · raw message
drivers/char/Kconfig 2002-12-29 17:22:12.000000000 +0100 renamed from drivers/char/Kconfig 2002-12-24 06:19:26.000000000 +0100 +7 -0
@@ -4,6 +4,13 @@ menu "Character devices" +config CONFIG + bool "Linux Kernel Configuration Driver" + ---help--- + If you say Y here, and if you have /proc support enabled, you'll find + a /proc/config directory that will contain the .config used to generate + the running kernel. + config VT bool "Virtual terminal" ---help---
drivers/char/Makefile 2002-12-29 17:43:53.000000000 +0100 renamed from drivers/char/Makefile 2002-12-24 06:21:17.000000000 +0100 +13 -1
@@ -16,6 +16,7 @@ ite_gpio.o keyboard.o misc.o nvram.o random.o rtc.o \ selection.o sonypi.o sysrq.o tty_io.o tty_ioctl.o +obj-$(CONFIG_CONFIG) += config.o obj-$(CONFIG_VT) += vt_ioctl.o vc_screen.o consolemap.o consolemap_deftbl.o selection.o keyboard.o obj-$(CONFIG_HW_CONSOLE) += vt.o defkeymap.o obj-$(CONFIG_MAGIC_SYSRQ) += sysrq.o
@@ -85,7 +86,7 @@ # Files generated that shall be removed upon make clean -clean-files := consolemap_deftbl.c defkeymap.c qtronixmap.c +clean-files := consolemap_deftbl.c defkeymap.c qtronixmap.c config.h $(obj)/consolemap_deftbl.c: $(src)/$(FONTMAPFILE) $(call do_cmd,CONMK $@,$(objtree)/scripts/conmakehash $< > $@)
@@ -107,3 +108,14 @@ rm [email protected] endif + +$(obj)/config.o: $(obj)/config.h + +$(obj)/config.h: $(obj)/config.txt.gz + cc -o $(obj)/dotHmaker $(obj)/dotHmaker.c + $(obj)/./dotHmaker < $(obj)/config.txt.gz > $(obj)/config.h + +$(obj)/config.txt.gz:: + cp .config $(obj)/config.txt + gzip -f $(obj)/config.txt +
You could write a simple script to install a kernel image and install the .config under /boot as well. Guess that solves your problem better.
Regards,
Quoted 13 lines · Paul Rolland
Hello,
Here is the 2.5.53 version of the patch I just sent to the list for 2.4.20 Main differences are in the
MakefileandKconfig. the C source code hasn't changed.This has been tested on a standard 2.5.53 without problem, just one important point : you need to activate /proc support.
This constraint is not present in the
Kconfigentry, as I don't know how to do. Any idea welcome...Regards,
Paul Rolland, [email protected]
Quoted 5 lines
You could write a simple script to install a kernel image and install the .config under /boot as well. Guess that solves your problem better.
Yes, but this still makes the configuration something external to the kernel, thus it is still possible to have a mismatch between the kernel and this file, and this is what I'm trying to avoid :-)
Regards,
Paul
Quoted 8 lines · Paul Rolland
Quoted 5 lines
You could write a simple script to install a kernel image and install the .config under /boot as well. Guess that solves your problem better.
Yes, but this still makes the configuration something external to the kernel, thus it is still possible to have a mismatch between the kernel and this file, and this is what I'm trying to avoid :-)
Google for Randy Dunlaps ikconfig patches.
They solve the problem by appending the .config to the kernel image, thus not bloating any kernel space memory with /proc junk.
Dave
Signature · 2 lines
| Dave Jones. http://www.codemonkey.org.uk | SuSE Labs
Quoted 4 lines · Paul Rolland
Hello,
Here is the 2.5.53 version of the patch I just sent to the list for 2.4.20 Main differences are in the
MakefileandKconfig.
Some comments to the Makefile + a little more.
Sam
drivers/char/config.c 2002-12-29 17:26:46.000000000 +0100 line 148
Quoted 5 lines
drivers/char/config.c 2002-12-29 17:26:46.000000000 +0100 renamed from drivers/char/config.c 1970-01-01 01:00:00.000000000 +0100 +5
-0+MODULE_AUTHOR("Paul Rolland"); +MODULE_DESCRIPTION("Driver for accessing kernel configuration"); +MODULE_LICENSE("GPL"); + +EXPORT_NO_SYMBOLS;
EXPORT_NO_SYMBOLS in a noop in 2.5. Please remove
Review
Quoted 2 lines
(quoted diff) +2
-0+ printf("\n"); + printf("#define CONFIG_SIZE %d\n\n", size);
The CONFIG_ prefix indicates a value from kconfig, which CONFIG_SIZE is not.
drivers/char/Makefile 2002-12-29 17:43:53.000000000 +0100 line 121
Quoted 9 lines
+++ linux-2.5.53/drivers/char/Makefile 2002-12-29 17:43:53.000000000 +0100 +$(obj)/config.h: $(obj)/config.txt.gz
drivers/char/Makefile 2002-12-29 17:43:53.000000000 +0100 renamed from drivers/char/Makefile 2002-12-24 06:21:17.000000000 +0100 +7
-0+ cc -o $(obj)/dotHmaker $(obj)/dotHmaker.c + $(obj)/./dotHmaker < $(obj)/config.txt.gz > $(obj)/config.h + +$(obj)/config.txt.gz:: + cp .config $(obj)/config.txt + gzip -f $(obj)/config.txt +
Replace the above with something like this:
host-progs := dotHmakerEXTRA_TARGETS := config.txt.gz
$(obj)/config.h: $(obj)/config.txt.gz $(obj)/dotHmaker
$(obj)/dotHmaker < $< > $@
$(obj)/config.txt.gz: .config
$(call if_changed,gzip)
That is more in line with general kbuild practice. Please note that gzip will be called with -9 in the above case. I do not expect it to have any influence.