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

debugfs.h (11485B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 *  debugfs.h - a tiny little debug file system
      4 *
      5 *  Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
      6 *  Copyright (C) 2004 IBM Inc.
      7 *
      8 *  debugfs is for people to use instead of /proc or /sys.
      9 *  See Documentation/filesystems/ for more details.
     10 */
     11
     12#ifndef _DEBUGFS_H_
     13#define _DEBUGFS_H_
     14
     15#include <linux/fs.h>
     16#include <linux/seq_file.h>
     17
     18#include <linux/types.h>
     19#include <linux/compiler.h>
     20
     21struct device;
     22struct file_operations;
     23
     24struct debugfs_blob_wrapper {
     25	void *data;
     26	unsigned long size;
     27};
     28
     29struct debugfs_reg32 {
     30	char *name;
     31	unsigned long offset;
     32};
     33
     34struct debugfs_regset32 {
     35	const struct debugfs_reg32 *regs;
     36	int nregs;
     37	void __iomem *base;
     38	struct device *dev;	/* Optional device for Runtime PM */
     39};
     40
     41struct debugfs_u32_array {
     42	u32 *array;
     43	u32 n_elements;
     44};
     45
     46extern struct dentry *arch_debugfs_dir;
     47
     48#define DEFINE_DEBUGFS_ATTRIBUTE(__fops, __get, __set, __fmt)		\
     49static int __fops ## _open(struct inode *inode, struct file *file)	\
     50{									\
     51	__simple_attr_check_format(__fmt, 0ull);			\
     52	return simple_attr_open(inode, file, __get, __set, __fmt);	\
     53}									\
     54static const struct file_operations __fops = {				\
     55	.owner	 = THIS_MODULE,						\
     56	.open	 = __fops ## _open,					\
     57	.release = simple_attr_release,					\
     58	.read	 = debugfs_attr_read,					\
     59	.write	 = debugfs_attr_write,					\
     60	.llseek  = no_llseek,						\
     61}
     62
     63typedef struct vfsmount *(*debugfs_automount_t)(struct dentry *, void *);
     64
     65#if defined(CONFIG_DEBUG_FS)
     66
     67struct dentry *debugfs_lookup(const char *name, struct dentry *parent);
     68
     69struct dentry *debugfs_create_file(const char *name, umode_t mode,
     70				   struct dentry *parent, void *data,
     71				   const struct file_operations *fops);
     72struct dentry *debugfs_create_file_unsafe(const char *name, umode_t mode,
     73				   struct dentry *parent, void *data,
     74				   const struct file_operations *fops);
     75
     76void debugfs_create_file_size(const char *name, umode_t mode,
     77			      struct dentry *parent, void *data,
     78			      const struct file_operations *fops,
     79			      loff_t file_size);
     80
     81struct dentry *debugfs_create_dir(const char *name, struct dentry *parent);
     82
     83struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
     84				      const char *dest);
     85
     86struct dentry *debugfs_create_automount(const char *name,
     87					struct dentry *parent,
     88					debugfs_automount_t f,
     89					void *data);
     90
     91void debugfs_remove(struct dentry *dentry);
     92#define debugfs_remove_recursive debugfs_remove
     93
     94const struct file_operations *debugfs_real_fops(const struct file *filp);
     95
     96int debugfs_file_get(struct dentry *dentry);
     97void debugfs_file_put(struct dentry *dentry);
     98
     99ssize_t debugfs_attr_read(struct file *file, char __user *buf,
    100			size_t len, loff_t *ppos);
    101ssize_t debugfs_attr_write(struct file *file, const char __user *buf,
    102			size_t len, loff_t *ppos);
    103
    104struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
    105                struct dentry *new_dir, const char *new_name);
    106
    107void debugfs_create_u8(const char *name, umode_t mode, struct dentry *parent,
    108		       u8 *value);
    109void debugfs_create_u16(const char *name, umode_t mode, struct dentry *parent,
    110			u16 *value);
    111void debugfs_create_u32(const char *name, umode_t mode, struct dentry *parent,
    112			u32 *value);
    113void debugfs_create_u64(const char *name, umode_t mode, struct dentry *parent,
    114			u64 *value);
    115void debugfs_create_ulong(const char *name, umode_t mode, struct dentry *parent,
    116			  unsigned long *value);
    117void debugfs_create_x8(const char *name, umode_t mode, struct dentry *parent,
    118		       u8 *value);
    119void debugfs_create_x16(const char *name, umode_t mode, struct dentry *parent,
    120			u16 *value);
    121void debugfs_create_x32(const char *name, umode_t mode, struct dentry *parent,
    122			u32 *value);
    123void debugfs_create_x64(const char *name, umode_t mode, struct dentry *parent,
    124			u64 *value);
    125void debugfs_create_size_t(const char *name, umode_t mode,
    126			   struct dentry *parent, size_t *value);
    127void debugfs_create_atomic_t(const char *name, umode_t mode,
    128			     struct dentry *parent, atomic_t *value);
    129void debugfs_create_bool(const char *name, umode_t mode, struct dentry *parent,
    130			 bool *value);
    131void debugfs_create_str(const char *name, umode_t mode,
    132			struct dentry *parent, char **value);
    133
    134struct dentry *debugfs_create_blob(const char *name, umode_t mode,
    135				  struct dentry *parent,
    136				  struct debugfs_blob_wrapper *blob);
    137
    138void debugfs_create_regset32(const char *name, umode_t mode,
    139			     struct dentry *parent,
    140			     struct debugfs_regset32 *regset);
    141
    142void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
    143			  int nregs, void __iomem *base, char *prefix);
    144
    145void debugfs_create_u32_array(const char *name, umode_t mode,
    146			      struct dentry *parent,
    147			      struct debugfs_u32_array *array);
    148
    149void debugfs_create_devm_seqfile(struct device *dev, const char *name,
    150				 struct dentry *parent,
    151				 int (*read_fn)(struct seq_file *s, void *data));
    152
    153bool debugfs_initialized(void);
    154
    155ssize_t debugfs_read_file_bool(struct file *file, char __user *user_buf,
    156			       size_t count, loff_t *ppos);
    157
    158ssize_t debugfs_write_file_bool(struct file *file, const char __user *user_buf,
    159				size_t count, loff_t *ppos);
    160
    161ssize_t debugfs_read_file_str(struct file *file, char __user *user_buf,
    162			      size_t count, loff_t *ppos);
    163
    164#else
    165
    166#include <linux/err.h>
    167
    168/*
    169 * We do not return NULL from these functions if CONFIG_DEBUG_FS is not enabled
    170 * so users have a chance to detect if there was a real error or not.  We don't
    171 * want to duplicate the design decision mistakes of procfs and devfs again.
    172 */
    173
    174static inline struct dentry *debugfs_lookup(const char *name,
    175					    struct dentry *parent)
    176{
    177	return ERR_PTR(-ENODEV);
    178}
    179
    180static inline struct dentry *debugfs_create_file(const char *name, umode_t mode,
    181					struct dentry *parent, void *data,
    182					const struct file_operations *fops)
    183{
    184	return ERR_PTR(-ENODEV);
    185}
    186
    187static inline struct dentry *debugfs_create_file_unsafe(const char *name,
    188					umode_t mode, struct dentry *parent,
    189					void *data,
    190					const struct file_operations *fops)
    191{
    192	return ERR_PTR(-ENODEV);
    193}
    194
    195static inline void debugfs_create_file_size(const char *name, umode_t mode,
    196					    struct dentry *parent, void *data,
    197					    const struct file_operations *fops,
    198					    loff_t file_size)
    199{ }
    200
    201static inline struct dentry *debugfs_create_dir(const char *name,
    202						struct dentry *parent)
    203{
    204	return ERR_PTR(-ENODEV);
    205}
    206
    207static inline struct dentry *debugfs_create_symlink(const char *name,
    208						    struct dentry *parent,
    209						    const char *dest)
    210{
    211	return ERR_PTR(-ENODEV);
    212}
    213
    214static inline struct dentry *debugfs_create_automount(const char *name,
    215					struct dentry *parent,
    216					debugfs_automount_t f,
    217					void *data)
    218{
    219	return ERR_PTR(-ENODEV);
    220}
    221
    222static inline void debugfs_remove(struct dentry *dentry)
    223{ }
    224
    225static inline void debugfs_remove_recursive(struct dentry *dentry)
    226{ }
    227
    228const struct file_operations *debugfs_real_fops(const struct file *filp);
    229
    230static inline int debugfs_file_get(struct dentry *dentry)
    231{
    232	return 0;
    233}
    234
    235static inline void debugfs_file_put(struct dentry *dentry)
    236{ }
    237
    238static inline ssize_t debugfs_attr_read(struct file *file, char __user *buf,
    239					size_t len, loff_t *ppos)
    240{
    241	return -ENODEV;
    242}
    243
    244static inline ssize_t debugfs_attr_write(struct file *file,
    245					const char __user *buf,
    246					size_t len, loff_t *ppos)
    247{
    248	return -ENODEV;
    249}
    250
    251static inline struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
    252                struct dentry *new_dir, char *new_name)
    253{
    254	return ERR_PTR(-ENODEV);
    255}
    256
    257static inline void debugfs_create_u8(const char *name, umode_t mode,
    258				     struct dentry *parent, u8 *value) { }
    259
    260static inline void debugfs_create_u16(const char *name, umode_t mode,
    261				      struct dentry *parent, u16 *value) { }
    262
    263static inline void debugfs_create_u32(const char *name, umode_t mode,
    264				      struct dentry *parent, u32 *value) { }
    265
    266static inline void debugfs_create_u64(const char *name, umode_t mode,
    267				      struct dentry *parent, u64 *value) { }
    268
    269static inline void debugfs_create_ulong(const char *name, umode_t mode,
    270					struct dentry *parent,
    271					unsigned long *value) { }
    272
    273static inline void debugfs_create_x8(const char *name, umode_t mode,
    274				     struct dentry *parent, u8 *value) { }
    275
    276static inline void debugfs_create_x16(const char *name, umode_t mode,
    277				      struct dentry *parent, u16 *value) { }
    278
    279static inline void debugfs_create_x32(const char *name, umode_t mode,
    280				      struct dentry *parent, u32 *value) { }
    281
    282static inline void debugfs_create_x64(const char *name, umode_t mode,
    283				      struct dentry *parent, u64 *value) { }
    284
    285static inline void debugfs_create_size_t(const char *name, umode_t mode,
    286					 struct dentry *parent, size_t *value)
    287{ }
    288
    289static inline void debugfs_create_atomic_t(const char *name, umode_t mode,
    290					   struct dentry *parent,
    291					   atomic_t *value)
    292{ }
    293
    294static inline void debugfs_create_bool(const char *name, umode_t mode,
    295				       struct dentry *parent, bool *value) { }
    296
    297static inline void debugfs_create_str(const char *name, umode_t mode,
    298				      struct dentry *parent,
    299				      char **value)
    300{ }
    301
    302static inline struct dentry *debugfs_create_blob(const char *name, umode_t mode,
    303				  struct dentry *parent,
    304				  struct debugfs_blob_wrapper *blob)
    305{
    306	return ERR_PTR(-ENODEV);
    307}
    308
    309static inline void debugfs_create_regset32(const char *name, umode_t mode,
    310					   struct dentry *parent,
    311					   struct debugfs_regset32 *regset)
    312{
    313}
    314
    315static inline void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
    316			 int nregs, void __iomem *base, char *prefix)
    317{
    318}
    319
    320static inline bool debugfs_initialized(void)
    321{
    322	return false;
    323}
    324
    325static inline void debugfs_create_u32_array(const char *name, umode_t mode,
    326					    struct dentry *parent,
    327					    struct debugfs_u32_array *array)
    328{
    329}
    330
    331static inline void debugfs_create_devm_seqfile(struct device *dev,
    332					       const char *name,
    333					       struct dentry *parent,
    334					       int (*read_fn)(struct seq_file *s,
    335							      void *data))
    336{
    337}
    338
    339static inline ssize_t debugfs_read_file_bool(struct file *file,
    340					     char __user *user_buf,
    341					     size_t count, loff_t *ppos)
    342{
    343	return -ENODEV;
    344}
    345
    346static inline ssize_t debugfs_write_file_bool(struct file *file,
    347					      const char __user *user_buf,
    348					      size_t count, loff_t *ppos)
    349{
    350	return -ENODEV;
    351}
    352
    353static inline ssize_t debugfs_read_file_str(struct file *file,
    354					    char __user *user_buf,
    355					    size_t count, loff_t *ppos)
    356{
    357	return -ENODEV;
    358}
    359
    360#endif
    361
    362/**
    363 * debugfs_create_xul - create a debugfs file that is used to read and write an
    364 * unsigned long value, formatted in hexadecimal
    365 * @name: a pointer to a string containing the name of the file to create.
    366 * @mode: the permission that the file should have
    367 * @parent: a pointer to the parent dentry for this file.  This should be a
    368 *          directory dentry if set.  If this parameter is %NULL, then the
    369 *          file will be created in the root of the debugfs filesystem.
    370 * @value: a pointer to the variable that the file should read to and write
    371 *         from.
    372 */
    373static inline void debugfs_create_xul(const char *name, umode_t mode,
    374				      struct dentry *parent,
    375				      unsigned long *value)
    376{
    377	if (sizeof(*value) == sizeof(u32))
    378		debugfs_create_x32(name, mode, parent, (u32 *)value);
    379	else
    380		debugfs_create_x64(name, mode, parent, (u64 *)value);
    381}
    382
    383#endif