2005-04-17 02:20:36 +04:00
/*
* kernel / ksysfs . c - sysfs attributes in / sys / kernel , which
* are not related to any other subsystem
*
* Copyright ( C ) 2004 Kay Sievers < kay . sievers @ vrfy . org >
*
* This file is release under the GPLv2
*
*/
# include <linux/kobject.h>
# include <linux/string.h>
# include <linux/sysfs.h>
# include <linux/module.h>
# include <linux/init.h>
2006-06-23 13:05:07 +04:00
# include <linux/kexec.h>
2005-04-17 02:20:36 +04:00
# define KERNEL_ATTR_RO(_name) \
static struct subsys_attribute _name # # _attr = __ATTR_RO ( _name )
# define KERNEL_ATTR_RW(_name) \
static struct subsys_attribute _name # # _attr = \
__ATTR ( _name , 0644 , _name # # _show , _name # # _store )
2006-03-24 14:18:44 +03:00
# if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET)
2005-11-11 06:58:04 +03:00
/* current uevent sequence number */
2007-04-14 00:15:19 +04:00
static ssize_t uevent_seqnum_show ( struct kset * kset , char * page )
2005-04-17 02:20:36 +04:00
{
2005-11-16 11:00:00 +03:00
return sprintf ( page , " %llu \n " , ( unsigned long long ) uevent_seqnum ) ;
2005-04-17 02:20:36 +04:00
}
2005-11-11 06:58:04 +03:00
KERNEL_ATTR_RO ( uevent_seqnum ) ;
/* uevent helper program, used during early boo */
2007-04-14 00:15:19 +04:00
static ssize_t uevent_helper_show ( struct kset * kset , char * page )
2005-11-11 06:58:04 +03:00
{
2005-11-16 11:00:00 +03:00
return sprintf ( page , " %s \n " , uevent_helper ) ;
2005-11-11 06:58:04 +03:00
}
2007-04-14 00:15:19 +04:00
static ssize_t uevent_helper_store ( struct kset * kset , const char * page , size_t count )
2005-11-11 06:58:04 +03:00
{
2005-11-16 11:00:00 +03:00
if ( count + 1 > UEVENT_HELPER_PATH_LEN )
2005-11-11 06:58:04 +03:00
return - ENOENT ;
2005-11-16 11:00:00 +03:00
memcpy ( uevent_helper , page , count ) ;
uevent_helper [ count ] = ' \0 ' ;
if ( count & & uevent_helper [ count - 1 ] = = ' \n ' )
uevent_helper [ count - 1 ] = ' \0 ' ;
2005-11-11 06:58:04 +03:00
return count ;
}
KERNEL_ATTR_RW ( uevent_helper ) ;
2005-04-17 02:20:36 +04:00
# endif
2006-06-23 13:05:07 +04:00
# ifdef CONFIG_KEXEC
2007-04-14 00:15:19 +04:00
static ssize_t kexec_loaded_show ( struct kset * kset , char * page )
2006-06-23 13:05:07 +04:00
{
return sprintf ( page , " %d \n " , ! ! kexec_image ) ;
}
KERNEL_ATTR_RO ( kexec_loaded ) ;
2007-04-14 00:15:19 +04:00
static ssize_t kexec_crash_loaded_show ( struct kset * kset , char * page )
2006-06-23 13:05:07 +04:00
{
return sprintf ( page , " %d \n " , ! ! kexec_crash_image ) ;
}
KERNEL_ATTR_RO ( kexec_crash_loaded ) ;
# endif /* CONFIG_KEXEC */
2005-04-17 02:20:36 +04:00
decl_subsys ( kernel , NULL , NULL ) ;
EXPORT_SYMBOL_GPL ( kernel_subsys ) ;
static struct attribute * kernel_attrs [ ] = {
2006-03-24 14:18:44 +03:00
# if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET)
2005-11-11 06:58:04 +03:00
& uevent_seqnum_attr . attr ,
& uevent_helper_attr . attr ,
2006-06-23 13:05:07 +04:00
# endif
# ifdef CONFIG_KEXEC
& kexec_loaded_attr . attr ,
& kexec_crash_loaded_attr . attr ,
2005-04-17 02:20:36 +04:00
# endif
NULL
} ;
static struct attribute_group kernel_attr_group = {
. attrs = kernel_attrs ,
} ;
static int __init ksysfs_init ( void )
{
int error = subsystem_register ( & kernel_subsys ) ;
if ( ! error )
2007-04-14 00:15:19 +04:00
error = sysfs_create_group ( & kernel_subsys . kobj ,
2005-04-17 02:20:36 +04:00
& kernel_attr_group ) ;
return error ;
}
core_initcall ( ksysfs_init ) ;