cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sysfs.h (18060B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * sysfs.h - definitions for the device driver filesystem
      4 *
      5 * Copyright (c) 2001,2002 Patrick Mochel
      6 * Copyright (c) 2004 Silicon Graphics, Inc.
      7 * Copyright (c) 2007 SUSE Linux Products GmbH
      8 * Copyright (c) 2007 Tejun Heo <teheo@suse.de>
      9 *
     10 * Please see Documentation/filesystems/sysfs.rst for more information.
     11 */
     12
     13#ifndef _SYSFS_H_
     14#define _SYSFS_H_
     15
     16#include <linux/kernfs.h>
     17#include <linux/compiler.h>
     18#include <linux/errno.h>
     19#include <linux/list.h>
     20#include <linux/lockdep.h>
     21#include <linux/kobject_ns.h>
     22#include <linux/stat.h>
     23#include <linux/atomic.h>
     24
     25struct kobject;
     26struct module;
     27struct bin_attribute;
     28enum kobj_ns_type;
     29
     30struct attribute {
     31	const char		*name;
     32	umode_t			mode;
     33#ifdef CONFIG_DEBUG_LOCK_ALLOC
     34	bool			ignore_lockdep:1;
     35	struct lock_class_key	*key;
     36	struct lock_class_key	skey;
     37#endif
     38};
     39
     40/**
     41 *	sysfs_attr_init - initialize a dynamically allocated sysfs attribute
     42 *	@attr: struct attribute to initialize
     43 *
     44 *	Initialize a dynamically allocated struct attribute so we can
     45 *	make lockdep happy.  This is a new requirement for attributes
     46 *	and initially this is only needed when lockdep is enabled.
     47 *	Lockdep gives a nice error when your attribute is added to
     48 *	sysfs if you don't have this.
     49 */
     50#ifdef CONFIG_DEBUG_LOCK_ALLOC
     51#define sysfs_attr_init(attr)				\
     52do {							\
     53	static struct lock_class_key __key;		\
     54							\
     55	(attr)->key = &__key;				\
     56} while (0)
     57#else
     58#define sysfs_attr_init(attr) do {} while (0)
     59#endif
     60
     61/**
     62 * struct attribute_group - data structure used to declare an attribute group.
     63 * @name:	Optional: Attribute group name
     64 *		If specified, the attribute group will be created in
     65 *		a new subdirectory with this name.
     66 * @is_visible:	Optional: Function to return permissions associated with an
     67 *		attribute of the group. Will be called repeatedly for each
     68 *		non-binary attribute in the group. Only read/write
     69 *		permissions as well as SYSFS_PREALLOC are accepted. Must
     70 *		return 0 if an attribute is not visible. The returned value
     71 *		will replace static permissions defined in struct attribute.
     72 * @is_bin_visible:
     73 *		Optional: Function to return permissions associated with a
     74 *		binary attribute of the group. Will be called repeatedly
     75 *		for each binary attribute in the group. Only read/write
     76 *		permissions as well as SYSFS_PREALLOC are accepted. Must
     77 *		return 0 if a binary attribute is not visible. The returned
     78 *		value will replace static permissions defined in
     79 *		struct bin_attribute.
     80 * @attrs:	Pointer to NULL terminated list of attributes.
     81 * @bin_attrs:	Pointer to NULL terminated list of binary attributes.
     82 *		Either attrs or bin_attrs or both must be provided.
     83 */
     84struct attribute_group {
     85	const char		*name;
     86	umode_t			(*is_visible)(struct kobject *,
     87					      struct attribute *, int);
     88	umode_t			(*is_bin_visible)(struct kobject *,
     89						  struct bin_attribute *, int);
     90	struct attribute	**attrs;
     91	struct bin_attribute	**bin_attrs;
     92};
     93
     94/*
     95 * Use these macros to make defining attributes easier.
     96 * See include/linux/device.h for examples..
     97 */
     98
     99#define SYSFS_PREALLOC 010000
    100
    101#define __ATTR(_name, _mode, _show, _store) {				\
    102	.attr = {.name = __stringify(_name),				\
    103		 .mode = VERIFY_OCTAL_PERMISSIONS(_mode) },		\
    104	.show	= _show,						\
    105	.store	= _store,						\
    106}
    107
    108#define __ATTR_PREALLOC(_name, _mode, _show, _store) {			\
    109	.attr = {.name = __stringify(_name),				\
    110		 .mode = SYSFS_PREALLOC | VERIFY_OCTAL_PERMISSIONS(_mode) },\
    111	.show	= _show,						\
    112	.store	= _store,						\
    113}
    114
    115#define __ATTR_RO(_name) {						\
    116	.attr	= { .name = __stringify(_name), .mode = 0444 },		\
    117	.show	= _name##_show,						\
    118}
    119
    120#define __ATTR_RO_MODE(_name, _mode) {					\
    121	.attr	= { .name = __stringify(_name),				\
    122		    .mode = VERIFY_OCTAL_PERMISSIONS(_mode) },		\
    123	.show	= _name##_show,						\
    124}
    125
    126#define __ATTR_RW_MODE(_name, _mode) {					\
    127	.attr	= { .name = __stringify(_name),				\
    128		    .mode = VERIFY_OCTAL_PERMISSIONS(_mode) },		\
    129	.show	= _name##_show,						\
    130	.store	= _name##_store,					\
    131}
    132
    133#define __ATTR_WO(_name) {						\
    134	.attr	= { .name = __stringify(_name), .mode = 0200 },		\
    135	.store	= _name##_store,					\
    136}
    137
    138#define __ATTR_RW(_name) __ATTR(_name, 0644, _name##_show, _name##_store)
    139
    140#define __ATTR_NULL { .attr = { .name = NULL } }
    141
    142#ifdef CONFIG_DEBUG_LOCK_ALLOC
    143#define __ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) {	\
    144	.attr = {.name = __stringify(_name), .mode = _mode,	\
    145			.ignore_lockdep = true },		\
    146	.show		= _show,				\
    147	.store		= _store,				\
    148}
    149#else
    150#define __ATTR_IGNORE_LOCKDEP	__ATTR
    151#endif
    152
    153#define __ATTRIBUTE_GROUPS(_name)				\
    154static const struct attribute_group *_name##_groups[] = {	\
    155	&_name##_group,						\
    156	NULL,							\
    157}
    158
    159#define ATTRIBUTE_GROUPS(_name)					\
    160static const struct attribute_group _name##_group = {		\
    161	.attrs = _name##_attrs,					\
    162};								\
    163__ATTRIBUTE_GROUPS(_name)
    164
    165#define BIN_ATTRIBUTE_GROUPS(_name)				\
    166static const struct attribute_group _name##_group = {		\
    167	.bin_attrs = _name##_attrs,				\
    168};								\
    169__ATTRIBUTE_GROUPS(_name)
    170
    171struct file;
    172struct vm_area_struct;
    173struct address_space;
    174
    175struct bin_attribute {
    176	struct attribute	attr;
    177	size_t			size;
    178	void			*private;
    179	struct address_space *(*f_mapping)(void);
    180	ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *,
    181			char *, loff_t, size_t);
    182	ssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *,
    183			 char *, loff_t, size_t);
    184	int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr,
    185		    struct vm_area_struct *vma);
    186};
    187
    188/**
    189 *	sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute
    190 *	@attr: struct bin_attribute to initialize
    191 *
    192 *	Initialize a dynamically allocated struct bin_attribute so we
    193 *	can make lockdep happy.  This is a new requirement for
    194 *	attributes and initially this is only needed when lockdep is
    195 *	enabled.  Lockdep gives a nice error when your attribute is
    196 *	added to sysfs if you don't have this.
    197 */
    198#define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr)
    199
    200/* macros to create static binary attributes easier */
    201#define __BIN_ATTR(_name, _mode, _read, _write, _size) {		\
    202	.attr = { .name = __stringify(_name), .mode = _mode },		\
    203	.read	= _read,						\
    204	.write	= _write,						\
    205	.size	= _size,						\
    206}
    207
    208#define __BIN_ATTR_RO(_name, _size) {					\
    209	.attr	= { .name = __stringify(_name), .mode = 0444 },		\
    210	.read	= _name##_read,						\
    211	.size	= _size,						\
    212}
    213
    214#define __BIN_ATTR_WO(_name, _size) {					\
    215	.attr	= { .name = __stringify(_name), .mode = 0200 },		\
    216	.write	= _name##_write,					\
    217	.size	= _size,						\
    218}
    219
    220#define __BIN_ATTR_RW(_name, _size)					\
    221	__BIN_ATTR(_name, 0644, _name##_read, _name##_write, _size)
    222
    223#define __BIN_ATTR_NULL __ATTR_NULL
    224
    225#define BIN_ATTR(_name, _mode, _read, _write, _size)			\
    226struct bin_attribute bin_attr_##_name = __BIN_ATTR(_name, _mode, _read,	\
    227					_write, _size)
    228
    229#define BIN_ATTR_RO(_name, _size)					\
    230struct bin_attribute bin_attr_##_name = __BIN_ATTR_RO(_name, _size)
    231
    232#define BIN_ATTR_WO(_name, _size)					\
    233struct bin_attribute bin_attr_##_name = __BIN_ATTR_WO(_name, _size)
    234
    235#define BIN_ATTR_RW(_name, _size)					\
    236struct bin_attribute bin_attr_##_name = __BIN_ATTR_RW(_name, _size)
    237
    238struct sysfs_ops {
    239	ssize_t	(*show)(struct kobject *, struct attribute *, char *);
    240	ssize_t	(*store)(struct kobject *, struct attribute *, const char *, size_t);
    241};
    242
    243#ifdef CONFIG_SYSFS
    244
    245int __must_check sysfs_create_dir_ns(struct kobject *kobj, const void *ns);
    246void sysfs_remove_dir(struct kobject *kobj);
    247int __must_check sysfs_rename_dir_ns(struct kobject *kobj, const char *new_name,
    248				     const void *new_ns);
    249int __must_check sysfs_move_dir_ns(struct kobject *kobj,
    250				   struct kobject *new_parent_kobj,
    251				   const void *new_ns);
    252int __must_check sysfs_create_mount_point(struct kobject *parent_kobj,
    253					  const char *name);
    254void sysfs_remove_mount_point(struct kobject *parent_kobj,
    255			      const char *name);
    256
    257int __must_check sysfs_create_file_ns(struct kobject *kobj,
    258				      const struct attribute *attr,
    259				      const void *ns);
    260int __must_check sysfs_create_files(struct kobject *kobj,
    261				   const struct attribute * const *attr);
    262int __must_check sysfs_chmod_file(struct kobject *kobj,
    263				  const struct attribute *attr, umode_t mode);
    264struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj,
    265						  const struct attribute *attr);
    266void sysfs_unbreak_active_protection(struct kernfs_node *kn);
    267void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
    268			  const void *ns);
    269bool sysfs_remove_file_self(struct kobject *kobj, const struct attribute *attr);
    270void sysfs_remove_files(struct kobject *kobj, const struct attribute * const *attr);
    271
    272int __must_check sysfs_create_bin_file(struct kobject *kobj,
    273				       const struct bin_attribute *attr);
    274void sysfs_remove_bin_file(struct kobject *kobj,
    275			   const struct bin_attribute *attr);
    276
    277int __must_check sysfs_create_link(struct kobject *kobj, struct kobject *target,
    278				   const char *name);
    279int __must_check sysfs_create_link_nowarn(struct kobject *kobj,
    280					  struct kobject *target,
    281					  const char *name);
    282void sysfs_remove_link(struct kobject *kobj, const char *name);
    283
    284int sysfs_rename_link_ns(struct kobject *kobj, struct kobject *target,
    285			 const char *old_name, const char *new_name,
    286			 const void *new_ns);
    287
    288void sysfs_delete_link(struct kobject *dir, struct kobject *targ,
    289			const char *name);
    290
    291int __must_check sysfs_create_group(struct kobject *kobj,
    292				    const struct attribute_group *grp);
    293int __must_check sysfs_create_groups(struct kobject *kobj,
    294				     const struct attribute_group **groups);
    295int __must_check sysfs_update_groups(struct kobject *kobj,
    296				     const struct attribute_group **groups);
    297int sysfs_update_group(struct kobject *kobj,
    298		       const struct attribute_group *grp);
    299void sysfs_remove_group(struct kobject *kobj,
    300			const struct attribute_group *grp);
    301void sysfs_remove_groups(struct kobject *kobj,
    302			 const struct attribute_group **groups);
    303int sysfs_add_file_to_group(struct kobject *kobj,
    304			const struct attribute *attr, const char *group);
    305void sysfs_remove_file_from_group(struct kobject *kobj,
    306			const struct attribute *attr, const char *group);
    307int sysfs_merge_group(struct kobject *kobj,
    308		       const struct attribute_group *grp);
    309void sysfs_unmerge_group(struct kobject *kobj,
    310		       const struct attribute_group *grp);
    311int sysfs_add_link_to_group(struct kobject *kobj, const char *group_name,
    312			    struct kobject *target, const char *link_name);
    313void sysfs_remove_link_from_group(struct kobject *kobj, const char *group_name,
    314				  const char *link_name);
    315int compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
    316					 struct kobject *target_kobj,
    317					 const char *target_name,
    318					 const char *symlink_name);
    319
    320void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);
    321
    322int __must_check sysfs_init(void);
    323
    324static inline void sysfs_enable_ns(struct kernfs_node *kn)
    325{
    326	return kernfs_enable_ns(kn);
    327}
    328
    329int sysfs_file_change_owner(struct kobject *kobj, const char *name, kuid_t kuid,
    330			    kgid_t kgid);
    331int sysfs_change_owner(struct kobject *kobj, kuid_t kuid, kgid_t kgid);
    332int sysfs_link_change_owner(struct kobject *kobj, struct kobject *targ,
    333			    const char *name, kuid_t kuid, kgid_t kgid);
    334int sysfs_groups_change_owner(struct kobject *kobj,
    335			      const struct attribute_group **groups,
    336			      kuid_t kuid, kgid_t kgid);
    337int sysfs_group_change_owner(struct kobject *kobj,
    338			     const struct attribute_group *groups, kuid_t kuid,
    339			     kgid_t kgid);
    340__printf(2, 3)
    341int sysfs_emit(char *buf, const char *fmt, ...);
    342__printf(3, 4)
    343int sysfs_emit_at(char *buf, int at, const char *fmt, ...);
    344
    345#else /* CONFIG_SYSFS */
    346
    347static inline int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
    348{
    349	return 0;
    350}
    351
    352static inline void sysfs_remove_dir(struct kobject *kobj)
    353{
    354}
    355
    356static inline int sysfs_rename_dir_ns(struct kobject *kobj,
    357				      const char *new_name, const void *new_ns)
    358{
    359	return 0;
    360}
    361
    362static inline int sysfs_move_dir_ns(struct kobject *kobj,
    363				    struct kobject *new_parent_kobj,
    364				    const void *new_ns)
    365{
    366	return 0;
    367}
    368
    369static inline int sysfs_create_mount_point(struct kobject *parent_kobj,
    370					   const char *name)
    371{
    372	return 0;
    373}
    374
    375static inline void sysfs_remove_mount_point(struct kobject *parent_kobj,
    376					    const char *name)
    377{
    378}
    379
    380static inline int sysfs_create_file_ns(struct kobject *kobj,
    381				       const struct attribute *attr,
    382				       const void *ns)
    383{
    384	return 0;
    385}
    386
    387static inline int sysfs_create_files(struct kobject *kobj,
    388				    const struct attribute * const *attr)
    389{
    390	return 0;
    391}
    392
    393static inline int sysfs_chmod_file(struct kobject *kobj,
    394				   const struct attribute *attr, umode_t mode)
    395{
    396	return 0;
    397}
    398
    399static inline struct kernfs_node *
    400sysfs_break_active_protection(struct kobject *kobj,
    401			      const struct attribute *attr)
    402{
    403	return NULL;
    404}
    405
    406static inline void sysfs_unbreak_active_protection(struct kernfs_node *kn)
    407{
    408}
    409
    410static inline void sysfs_remove_file_ns(struct kobject *kobj,
    411					const struct attribute *attr,
    412					const void *ns)
    413{
    414}
    415
    416static inline bool sysfs_remove_file_self(struct kobject *kobj,
    417					  const struct attribute *attr)
    418{
    419	return false;
    420}
    421
    422static inline void sysfs_remove_files(struct kobject *kobj,
    423				     const struct attribute * const *attr)
    424{
    425}
    426
    427static inline int sysfs_create_bin_file(struct kobject *kobj,
    428					const struct bin_attribute *attr)
    429{
    430	return 0;
    431}
    432
    433static inline void sysfs_remove_bin_file(struct kobject *kobj,
    434					 const struct bin_attribute *attr)
    435{
    436}
    437
    438static inline int sysfs_create_link(struct kobject *kobj,
    439				    struct kobject *target, const char *name)
    440{
    441	return 0;
    442}
    443
    444static inline int sysfs_create_link_nowarn(struct kobject *kobj,
    445					   struct kobject *target,
    446					   const char *name)
    447{
    448	return 0;
    449}
    450
    451static inline void sysfs_remove_link(struct kobject *kobj, const char *name)
    452{
    453}
    454
    455static inline int sysfs_rename_link_ns(struct kobject *k, struct kobject *t,
    456				       const char *old_name,
    457				       const char *new_name, const void *ns)
    458{
    459	return 0;
    460}
    461
    462static inline void sysfs_delete_link(struct kobject *k, struct kobject *t,
    463				     const char *name)
    464{
    465}
    466
    467static inline int sysfs_create_group(struct kobject *kobj,
    468				     const struct attribute_group *grp)
    469{
    470	return 0;
    471}
    472
    473static inline int sysfs_create_groups(struct kobject *kobj,
    474				      const struct attribute_group **groups)
    475{
    476	return 0;
    477}
    478
    479static inline int sysfs_update_groups(struct kobject *kobj,
    480				      const struct attribute_group **groups)
    481{
    482	return 0;
    483}
    484
    485static inline int sysfs_update_group(struct kobject *kobj,
    486				const struct attribute_group *grp)
    487{
    488	return 0;
    489}
    490
    491static inline void sysfs_remove_group(struct kobject *kobj,
    492				      const struct attribute_group *grp)
    493{
    494}
    495
    496static inline void sysfs_remove_groups(struct kobject *kobj,
    497				       const struct attribute_group **groups)
    498{
    499}
    500
    501static inline int sysfs_add_file_to_group(struct kobject *kobj,
    502		const struct attribute *attr, const char *group)
    503{
    504	return 0;
    505}
    506
    507static inline void sysfs_remove_file_from_group(struct kobject *kobj,
    508		const struct attribute *attr, const char *group)
    509{
    510}
    511
    512static inline int sysfs_merge_group(struct kobject *kobj,
    513		       const struct attribute_group *grp)
    514{
    515	return 0;
    516}
    517
    518static inline void sysfs_unmerge_group(struct kobject *kobj,
    519		       const struct attribute_group *grp)
    520{
    521}
    522
    523static inline int sysfs_add_link_to_group(struct kobject *kobj,
    524		const char *group_name, struct kobject *target,
    525		const char *link_name)
    526{
    527	return 0;
    528}
    529
    530static inline void sysfs_remove_link_from_group(struct kobject *kobj,
    531		const char *group_name, const char *link_name)
    532{
    533}
    534
    535static inline int compat_only_sysfs_link_entry_to_kobj(struct kobject *kobj,
    536						       struct kobject *target_kobj,
    537						       const char *target_name,
    538						       const char *symlink_name)
    539{
    540	return 0;
    541}
    542
    543static inline void sysfs_notify(struct kobject *kobj, const char *dir,
    544				const char *attr)
    545{
    546}
    547
    548static inline int __must_check sysfs_init(void)
    549{
    550	return 0;
    551}
    552
    553static inline void sysfs_enable_ns(struct kernfs_node *kn)
    554{
    555}
    556
    557static inline int sysfs_file_change_owner(struct kobject *kobj,
    558					  const char *name, kuid_t kuid,
    559					  kgid_t kgid)
    560{
    561	return 0;
    562}
    563
    564static inline int sysfs_link_change_owner(struct kobject *kobj,
    565					  struct kobject *targ,
    566					  const char *name, kuid_t kuid,
    567					  kgid_t kgid)
    568{
    569	return 0;
    570}
    571
    572static inline int sysfs_change_owner(struct kobject *kobj, kuid_t kuid, kgid_t kgid)
    573{
    574	return 0;
    575}
    576
    577static inline int sysfs_groups_change_owner(struct kobject *kobj,
    578			  const struct attribute_group **groups,
    579			  kuid_t kuid, kgid_t kgid)
    580{
    581	return 0;
    582}
    583
    584static inline int sysfs_group_change_owner(struct kobject *kobj,
    585					   const struct attribute_group *groups,
    586					   kuid_t kuid, kgid_t kgid)
    587{
    588	return 0;
    589}
    590
    591__printf(2, 3)
    592static inline int sysfs_emit(char *buf, const char *fmt, ...)
    593{
    594	return 0;
    595}
    596
    597__printf(3, 4)
    598static inline int sysfs_emit_at(char *buf, int at, const char *fmt, ...)
    599{
    600	return 0;
    601}
    602#endif /* CONFIG_SYSFS */
    603
    604static inline int __must_check sysfs_create_file(struct kobject *kobj,
    605						 const struct attribute *attr)
    606{
    607	return sysfs_create_file_ns(kobj, attr, NULL);
    608}
    609
    610static inline void sysfs_remove_file(struct kobject *kobj,
    611				     const struct attribute *attr)
    612{
    613	sysfs_remove_file_ns(kobj, attr, NULL);
    614}
    615
    616static inline int sysfs_rename_link(struct kobject *kobj, struct kobject *target,
    617				    const char *old_name, const char *new_name)
    618{
    619	return sysfs_rename_link_ns(kobj, target, old_name, new_name, NULL);
    620}
    621
    622static inline void sysfs_notify_dirent(struct kernfs_node *kn)
    623{
    624	kernfs_notify(kn);
    625}
    626
    627static inline struct kernfs_node *sysfs_get_dirent(struct kernfs_node *parent,
    628						   const char *name)
    629{
    630	return kernfs_find_and_get(parent, name);
    631}
    632
    633static inline struct kernfs_node *sysfs_get(struct kernfs_node *kn)
    634{
    635	kernfs_get(kn);
    636	return kn;
    637}
    638
    639static inline void sysfs_put(struct kernfs_node *kn)
    640{
    641	kernfs_put(kn);
    642}
    643
    644#endif /* _SYSFS_H_ */