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

kobject.h (7179B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * kobject.h - generic kernel object infrastructure.
      4 *
      5 * Copyright (c) 2002-2003 Patrick Mochel
      6 * Copyright (c) 2002-2003 Open Source Development Labs
      7 * Copyright (c) 2006-2008 Greg Kroah-Hartman <greg@kroah.com>
      8 * Copyright (c) 2006-2008 Novell Inc.
      9 *
     10 * Please read Documentation/core-api/kobject.rst before using the kobject
     11 * interface, ESPECIALLY the parts about reference counts and object
     12 * destructors.
     13 */
     14
     15#ifndef _KOBJECT_H_
     16#define _KOBJECT_H_
     17
     18#include <linux/types.h>
     19#include <linux/list.h>
     20#include <linux/sysfs.h>
     21#include <linux/compiler.h>
     22#include <linux/container_of.h>
     23#include <linux/spinlock.h>
     24#include <linux/kref.h>
     25#include <linux/kobject_ns.h>
     26#include <linux/wait.h>
     27#include <linux/atomic.h>
     28#include <linux/workqueue.h>
     29#include <linux/uidgid.h>
     30
     31#define UEVENT_HELPER_PATH_LEN		256
     32#define UEVENT_NUM_ENVP			64	/* number of env pointers */
     33#define UEVENT_BUFFER_SIZE		2048	/* buffer for the variables */
     34
     35#ifdef CONFIG_UEVENT_HELPER
     36/* path to the userspace helper executed on an event */
     37extern char uevent_helper[];
     38#endif
     39
     40/* counter to tag the uevent, read only except for the kobject core */
     41extern u64 uevent_seqnum;
     42
     43/*
     44 * The actions here must match the index to the string array
     45 * in lib/kobject_uevent.c
     46 *
     47 * Do not add new actions here without checking with the driver-core
     48 * maintainers. Action strings are not meant to express subsystem
     49 * or device specific properties. In most cases you want to send a
     50 * kobject_uevent_env(kobj, KOBJ_CHANGE, env) with additional event
     51 * specific variables added to the event environment.
     52 */
     53enum kobject_action {
     54	KOBJ_ADD,
     55	KOBJ_REMOVE,
     56	KOBJ_CHANGE,
     57	KOBJ_MOVE,
     58	KOBJ_ONLINE,
     59	KOBJ_OFFLINE,
     60	KOBJ_BIND,
     61	KOBJ_UNBIND,
     62};
     63
     64struct kobject {
     65	const char		*name;
     66	struct list_head	entry;
     67	struct kobject		*parent;
     68	struct kset		*kset;
     69	const struct kobj_type	*ktype;
     70	struct kernfs_node	*sd; /* sysfs directory entry */
     71	struct kref		kref;
     72#ifdef CONFIG_DEBUG_KOBJECT_RELEASE
     73	struct delayed_work	release;
     74#endif
     75	unsigned int state_initialized:1;
     76	unsigned int state_in_sysfs:1;
     77	unsigned int state_add_uevent_sent:1;
     78	unsigned int state_remove_uevent_sent:1;
     79	unsigned int uevent_suppress:1;
     80};
     81
     82extern __printf(2, 3)
     83int kobject_set_name(struct kobject *kobj, const char *name, ...);
     84extern __printf(2, 0)
     85int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
     86			   va_list vargs);
     87
     88static inline const char *kobject_name(const struct kobject *kobj)
     89{
     90	return kobj->name;
     91}
     92
     93extern void kobject_init(struct kobject *kobj, const struct kobj_type *ktype);
     94extern __printf(3, 4) __must_check
     95int kobject_add(struct kobject *kobj, struct kobject *parent,
     96		const char *fmt, ...);
     97extern __printf(4, 5) __must_check
     98int kobject_init_and_add(struct kobject *kobj,
     99			 const struct kobj_type *ktype, struct kobject *parent,
    100			 const char *fmt, ...);
    101
    102extern void kobject_del(struct kobject *kobj);
    103
    104extern struct kobject * __must_check kobject_create_and_add(const char *name,
    105						struct kobject *parent);
    106
    107extern int __must_check kobject_rename(struct kobject *, const char *new_name);
    108extern int __must_check kobject_move(struct kobject *, struct kobject *);
    109
    110extern struct kobject *kobject_get(struct kobject *kobj);
    111extern struct kobject * __must_check kobject_get_unless_zero(
    112						struct kobject *kobj);
    113extern void kobject_put(struct kobject *kobj);
    114
    115extern const void *kobject_namespace(struct kobject *kobj);
    116extern void kobject_get_ownership(struct kobject *kobj,
    117				  kuid_t *uid, kgid_t *gid);
    118extern char *kobject_get_path(struct kobject *kobj, gfp_t flag);
    119
    120struct kobj_type {
    121	void (*release)(struct kobject *kobj);
    122	const struct sysfs_ops *sysfs_ops;
    123	const struct attribute_group **default_groups;
    124	const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
    125	const void *(*namespace)(struct kobject *kobj);
    126	void (*get_ownership)(struct kobject *kobj, kuid_t *uid, kgid_t *gid);
    127};
    128
    129struct kobj_uevent_env {
    130	char *argv[3];
    131	char *envp[UEVENT_NUM_ENVP];
    132	int envp_idx;
    133	char buf[UEVENT_BUFFER_SIZE];
    134	int buflen;
    135};
    136
    137struct kset_uevent_ops {
    138	int (* const filter)(struct kobject *kobj);
    139	const char *(* const name)(struct kobject *kobj);
    140	int (* const uevent)(struct kobject *kobj, struct kobj_uevent_env *env);
    141};
    142
    143struct kobj_attribute {
    144	struct attribute attr;
    145	ssize_t (*show)(struct kobject *kobj, struct kobj_attribute *attr,
    146			char *buf);
    147	ssize_t (*store)(struct kobject *kobj, struct kobj_attribute *attr,
    148			 const char *buf, size_t count);
    149};
    150
    151extern const struct sysfs_ops kobj_sysfs_ops;
    152
    153struct sock;
    154
    155/**
    156 * struct kset - a set of kobjects of a specific type, belonging to a specific subsystem.
    157 *
    158 * A kset defines a group of kobjects.  They can be individually
    159 * different "types" but overall these kobjects all want to be grouped
    160 * together and operated on in the same manner.  ksets are used to
    161 * define the attribute callbacks and other common events that happen to
    162 * a kobject.
    163 *
    164 * @list: the list of all kobjects for this kset
    165 * @list_lock: a lock for iterating over the kobjects
    166 * @kobj: the embedded kobject for this kset (recursion, isn't it fun...)
    167 * @uevent_ops: the set of uevent operations for this kset.  These are
    168 * called whenever a kobject has something happen to it so that the kset
    169 * can add new environment variables, or filter out the uevents if so
    170 * desired.
    171 */
    172struct kset {
    173	struct list_head list;
    174	spinlock_t list_lock;
    175	struct kobject kobj;
    176	const struct kset_uevent_ops *uevent_ops;
    177} __randomize_layout;
    178
    179extern void kset_init(struct kset *kset);
    180extern int __must_check kset_register(struct kset *kset);
    181extern void kset_unregister(struct kset *kset);
    182extern struct kset * __must_check kset_create_and_add(const char *name,
    183						const struct kset_uevent_ops *u,
    184						struct kobject *parent_kobj);
    185
    186static inline struct kset *to_kset(struct kobject *kobj)
    187{
    188	return kobj ? container_of(kobj, struct kset, kobj) : NULL;
    189}
    190
    191static inline struct kset *kset_get(struct kset *k)
    192{
    193	return k ? to_kset(kobject_get(&k->kobj)) : NULL;
    194}
    195
    196static inline void kset_put(struct kset *k)
    197{
    198	kobject_put(&k->kobj);
    199}
    200
    201static inline const struct kobj_type *get_ktype(struct kobject *kobj)
    202{
    203	return kobj->ktype;
    204}
    205
    206extern struct kobject *kset_find_obj(struct kset *, const char *);
    207
    208/* The global /sys/kernel/ kobject for people to chain off of */
    209extern struct kobject *kernel_kobj;
    210/* The global /sys/kernel/mm/ kobject for people to chain off of */
    211extern struct kobject *mm_kobj;
    212/* The global /sys/hypervisor/ kobject for people to chain off of */
    213extern struct kobject *hypervisor_kobj;
    214/* The global /sys/power/ kobject for people to chain off of */
    215extern struct kobject *power_kobj;
    216/* The global /sys/firmware/ kobject for people to chain off of */
    217extern struct kobject *firmware_kobj;
    218
    219int kobject_uevent(struct kobject *kobj, enum kobject_action action);
    220int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
    221			char *envp[]);
    222int kobject_synth_uevent(struct kobject *kobj, const char *buf, size_t count);
    223
    224__printf(2, 3)
    225int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...);
    226
    227#endif /* _KOBJECT_H_ */