I am including a patch for 2.5.50 that allows a user to embed kernel
configuration in the kernel and retrieve it later either from a running
kernel or from the kernel image file. This is an enhancement to Randy's
patch that was discussed on LKML before and is part of -ac series
kernels.
This patch provides three choices for embedding kernel configuration:
1. Include configuration in running kernel image. This adds to the
footprint of the running kernel but allows configuration to be retrieved
using "cat /proc/ikconfig/config".
2. Include configuration in kernel image file but not in the running
kernel. This adds to the kernel image file size but not the footprint of
running kernel. Configuration can be extracted from kernel image file
using scripts/extract-ikconfig. This script is in principle the same as
what Randy had written originally. I have made it little more robust and
structured it to accomodate more than just x86 architecture.
3. Not include kernel configuration in the running kernel or kernel
image file.
With these three choices, users can make the appropriate tradeoff. This
feature is especially useful for support folks who need to know the
kernel configuration for a customer's kernel with fairly high degree of
confidence that they are getting the right configuration. This feature
is turned off in the default configuration.
Linus, please apply.
--
Khalid
====================================================================
Khalid Aziz Linux and Open Source Lab
(970)898-9214 Hewlett-Packard
[email protected] Fort Collins, CO
---------CUT HERE-------------CUT HERE--------------CUT HERE-----------------
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/alpha/defconfig linux-2.5.50-ikconfig/arch/alpha/defconfig
--- linux-2.5.50/arch/alpha/defconfig Wed Nov 27 15:36:00 2002
+++ linux-2.5.50-ikconfig/arch/alpha/defconfig Mon Dec 2 12:50:12 2002
@@ -19,6 +19,8 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
#
# Loadable module support
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/arm/defconfig linux-2.5.50-ikconfig/arch/arm/defconfig
--- linux-2.5.50/arch/arm/defconfig Wed Nov 27 15:35:54 2002
+++ linux-2.5.50-ikconfig/arch/arm/defconfig Mon Dec 2 12:50:12 2002
@@ -80,6 +80,8 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
CONFIG_NWFPE=y
CONFIG_KCORE_ELF=y
# CONFIG_KCORE_AOUT is not set
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/cris/defconfig linux-2.5.50-ikconfig/arch/cris/defconfig
--- linux-2.5.50/arch/cris/defconfig Wed Nov 27 15:35:55 2002
+++ linux-2.5.50-ikconfig/arch/cris/defconfig Mon Dec 2 12:50:12 2002
@@ -17,6 +17,8 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
# CONFIG_SYSCTL is not set
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
CONFIG_BINFMT_ELF=y
# CONFIG_ETRAX_KGDB is not set
# CONFIG_ETRAX_WATCHDOG is not set
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/i386/defconfig linux-2.5.50-ikconfig/arch/i386/defconfig
--- linux-2.5.50/arch/i386/defconfig Wed Nov 27 15:36:15 2002
+++ linux-2.5.50-ikconfig/arch/i386/defconfig Mon Dec 2 12:50:12 2002
@@ -19,6 +19,8 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
#
# Loadable module support
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/ia64/defconfig linux-2.5.50-ikconfig/arch/ia64/defconfig
--- linux-2.5.50/arch/ia64/defconfig Wed Nov 27 15:35:49 2002
+++ linux-2.5.50-ikconfig/arch/ia64/defconfig Mon Dec 2 12:50:12 2002
@@ -14,6 +14,8 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
#
# Loadable module support
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/m68k/defconfig linux-2.5.50-ikconfig/arch/m68k/defconfig
--- linux-2.5.50/arch/m68k/defconfig Wed Nov 27 15:35:48 2002
+++ linux-2.5.50-ikconfig/arch/m68k/defconfig Mon Dec 2 12:50:12 2002
@@ -42,6 +42,8 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
CONFIG_KCORE_ELF=y
# CONFIG_KCORE_AOUT is not set
CONFIG_BINFMT_AOUT=y
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/mips/defconfig linux-2.5.50-ikconfig/arch/mips/defconfig
--- linux-2.5.50/arch/mips/defconfig Wed Nov 27 15:35:50 2002
+++ linux-2.5.50-ikconfig/arch/mips/defconfig Mon Dec 2 12:50:12 2002
@@ -93,6 +93,8 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
#
# Memory Technology Devices (MTD)
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/mips64/defconfig linux-2.5.50-ikconfig/arch/mips64/defconfig
--- linux-2.5.50/arch/mips64/defconfig Wed Nov 27 15:36:16 2002
+++ linux-2.5.50-ikconfig/arch/mips64/defconfig Mon Dec 2 12:50:12 2002
@@ -56,6 +56,9 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
+
CONFIG_BINFMT_ELF=y
CONFIG_MIPS32_COMPAT=y
CONFIG_BINFMT_ELF32=y
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/ppc/defconfig linux-2.5.50-ikconfig/arch/ppc/defconfig
--- linux-2.5.50/arch/ppc/defconfig Wed Nov 27 15:36:17 2002
+++ linux-2.5.50-ikconfig/arch/ppc/defconfig Mon Dec 2 12:50:12 2002
@@ -64,6 +64,8 @@
CONFIG_PCI=y
CONFIG_NET=y
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_KCORE_ELF=y
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/ppc64/defconfig linux-2.5.50-ikconfig/arch/ppc64/defconfig
--- linux-2.5.50/arch/ppc64/defconfig Wed Nov 27 15:35:53 2002
+++ linux-2.5.50-ikconfig/arch/ppc64/defconfig Mon Dec 2 12:50:12 2002
@@ -20,6 +20,8 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
#
# Loadable module support
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/s390/defconfig linux-2.5.50-ikconfig/arch/s390/defconfig
--- linux-2.5.50/arch/s390/defconfig Wed Nov 27 15:36:18 2002
+++ linux-2.5.50-ikconfig/arch/s390/defconfig Mon Dec 2 12:50:12 2002
@@ -20,6 +20,8 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
#
# Loadable module support
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/s390x/defconfig linux-2.5.50-ikconfig/arch/s390x/defconfig
--- linux-2.5.50/arch/s390x/defconfig Wed Nov 27 15:35:46 2002
+++ linux-2.5.50-ikconfig/arch/s390x/defconfig Mon Dec 2 12:50:12 2002
@@ -20,6 +20,8 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
#
# Loadable module support
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/sh/defconfig linux-2.5.50-ikconfig/arch/sh/defconfig
--- linux-2.5.50/arch/sh/defconfig Wed Nov 27 15:36:01 2002
+++ linux-2.5.50-ikconfig/arch/sh/defconfig Mon Dec 2 12:50:12 2002
@@ -45,6 +45,8 @@
# CONFIG_SYSVIPC is not set
# CONFIG_BSD_PROCESS_ACCT is not set
# CONFIG_SYSCTL is not set
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
CONFIG_KCORE_ELF=y
# CONFIG_KCORE_AOUT is not set
CONFIG_BINFMT_ELF=y
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/sparc/defconfig linux-2.5.50-ikconfig/arch/sparc/defconfig
--- linux-2.5.50/arch/sparc/defconfig Wed Nov 27 15:36:16 2002
+++ linux-2.5.50-ikconfig/arch/sparc/defconfig Mon Dec 2 12:50:12 2002
@@ -17,6 +17,8 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
#
# Loadable module support
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/sparc64/defconfig linux-2.5.50-ikconfig/arch/sparc64/defconfig
--- linux-2.5.50/arch/sparc64/defconfig Wed Nov 27 15:35:56 2002
+++ linux-2.5.50-ikconfig/arch/sparc64/defconfig Mon Dec 2 12:50:12 2002
@@ -14,6 +14,8 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
#
# Loadable module support
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/um/defconfig linux-2.5.50-ikconfig/arch/um/defconfig
--- linux-2.5.50/arch/um/defconfig Wed Nov 27 15:36:15 2002
+++ linux-2.5.50-ikconfig/arch/um/defconfig Mon Dec 2 12:50:12 2002
@@ -20,6 +20,8 @@
CONFIG_SYSVIPC=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
CONFIG_BINFMT_AOUT=y
CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_MISC=y
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/arch/x86_64/defconfig linux-2.5.50-ikconfig/arch/x86_64/defconfig
--- linux-2.5.50/arch/x86_64/defconfig Wed Nov 27 15:36:15 2002
+++ linux-2.5.50-ikconfig/arch/x86_64/defconfig Mon Dec 2 12:50:12 2002
@@ -24,6 +24,8 @@
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+# CONFIG_IKCONFIG is not set
+# CONFIG_IKCONFIG_PROC is not set
#
# Loadable module support
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/init/Kconfig linux-2.5.50-ikconfig/init/Kconfig
--- linux-2.5.50/init/Kconfig Wed Nov 27 15:36:17 2002
+++ linux-2.5.50-ikconfig/init/Kconfig Mon Dec 2 13:42:50 2002
@@ -98,6 +98,31 @@
building a kernel for install/rescue disks or your system is very
limited in memory.
+config IKCONFIG
+ bool "Kernel .config support"
+ ---help---
+ This option enables the complete Linux kernel ".config" file
+ contents, information on compiler used to build the kernel,
+ kernel running when this kernel was built and kernel version
+ from Makefile to be saved in kernel. It provides documentation
+ of which kernel options are used in a running kernel or in an
+ on-disk kernel. This information can be extracted from the kernel
+ image file with the script scripts/extract-ikconfig and used as
+ input to rebuild the current kernel or to build another kernel.
+ It can also be extracted from a running kernel by reading
+ /proc/ikconfig/config and /proc/ikconfig/built_with, if enabled.
+ /proc/ikconfig/config will list the configuration that was used
+ to build the kernel and /proc/ikconfig/built_with will list
+ information on the compiler and host machine that was used to
+ build the kernel.
+
+config IKCONFIG_PROC
+ bool "Enable access to .config through /proc/ikconfig"
+ depends on IKCONFIG
+ ---help---
+ This option enables access to kernel configuration file and build
+ information through /proc/ikconfig.
+
endmenu
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/kernel/Makefile linux-2.5.50-ikconfig/kernel/Makefile
--- linux-2.5.50/kernel/Makefile Wed Nov 27 15:35:51 2002
+++ linux-2.5.50-ikconfig/kernel/Makefile Mon Dec 2 12:50:12 2002
@@ -21,6 +21,11 @@
obj-$(CONFIG_CPU_FREQ) += cpufreq.o
obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o
+obj-$(CONFIG_IKCONFIG) += configs.o
+
+# files to be removed upon make clean
+clean-files := ikconfig.h
+
ifneq ($(CONFIG_IA64),y)
# According to Alan Modra <[email protected]>, the -fno-omit-frame-pointer is
@@ -32,3 +37,10 @@
endif
include $(TOPDIR)/Rules.make
+
+$(obj)/ikconfig.h: $(TOPDIR)/scripts/mkconfigs $(TOPDIR)/.config $(TOPDIR)/Makefile
+ $(CONFIG_SHELL) $(TOPDIR)/scripts/mkconfigs $(TOPDIR)/.config $(TOPDIR)/Makefile > $(obj)/ikconfig.h
+
+$(obj)/configs.o: $(obj)/ikconfig.h $(obj)/configs.c \
+ $(TOPDIR)/include/linux/version.h \
+ $(TOPDIR)/include/linux/compile.h
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/kernel/configs.c linux-2.5.50-ikconfig/kernel/configs.c
--- linux-2.5.50/kernel/configs.c Wed Dec 31 17:00:00 1969
+++ linux-2.5.50-ikconfig/kernel/configs.c Mon Dec 2 12:50:12 2002
@@ -0,0 +1,206 @@
+/*
+ * kernel/configs.c
+ *
+ * Copyright (C) 2002 Khalid Aziz <[email protected]>
+ * Copyright (C) 2002 Randy Dunlap <[email protected]>
+ * Copyright (C) 2002 Al Stone <[email protected]>
+ * Copyright (C) 2002 Hewlett-Packard Company
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * Echo the kernel .config file used to build the kernel
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/proc_fs.h>
+#include <linux/init.h>
+#include <linux/compile.h>
+#include <linux/version.h>
+#include <asm/uaccess.h>
+
+/**************************************************/
+/* globals and useful constants */
+
+static char *IKCONFIG_NAME = "ikconfig";
+static char *IKCONFIG_VERSION = "0.5";
+
+static int ikconfig_current_size = 0;
+
+static struct proc_dir_entry *ikconfig_dir, *current_config, *built_with;
+
+/**************************************************/
+/* the actual current config file */
+
+#include "ikconfig.h"
+
+static int
+ikconfig_permission_current(struct inode *inode, int op)
+{
+ /* anyone can read the device, no one can write to it */
+ if (op == MAY_READ)
+ return 0;
+ else
+ return -EACCES;
+}
+
+static ssize_t
+ikconfig_output_current(struct file *file, char *buf,
+ size_t len, loff_t * offset)
+{
+ int i, limit;
+ int cnt;
+
+ limit = (ikconfig_current_size > len) ? len : ikconfig_current_size;
+ for (i = file->f_pos, cnt = 0;
+ i < ikconfig_current_size && cnt < limit; i++, cnt++) {
+ put_user(ikconfig_config[i], buf + cnt);
+ }
+ file->f_pos = i;
+ return cnt;
+}
+
+static int
+ikconfig_open_current(struct inode *inode, struct file *file)
+{
+ if (file->f_mode & FMODE_READ) {
+ inode->i_size = ikconfig_current_size;
+ file->f_pos = 0;
+ }
+ MOD_INC_USE_COUNT;
+ return 0;
+}
+
+static int
+ikconfig_close_current(struct inode *inode, struct file *file)
+{
+ MOD_DEC_USE_COUNT;
+ return 0;
+}
+
+static struct file_operations ikconfig_file_ops = {
+ read:ikconfig_output_current,
+ write:NULL, /* file is not writable at all */
+ open:ikconfig_open_current,
+ release:ikconfig_close_current
+};
+
+static struct inode_operations ikconfig_inode_ops = {
+ permission:ikconfig_permission_current
+};
+
+/***************************************************/
+/* proc_read_built_with: let people read the info */
+/* we have on the tools used to build this kernel */
+
+static int
+proc_read_built_with(char *page, char **start,
+ off_t off, int count, int *eof, void *data)
+{
+ MOD_INC_USE_COUNT;
+
+ sprintf(page, "Kernel: %s\nCompiler: %s\nVersion_in_Makefile: %s\n",
+ ikconfig_built_with, LINUX_COMPILER, UTS_RELEASE);
+ *eof = 1;
+
+ MOD_DEC_USE_COUNT;
+ return strlen(page);
+}
+
+/***************************************************/
+/* ikconfig_init: start up everything we need to */
+
+int __init
+ikconfig_init(void)
+{
+ int result = 0;
+
+#ifdef CONFIG_IKCONFIG_PROC
+ printk(KERN_INFO "ikconfig %s with /proc/ikconfig\n",
+ IKCONFIG_VERSION);
+#else
+ printk(KERN_INFO "ikconfig %s without /proc/ikconfig\n",
+ IKCONFIG_VERSION);
+ return result;
+#endif
+
+ /* create the ikconfig directory */
+ ikconfig_dir = proc_mkdir(IKCONFIG_NAME, NULL);
+ if (ikconfig_dir == NULL) {
+ result = -ENOMEM;
+ goto leave;
+ }
+ ikconfig_dir->owner = THIS_MODULE;
+
+ /* create the current config file */
+ current_config = create_proc_entry("config", S_IFREG | S_IRUGO,
+ ikconfig_dir);
+ if (current_config == NULL) {
+ result = -ENOMEM;
+ goto leave2;
+ }
+ current_config->proc_iops = &ikconfig_inode_ops;
+ current_config->proc_fops = &ikconfig_file_ops;
+ current_config->owner = THIS_MODULE;
+ ikconfig_current_size = strlen(ikconfig_config);
+ current_config->size = ikconfig_current_size;
+
+ /* create the "built with" file */
+ built_with = create_proc_read_entry("built_with", 0444, ikconfig_dir,
+ proc_read_built_with, NULL);
+ if (built_with == NULL) {
+ result = -ENOMEM;
+ goto leave3;
+ }
+ built_with->owner = THIS_MODULE;
+ goto leave;
+
+leave3:
+ /* remove the file from proc */
+ remove_proc_entry("config", ikconfig_dir);
+
+leave2:
+ /* remove the ikconfig directory */
+ remove_proc_entry(IKCONFIG_NAME, NULL);
+
+leave:
+ return result;
+}
+
+/***************************************************/
+/* cleanup_ikconfig: clean up our mess */
+
+static void
+cleanup_ikconfig(void)
+{
+ /* remove the files */
+ remove_proc_entry("config", ikconfig_dir);
+ remove_proc_entry("built_with", ikconfig_dir);
+
+ /* remove the ikconfig directory */
+ remove_proc_entry(IKCONFIG_NAME, NULL);
+
+ printk(KERN_INFO "ikconfig unloaded\n");
+
+ return;
+}
+
+module_init(ikconfig_init);
+module_exit(cleanup_ikconfig);
+
+MODULE_LICENSE("GPL");
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/scripts/extract-ikconfig linux-2.5.50-ikconfig/scripts/extract-ikconfig
--- linux-2.5.50/scripts/extract-ikconfig Wed Dec 31 17:00:00 1969
+++ linux-2.5.50-ikconfig/scripts/extract-ikconfig Mon Dec 2 12:50:12 2002
@@ -0,0 +1,101 @@
+#! /bin/bash
+# extracts .config info from a [b]zImage file
+# uses: binoffset (new), dd, zcat, strings, grep
+# $arg1 is [b]zImage filename
+
+HDR=0
+TMPFILE=""
+
+usage()
+{
+ echo " usage: extract-ikconfig [b]zImage_filename [architecture]"
+ echo " where architecture is one of i386, ia64"
+}
+
+clean_up()
+{
+ if [ $HDR -ne 0 ]
+ then
+ rm -f $TMPFILE
+ fi
+}
+
+if [ $# -lt 1 ]
+then
+ usage
+ exit
+fi
+
+image=$1
+arch=$2
+
+if [ "$arch" = "" ]
+then
+ arch=`uname -m`
+fi
+arch=`echo $arch | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/`
+
+case $arch in
+i386)
+ HDR=`binoffset $image 0x1f 0x8b 0x08 0x0 2> /dev/null`
+ if [ "$HDR" = "" ]
+ then
+ echo "ERROR: Failed to find the start of kernel in kernel image file."
+ echo " Please verify if binoffset is present on your system."
+ exit 1
+ fi
+ # If the kernel is uncompressed, binoffset will fail to find
+ # gzip signature
+ if [ $HDR -eq -1 ]
+ then
+ HDR=0
+ fi
+ ;;
+ia64)
+ HDR=0
+ ;;
+*)
+ # We do not know where the kernel image might start in this file,
+ # but we may be able to extract configuration information
+ # nevertheless if the kernel image is not compressed.
+ echo "WARNING: This script has not been ported to architecture $arch"
+ echo " Unless you passed in an uncompressed kernel image file,"
+ echo " this script may not produce correct result."
+ echo
+ HDR=0
+ ;;
+esac
+
+PID=$$
+
+# Extract the kernel image if necessary
+if [ $HDR -ne 0 ]
+then
+ TMPFILE="/tmp/`basename $image`.vmlin.$PID"
+ dd if=$image bs=1 skip=$HDR 2> /dev/null > $TMPFILE
+else
+ TMPFILE=$image
+fi
+
+# Check if the kernel image is compressed. If it is, uncompress it before
+# looking for strings.
+file $TMPFILE | grep "gzip compressed" > /dev/null
+if [ $? -eq 0 ]
+then
+ zcat $TMPFILE | strings | awk "/CONFIG_BEGIN=n/,/CONFIG_END=n/" > $image.oldconfig.$PID
+else
+ strings $TMPFILE | grep "CONFIG_BEGIN=n" > /dev/null
+ if [ $? -eq 0 ]
+ then
+ strings $TMPFILE | awk "/CONFIG_BEGIN=n/,/CONFIG_END=n/" > $image.oldconfig.$PID
+ else
+ echo "ERROR: Unable to extract kernel configuration information."
+ echo " This kernel image may not have the config info."
+ clean_up
+ exit 1
+ fi
+fi
+
+echo "Kernel configuration written to $image.oldconfig.$PID"
+clean_up
+exit 0
diff -urN --exclude-from=diff_exclude_file linux-2.5.50/scripts/mkconfigs linux-2.5.50-ikconfig/scripts/mkconfigs
--- linux-2.5.50/scripts/mkconfigs Wed Dec 31 17:00:00 1969
+++ linux-2.5.50-ikconfig/scripts/mkconfigs Mon Dec 2 12:50:12 2002
@@ -0,0 +1,81 @@
+#!/bin/sh
+#
+# Copyright (C) 2002 Khalid Aziz <[email protected]>
+# Copyright (C) 2002 Randy Dunlap <[email protected]>
+# Copyright (C) 2002 Al Stone <[email protected]>
+# Copyright (C) 2002 Hewlett-Packard Company
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+#
+# Rules to generate ikconfig.h from linux/.config:
+# - Retain lines that begin with "CONFIG_"
+# - Retain lines that begin with "# CONFIG_"
+# - lines that use double-quotes must \\-escape-quote them
+
+
+kernel_version()
+{
+ KERNVER="`grep VERSION $1 | head -1 | cut -f3 -d' '`.`grep PATCHLEVEL $1 | head -1 | cut -f3 -d' '`.`grep SUBLEVEL $1 | head -1 | cut -f3 -d' '``grep EXTRAVERSION $1 | head -1 | cut -f3 -d' '`"
+}
+
+if [ $# -lt 2 ]
+then
+ echo "Usage: `basename $0` <configuration_file> <Makefile>"
+ exit 1
+fi
+
+config=$1
+makefile=$2
+
+echo "#ifndef _IKCONFIG_H"
+echo "#define _IKCONFIG_H"
+echo \
+"/*
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ *
+ * This file is generated automatically by scripts/mkconfigs. Do not edit.
+ *
+ */"
+
+echo "static char *ikconfig_built_with ="
+echo " \"`uname -s` `uname -r` `uname -v` `uname -m`\";"
+echo
+kernel_version $makefile
+echo "#ifdef CONFIG_IKCONFIG_PROC"
+echo "static char *ikconfig_config = "
+echo "#else"
+echo "static char *ikconfig_config __initdata __attribute__((unused)) = "
+echo "#endif"
+echo "\"CONFIG_BEGIN=n\\n\\"
+echo "`cat $config | sed 's/\"/\\\\\"/g' | grep "^#\? \?CONFIG_" | awk '{ print $0, "\\\\n\\\\" }' `"
+echo "CONFIG_END=n\";"
+echo "#endif /* _IKCONFIG_H */"
In article <[email protected]>,
Khalid Aziz <[email protected]> wrote:
| I am including a patch for 2.5.50 that allows a user to embed kernel
| configuration in the kernel and retrieve it later either from a running
| kernel or from the kernel image file. This is an enhancement to Randy's
| patch that was discussed on LKML before and is part of -ac series
| kernels.
|
| This patch provides three choices for embedding kernel configuration:
|
| 1. Include configuration in running kernel image. This adds to the
| footprint of the running kernel but allows configuration to be retrieved
| using "cat /proc/ikconfig/config".
|
| 2. Include configuration in kernel image file but not in the running
| kernel. This adds to the kernel image file size but not the footprint of
| running kernel. Configuration can be extracted from kernel image file
| using scripts/extract-ikconfig. This script is in principle the same as
| what Randy had written originally. I have made it little more robust and
| structured it to accomodate more than just x86 architecture.
|
| 3. Not include kernel configuration in the running kernel or kernel
| image file.
I would suggest that making (2) available as a module would be useful,
assuming that at some point 2.5 will have working module capability
again. With a bit of tweaking you could make the kernel loader pull it
in if a process accessed the file, I guess.
--
bill davidsen <[email protected]>
CTO, TMR Associates, Inc
Doing interesting things with little computers since 1979.
bill davidsen wrote:
>
> | 2. Include configuration in kernel image file but not in the running
> | kernel. This adds to the kernel image file size but not the footprint of
> | running kernel. Configuration can be extracted from kernel image file
> | using scripts/extract-ikconfig. This script is in principle the same as
> | what Randy had written originally. I have made it little more robust and
> | structured it to accomodate more than just x86 architecture.
>
> I would suggest that making (2) available as a module would be useful,
> assuming that at some point 2.5 will have working module capability
> again. With a bit of tweaking you could make the kernel loader pull it
> in if a process accessed the file, I guess.
It is trivial to make (2) available as a module but it has been debated
that having configuration information available as module does not make
the job of keeping a reliable source of kernel configuration any easier
than just keeping a copy of config file in, say, /lib/modules directory.
If you can ensure you always have the right module file available for
the running kernel, you can also ensure you always have the right config
file available for the kernel.
--
Khalid
====================================================================
Khalid Aziz Linux and Open Source Lab
(970)898-9214 Hewlett-Packard
[email protected] Fort Collins, CO
"The Linux kernel is subject to relentless development"
- Alessandro Rubini
On Tue, 3 Dec 2002, Khalid Aziz wrote:
> bill davidsen wrote:
> >
> > | 2. Include configuration in kernel image file but not in the running
> > | kernel. This adds to the kernel image file size but not the footprint of
> > | running kernel. Configuration can be extracted from kernel image file
> > | using scripts/extract-ikconfig. This script is in principle the same as
> > | what Randy had written originally. I have made it little more robust and
> > | structured it to accomodate more than just x86 architecture.
> >
> > I would suggest that making (2) available as a module would be useful,
> > assuming that at some point 2.5 will have working module capability
> > again. With a bit of tweaking you could make the kernel loader pull it
> > in if a process accessed the file, I guess.
>
> It is trivial to make (2) available as a module but it has been debated
> that having configuration information available as module does not make
> the job of keeping a reliable source of kernel configuration any easier
> than just keeping a copy of config file in, say, /lib/modules directory.
> If you can ensure you always have the right module file available for
> the running kernel, you can also ensure you always have the right config
> file available for the kernel.
All true, I just find having the config in the same location for all
kernels (in say /proc/config) is more convenient than having to resolve
the kernel name from another file or do /lib/modules/$(uname -r)/config
from a script. The kernel knows who it is, all others have to ask. It's
just one less step a program would have to take, not a major problem.
--
bill davidsen <[email protected]>
CTO, TMR Associates, Inc
Doing interesting things with little computers since 1979.