2019-07-22 12:20:08 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-17 02:20:36 +04:00
/*
* kernel / configs . c
* Echo the kernel . config file used to build the kernel
*
* Copyright ( C ) 2002 Khalid Aziz < khalid_aziz @ hp . com >
2006-01-03 15:37:51 +03:00
* Copyright ( C ) 2002 Randy Dunlap < rdunlap @ xenotime . net >
2005-04-17 02:20:36 +04:00
* Copyright ( C ) 2002 Al Stone < ahs3 @ fc . hp . com >
* Copyright ( C ) 2002 Hewlett - Packard Company
*/
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/proc_fs.h>
# include <linux/seq_file.h>
# include <linux/init.h>
2016-12-24 22:46:01 +03:00
# include <linux/uaccess.h>
2005-04-17 02:20:36 +04:00
/*
2019-03-08 03:29:53 +03:00
* " IKCFG_ST " and " IKCFG_ED " are used to extract the config data from
* a binary kernel image or a module . See scripts / extract - ikconfig .
2005-04-17 02:20:36 +04:00
*/
2019-03-08 03:29:53 +03:00
asm (
" .pushsection .rodata, \" a \" \n "
" .ascii \" IKCFG_ST \" \n "
" .global kernel_config_data \n "
" kernel_config_data: \n "
" .incbin \" kernel/config_data.gz \" \n "
" .global kernel_config_data_end \n "
" kernel_config_data_end: \n "
" .ascii \" IKCFG_ED \" \n "
" .popsection \n "
) ;
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_IKCONFIG_PROC
2019-03-08 03:29:53 +03:00
extern char kernel_config_data ;
extern char kernel_config_data_end ;
2005-04-17 02:20:36 +04:00
static ssize_t
ikconfig_read_current ( struct file * file , char __user * buf ,
size_t len , loff_t * offset )
{
2007-05-09 13:33:33 +04:00
return simple_read_from_buffer ( buf , len , offset ,
2019-03-08 03:29:53 +03:00
& kernel_config_data ,
& kernel_config_data_end -
& kernel_config_data ) ;
2005-04-17 02:20:36 +04:00
}
2020-02-04 04:37:17 +03:00
static const struct proc_ops config_gz_proc_ops = {
. proc_read = ikconfig_read_current ,
. proc_lseek = default_llseek ,
2005-04-17 02:20:36 +04:00
} ;
static int __init ikconfig_init ( void )
{
struct proc_dir_entry * entry ;
/* create the current config file */
2008-04-29 12:02:31 +04:00
entry = proc_create ( " config.gz " , S_IFREG | S_IRUGO , NULL ,
2020-02-04 04:37:17 +03:00
& config_gz_proc_ops ) ;
2005-04-17 02:20:36 +04:00
if ( ! entry )
return - ENOMEM ;
2019-03-08 03:29:53 +03:00
proc_set_size ( entry , & kernel_config_data_end - & kernel_config_data ) ;
2005-04-17 02:20:36 +04:00
return 0 ;
}
static void __exit ikconfig_cleanup ( void )
{
2008-04-29 12:01:44 +04:00
remove_proc_entry ( " config.gz " , NULL ) ;
2005-04-17 02:20:36 +04:00
}
module_init ( ikconfig_init ) ;
module_exit ( ikconfig_cleanup ) ;
2011-07-26 04:13:12 +04:00
# endif /* CONFIG_IKCONFIG_PROC */
2005-04-17 02:20:36 +04:00
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Randy Dunlap " ) ;
MODULE_DESCRIPTION ( " Echo the kernel .config file used to build the kernel " ) ;